diff --git a/go/internal/database/datastore/affected_versions.go b/go/internal/database/datastore/affected_versions.go index f5797837e13..9c90eb75ae2 100644 --- a/go/internal/database/datastore/affected_versions.go +++ b/go/internal/database/datastore/affected_versions.go @@ -5,6 +5,7 @@ import ( "slices" "strings" + "github.com/google/osv.dev/go/internal/osvutil" "github.com/google/osv.dev/go/osv/ecosystem" "github.com/ossf/osv-schema/bindings/go/osvschema" ) @@ -73,52 +74,21 @@ func computeAffectedVersions(vuln *osvschema.Vulnerability) []AffectedVersions { } hasAffected = true - var rangeEvents []AffectedEvent + var events []osvutil.Event for _, e := range r.GetEvents() { - if e.GetIntroduced() != "" { - rangeEvents = append(rangeEvents, AffectedEvent{Type: "introduced", Value: e.GetIntroduced()}) - } else if e.GetFixed() != "" { - rangeEvents = append(rangeEvents, AffectedEvent{Type: "fixed", Value: e.GetFixed()}) - } else if e.GetLimit() != "" { - rangeEvents = append(rangeEvents, AffectedEvent{Type: "limit", Value: e.GetLimit()}) - } else if e.GetLastAffected() != "" { - rangeEvents = append(rangeEvents, AffectedEvent{Type: "last_affected", Value: e.GetLastAffected()}) + evt := osvutil.FromSchemaEvent(e) + if evt.Version != "" { + events = append(events, evt) } } - var eventsMap = map[string]int{ - "introduced": 0, - "last_affected": 1, - "fixed": 2, - "limit": 3, - } - if exists { - // If we have an ecosystem helper, sort the events to help with querying. - slices.SortFunc(rangeEvents, func(a, b AffectedEvent) int { - pa, errA := eHelper.Parse(a.Value) - pb, errB := eHelper.Parse(b.Value) - if errA != nil || errB != nil { - if a.Value != b.Value { - return strings.Compare(a.Value, b.Value) - } - - return eventsMap[a.Type] - eventsMap[b.Type] - } - res, errC := pa.Compare(pb) - if errC != nil { - if a.Value != b.Value { - return strings.Compare(a.Value, b.Value) - } - - return eventsMap[a.Type] - eventsMap[b.Type] - } - if res != 0 { - return res - } + _ = osvutil.SortEvents(eHelper, events) + } - return eventsMap[a.Type] - eventsMap[b.Type] - }) + var rangeEvents []AffectedEvent + for _, e := range events { + rangeEvents = append(rangeEvents, AffectedEvent{Type: e.Type.String(), Value: e.Version}) } coarseMin := minCoarseVersion diff --git a/go/internal/database/datastore/relations.go b/go/internal/database/datastore/relations.go new file mode 100644 index 00000000000..5a2593fe82f --- /dev/null +++ b/go/internal/database/datastore/relations.go @@ -0,0 +1,87 @@ +package datastore + +import ( + "context" + "errors" + "fmt" + "slices" + + "cloud.google.com/go/datastore" + "github.com/google/osv.dev/go/internal/models" +) + +type RelationsStore struct { + client *datastore.Client +} + +var _ models.RelationsStore = (*RelationsStore)(nil) + +func NewRelationsStore(client *datastore.Client) *RelationsStore { + return &RelationsStore{client: client} +} + +func (s *RelationsStore) GetAliases(ctx context.Context, id string) (*models.GetAliasResult, error) { + var aliasGroups []AliasGroup + q := datastore.NewQuery("AliasGroup").FilterField("bug_ids", "=", id) + _, err := s.client.GetAll(ctx, q, &aliasGroups) + if err != nil { + return nil, fmt.Errorf("failed to get alias group: %w", err) + } + if len(aliasGroups) == 0 { + return nil, models.ErrNotFound + } + if len(aliasGroups) > 1 { + return nil, errors.New("id belongs to multiple aliases") + } + aliasGroup := aliasGroups[0] + aliases := make([]string, 0, len(aliasGroup.VulnIDs)-1) + for _, vulnID := range aliasGroup.VulnIDs { + if vulnID != id { + aliases = append(aliases, vulnID) + } + } + slices.Sort(aliases) + + return &models.GetAliasResult{ + Aliases: aliases, + Modified: aliasGroup.Modified, + }, nil +} + +func (s *RelationsStore) GetRelated(ctx context.Context, id string) (*models.GetRelatedResult, error) { + var relatedGroup RelatedGroup + err := s.client.Get(ctx, datastore.NameKey("RelatedGroup", id, nil), &relatedGroup) + if errors.Is(err, datastore.ErrNoSuchEntity) { + return nil, models.ErrNotFound + } + if err != nil { + return nil, fmt.Errorf("failed to get related group: %w", err) + } + related := make([]string, len(relatedGroup.RelatedIDs)) + copy(related, relatedGroup.RelatedIDs) + slices.Sort(related) + + return &models.GetRelatedResult{ + Related: related, + Modified: relatedGroup.Modified, + }, nil +} + +func (s *RelationsStore) GetUpstream(ctx context.Context, id string) (*models.GetUpstreamResult, error) { + var upstreamGroup UpstreamGroup + err := s.client.Get(ctx, datastore.NameKey("UpstreamGroup", id, nil), &upstreamGroup) + if errors.Is(err, datastore.ErrNoSuchEntity) { + return nil, models.ErrNotFound + } + if err != nil { + return nil, fmt.Errorf("failed to get upstream group: %w", err) + } + upstream := make([]string, len(upstreamGroup.UpstreamIDs)) + copy(upstream, upstreamGroup.UpstreamIDs) + slices.Sort(upstream) + + return &models.GetUpstreamResult{ + Upstream: upstream, + Modified: upstreamGroup.Modified, + }, nil +} diff --git a/go/internal/database/datastore/relations_test.go b/go/internal/database/datastore/relations_test.go new file mode 100644 index 00000000000..3a00b3424fc --- /dev/null +++ b/go/internal/database/datastore/relations_test.go @@ -0,0 +1,245 @@ +package datastore + +import ( + "context" + "errors" + "testing" + "time" + + "cloud.google.com/go/datastore" + "github.com/google/go-cmp/cmp" + "github.com/google/osv.dev/go/internal/models" + "github.com/google/osv.dev/go/testutils" +) + +func TestRelationsStore_GetAliases(t *testing.T) { + ctx := context.Background() + dsClient := testutils.MustNewDatastoreClientForTesting(t) + store := NewRelationsStore(dsClient) + + now := time.Now().Truncate(time.Second) // Datastore may truncate fractional seconds + + aliasGroups := []AliasGroup{ + { + VulnIDs: []string{"VULN-A", "VULN-B", "VULN-C"}, + Modified: now, + }, + { + VulnIDs: []string{"VULN-D", "VULN-E"}, + Modified: now, + }, + } + + keys := []*datastore.Key{ + datastore.IncompleteKey("AliasGroup", nil), + datastore.IncompleteKey("AliasGroup", nil), + } + + if _, err := dsClient.PutMulti(ctx, keys, aliasGroups); err != nil { + t.Fatalf("Failed to setup test data: %v", err) + } + + tests := []struct { + name string + id string + wantAliases []string + wantErr error + }{ + { + name: "Find aliases for VULN-A", + id: "VULN-A", + wantAliases: []string{"VULN-B", "VULN-C"}, + wantErr: nil, + }, + { + name: "Find aliases for VULN-B", + id: "VULN-B", + wantAliases: []string{"VULN-A", "VULN-C"}, + wantErr: nil, + }, + { + name: "Find aliases for VULN-D", + id: "VULN-D", + wantAliases: []string{"VULN-E"}, + wantErr: nil, + }, + { + name: "Not found", + id: "VULN-UNKNOWN", + wantAliases: nil, + wantErr: models.ErrNotFound, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + res, err := store.GetAliases(ctx, tt.id) + if !errors.Is(err, tt.wantErr) { + t.Fatalf("GetAliases() error = %v, wantErr %v", err, tt.wantErr) + } + if tt.wantErr != nil { + return + } + + if diff := cmp.Diff(tt.wantAliases, res.Aliases); diff != "" { + t.Errorf("GetAliases() aliases mismatch (-want +got):\n%s", diff) + } + + if !res.Modified.Equal(now) { + t.Errorf("GetAliases() modified mismatch, got %v, want %v", res.Modified, now) + } + }) + } +} + +func TestRelationsStore_GetAliases_MultipleGroups(t *testing.T) { + ctx := context.Background() + dsClient := testutils.MustNewDatastoreClientForTesting(t) + store := NewRelationsStore(dsClient) + + now := time.Now() + + // VULN-A belongs to two groups (invalid state) + aliasGroups := []AliasGroup{ + { + VulnIDs: []string{"VULN-A", "VULN-B"}, + Modified: now, + }, + { + VulnIDs: []string{"VULN-A", "VULN-C"}, + Modified: now, + }, + } + + keys := []*datastore.Key{ + datastore.IncompleteKey("AliasGroup", nil), + datastore.IncompleteKey("AliasGroup", nil), + } + + if _, err := dsClient.PutMulti(ctx, keys, aliasGroups); err != nil { + t.Fatalf("Failed to setup test data: %v", err) + } + + _, err := store.GetAliases(ctx, "VULN-A") + if err == nil || err.Error() != "id belongs to multiple aliases" { + t.Errorf("Expected 'id belongs to multiple aliases' error, got %v", err) + } +} + +func TestRelationsStore_GetRelated(t *testing.T) { + ctx := context.Background() + dsClient := testutils.MustNewDatastoreClientForTesting(t) + store := NewRelationsStore(dsClient) + + now := time.Now().Truncate(time.Second) + + relatedGroup := RelatedGroup{ + RelatedIDs: []string{"RELATED-1", "RELATED-2"}, + Modified: now, + } + + key := datastore.NameKey("RelatedGroup", "VULN-A", nil) + + if _, err := dsClient.Put(ctx, key, &relatedGroup); err != nil { + t.Fatalf("Failed to setup test data: %v", err) + } + + tests := []struct { + name string + id string + wantRelated []string + wantErr error + }{ + { + name: "Found", + id: "VULN-A", + wantRelated: []string{"RELATED-1", "RELATED-2"}, + wantErr: nil, + }, + { + name: "Not found", + id: "VULN-UNKNOWN", + wantRelated: nil, + wantErr: models.ErrNotFound, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + res, err := store.GetRelated(ctx, tt.id) + if !errors.Is(err, tt.wantErr) { + t.Fatalf("GetRelated() error = %v, wantErr %v", err, tt.wantErr) + } + if tt.wantErr != nil { + return + } + + if diff := cmp.Diff(tt.wantRelated, res.Related); diff != "" { + t.Errorf("GetRelated() related mismatch (-want +got):\n%s", diff) + } + + if !res.Modified.Equal(now) { + t.Errorf("GetRelated() modified mismatch, got %v, want %v", res.Modified, now) + } + }) + } +} + +func TestRelationsStore_GetUpstream(t *testing.T) { + ctx := context.Background() + dsClient := testutils.MustNewDatastoreClientForTesting(t) + store := NewRelationsStore(dsClient) + + now := time.Now().Truncate(time.Second) + + upstreamGroup := UpstreamGroup{ + UpstreamIDs: []string{"UPSTREAM-1", "UPSTREAM-2"}, + Modified: now, + } + + key := datastore.NameKey("UpstreamGroup", "VULN-A", nil) + + if _, err := dsClient.Put(ctx, key, &upstreamGroup); err != nil { + t.Fatalf("Failed to setup test data: %v", err) + } + + tests := []struct { + name string + id string + wantUpstream []string + wantErr error + }{ + { + name: "Found", + id: "VULN-A", + wantUpstream: []string{"UPSTREAM-1", "UPSTREAM-2"}, + wantErr: nil, + }, + { + name: "Not found", + id: "VULN-UNKNOWN", + wantUpstream: nil, + wantErr: models.ErrNotFound, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + res, err := store.GetUpstream(ctx, tt.id) + if !errors.Is(err, tt.wantErr) { + t.Fatalf("GetUpstream() error = %v, wantErr %v", err, tt.wantErr) + } + if tt.wantErr != nil { + return + } + + if diff := cmp.Diff(tt.wantUpstream, res.Upstream); diff != "" { + t.Errorf("GetUpstream() upstream mismatch (-want +got):\n%s", diff) + } + + if !res.Modified.Equal(now) { + t.Errorf("GetUpstream() modified mismatch, got %v, want %v", res.Modified, now) + } + }) + } +} diff --git a/go/internal/importer/importer.go b/go/internal/importer/importer.go index f1942904435..8acfe14da96 100644 --- a/go/internal/importer/importer.go +++ b/go/internal/importer/importer.go @@ -18,6 +18,7 @@ import ( "cloud.google.com/go/pubsub/v2" "github.com/google/osv.dev/go/internal/models" + "github.com/google/osv.dev/go/internal/osvutil/schema" "github.com/google/osv.dev/go/logger" "github.com/google/osv.dev/go/osv/clients" "github.com/hashicorp/go-retryablehttp" @@ -536,7 +537,7 @@ func processUpdate(ctx context.Context, config Config, item WorkItem) { } if strict { - if err := Validate(data); err != nil { + if err := schema.Validate(data); err != nil { logger.ErrorContext(ctx, "JSON schema validation failed", slog.Any("error", err), slog.String("source", sourceRepoName), diff --git a/go/internal/importer/schema.go b/go/internal/importer/schema.go deleted file mode 100644 index 429261026b1..00000000000 --- a/go/internal/importer/schema.go +++ /dev/null @@ -1,36 +0,0 @@ -package importer - -import ( - _ "embed" - "fmt" - - "github.com/xeipuuv/gojsonschema" -) - -// Please run 'go generate ./...' to sync schema.json from the submodule. -//go:generate cp ../../../osv/osv-schema/validation/schema.json schema_generated.json - -//go:embed schema_generated.json -var schemaBytes []byte - -// Validate checks the given data against the OSV JSON schema. -func Validate(data []byte) error { - schemaLoader := gojsonschema.NewBytesLoader(schemaBytes) - documentLoader := gojsonschema.NewBytesLoader(data) - - result, err := gojsonschema.Validate(schemaLoader, documentLoader) - if err != nil { - return fmt.Errorf("failed to run schema validation: %w", err) - } - - if !result.Valid() { - var errs string - for _, desc := range result.Errors() { - errs += fmt.Sprintf("- %s\n", desc) - } - - return fmt.Errorf("schema validation failed:\n%s", errs) - } - - return nil -} diff --git a/go/internal/models/relations.go b/go/internal/models/relations.go new file mode 100644 index 00000000000..9a0c2eaa293 --- /dev/null +++ b/go/internal/models/relations.go @@ -0,0 +1,34 @@ +// Package models contains the domain types for the OSV database. +package models + +import ( + "context" + "time" +) + +type GetAliasResult struct { + Aliases []string + Modified time.Time +} + +type GetRelatedResult struct { + Related []string + Modified time.Time +} + +type GetUpstreamResult struct { + Upstream []string + Modified time.Time +} + +type RelationsStore interface { + // GetAliases retrieves the computed aliases for a vulnerability. + // Returns ErrNotFound if no aliased vulnerabilities are known. + GetAliases(ctx context.Context, id string) (*GetAliasResult, error) + // GetRelated retrieves the computed related vulnerabilities for a vulnerability. + // Returns ErrNotFound if no related vulnerabilities are known. + GetRelated(ctx context.Context, id string) (*GetRelatedResult, error) + // GetUpstream retrieves the computed upstream vulnerabilities for a vulnerability. + // Returns ErrNotFound if no upstream vulnerabilities are known. + GetUpstream(ctx context.Context, id string) (*GetUpstreamResult, error) +} diff --git a/go/internal/osvutil/event.go b/go/internal/osvutil/event.go new file mode 100644 index 00000000000..8517d831b9d --- /dev/null +++ b/go/internal/osvutil/event.go @@ -0,0 +1,98 @@ +// Package osvutil provides utilities for working with OSV data and schema structures. +package osvutil + +import ( + "slices" + "strings" + + "github.com/google/osv.dev/go/osv/ecosystem" + "github.com/ossf/osv-schema/bindings/go/osvschema" +) + +type EventType int + +const ( + Introduced EventType = iota + LastAffected + Fixed + Limit +) + +func (e EventType) String() string { + switch e { + case Introduced: + return "introduced" + case LastAffected: + return "last_affected" + case Fixed: + return "fixed" + case Limit: + return "limit" + } + + return "" +} + +type Event struct { + Type EventType + Version string +} + +// FromSchemaEvent consolidates the schema-to-internal conversion. +func FromSchemaEvent(e *osvschema.Event) Event { + switch { + case e.GetIntroduced() != "": + return Event{Type: Introduced, Version: e.GetIntroduced()} + case e.GetLastAffected() != "": + return Event{Type: LastAffected, Version: e.GetLastAffected()} + case e.GetFixed() != "": + return Event{Type: Fixed, Version: e.GetFixed()} + case e.GetLimit() != "": + return Event{Type: Limit, Version: e.GetLimit()} + } + + return Event{} +} + +// SortEvents sorts a slice of Events chronologically using the Ecosystem's parse/compare rules. +func SortEvents(e ecosystem.Ecosystem, events []Event) error { + var sortErr error + + slices.SortFunc(events, func(a, b Event) int { + pa, errA := e.Parse(a.Version) + pb, errB := e.Parse(b.Version) + + // Fallback to string comparison if unparsable + if errA != nil || errB != nil { + if errA != nil { + sortErr = errA + } else { + sortErr = errB + } + if a.Version != b.Version { + return strings.Compare(a.Version, b.Version) + } + + return int(a.Type - b.Type) + } + + res, errC := pa.Compare(pb) + if errC != nil { + sortErr = errC // Track that an ecosystem comparison failed + if a.Version != b.Version { + return strings.Compare(a.Version, b.Version) + } + + return int(a.Type - b.Type) + } + + if res != 0 { + return res + } + + // If versions are identical, sort by event type (introduced -> last_affected -> fixed -> limit) + return int(a.Type - b.Type) + }) + + return sortErr +} diff --git a/go/internal/osvutil/event_test.go b/go/internal/osvutil/event_test.go new file mode 100644 index 00000000000..88b14413893 --- /dev/null +++ b/go/internal/osvutil/event_test.go @@ -0,0 +1,102 @@ +package osvutil + +import ( + "errors" + "testing" + + "github.com/google/osv.dev/go/osv/ecosystem" +) + +type mockEcosystem struct { + parseFunc func(version string) (ecosystem.Version, error) +} + +func (m mockEcosystem) Parse(version string) (ecosystem.Version, error) { + if m.parseFunc != nil { + return m.parseFunc(version) + } + + return nil, errors.New("parse error") +} + +func (m mockEcosystem) Coarse(_ string) (string, error) { + return "", nil +} + +func (m mockEcosystem) IsSemver() bool { + return false +} + +type mockVersion struct { + v int +} + +func (m mockVersion) Compare(other ecosystem.Version) (int, error) { + ov, ok := other.(mockVersion) + if !ok { + return 0, errors.New("incompatible types") + } + if m.v < ov.v { + return -1, nil + } + if m.v > ov.v { + return 1, nil + } + + return 0, nil +} + +func TestSortEvents_ParseError(t *testing.T) { + eco := mockEcosystem{ + parseFunc: func(version string) (ecosystem.Version, error) { + if version == "invalid" { + return nil, errors.New("invalid version") + } + + return mockVersion{v: 1}, nil + }, + } + + events := []Event{ + {Type: Introduced, Version: "1.0"}, + {Type: Fixed, Version: "invalid"}, + } + + err := SortEvents(eco, events) + if err == nil { + t.Errorf("Expected error when parsing fails, got nil") + } + + if err != nil && err.Error() != "invalid version" { + t.Errorf("Expected error 'invalid version', got '%v'", err) + } +} + +func TestSortEvents_Success(t *testing.T) { + eco := mockEcosystem{ + parseFunc: func(version string) (ecosystem.Version, error) { + if version == "1.0" { + return mockVersion{v: 1}, nil + } + if version == "2.0" { + return mockVersion{v: 2}, nil + } + + return nil, errors.New("unknown version") + }, + } + + events := []Event{ + {Type: Fixed, Version: "2.0"}, + {Type: Introduced, Version: "1.0"}, + } + + err := SortEvents(eco, events) + if err != nil { + t.Fatalf("Expected no error, got %v", err) + } + + if events[0].Version != "1.0" || events[1].Version != "2.0" { + t.Errorf("Events not sorted correctly: %v", events) + } +} diff --git a/go/internal/osvutil/schema/schema.go b/go/internal/osvutil/schema/schema.go new file mode 100644 index 00000000000..de02470c602 --- /dev/null +++ b/go/internal/osvutil/schema/schema.go @@ -0,0 +1,71 @@ +// Package schema provides utilities for validating OSV records against the JSON schema +// and checking for known ecosystems defined in the schema. +package schema + +import ( + _ "embed" + "encoding/json" + "fmt" + "strings" + + "github.com/ossf/osv-schema/bindings/go/osvconstants" + "github.com/xeipuuv/gojsonschema" +) + +// Run 'go generate ./...' to sync schema.json from the submodule. +//go:generate cp ../../../../osv/osv-schema/validation/schema.json schema_generated.json + +//go:embed schema_generated.json +var schemaBytes []byte + +var validEcosystems = populateValidEcosystems() + +func populateValidEcosystems() map[osvconstants.Ecosystem]struct{} { + var s struct { + Defs struct { + EcosystemName struct { + Enum []string `json:"enum"` + } `json:"ecosystemName"` + } `json:"$defs"` + } + if err := json.Unmarshal(schemaBytes, &s); err != nil { + panic("failed to parse embedded schema: " + err.Error()) + } + m := make(map[osvconstants.Ecosystem]struct{}) + for _, e := range s.Defs.EcosystemName.Enum { + m[osvconstants.Ecosystem(e)] = struct{}{} + } + + return m +} + +// IsKnownEcosystem returns true if the ecosystem is defined in the OSV schema. +// It handles ecosystem suffixes (e.g. "Debian:11" -> "Debian"). +func IsKnownEcosystem(ecosystem string) bool { + base, _, _ := strings.Cut(ecosystem, ":") + _, ok := validEcosystems[osvconstants.Ecosystem(base)] + + return ok +} + +// Validate checks the given data against the OSV JSON schema. +func Validate(data []byte) error { + schemaLoader := gojsonschema.NewBytesLoader(schemaBytes) + documentLoader := gojsonschema.NewBytesLoader(data) + + result, err := gojsonschema.Validate(schemaLoader, documentLoader) + if err != nil { + return fmt.Errorf("failed to run schema validation: %w", err) + } + + if !result.Valid() { + var errs string + for _, desc := range result.Errors() { + errs += fmt.Sprintf("- %s\n", desc) + } + + return fmt.Errorf("schema validation failed:\n%s", errs) + } + + return nil +} diff --git a/go/internal/importer/schema_generated.json b/go/internal/osvutil/schema/schema_generated.json similarity index 81% rename from go/internal/importer/schema_generated.json rename to go/internal/osvutil/schema/schema_generated.json index 3b6bd182203..cf123dd7ead 100644 --- a/go/internal/importer/schema_generated.json +++ b/go/internal/osvutil/schema/schema_generated.json @@ -174,6 +174,74 @@ ] } }, + { + "title": "GIT ranges must use full-length commit hashes", + "if": { + "properties": { + "type": { + "const": "GIT" + } + } + }, + "then": { + "properties": { + "events": { + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "introduced": { + "type": "string", + "pattern": "^(0|[a-f0-9]{40}|[a-f0-9]{64})$" + } + }, + "required": [ + "introduced" + ] + }, + { + "type": "object", + "properties": { + "fixed": { + "type": "string", + "pattern": "^(0|[a-f0-9]{40}|[a-f0-9]{64})$" + } + }, + "required": [ + "fixed" + ] + }, + { + "type": "object", + "properties": { + "last_affected": { + "type": "string", + "pattern": "^(0|[a-f0-9]{40}|[a-f0-9]{64})$" + } + }, + "required": [ + "last_affected" + ] + }, + { + "type": "object", + "properties": { + "limit": { + "type": "string", + "pattern": "^(0|[a-f0-9]{40}|[a-f0-9]{64})$" + } + }, + "required": [ + "limit" + ] + } + ] + } + } + } + } + }, { "title": "last_affected and fixed events are mutually exclusive", "if": { @@ -373,6 +441,7 @@ "RubyGems", "SUSE", "SwiftURL", + "TuxCare", "Ubuntu", "VSCode", "Wolfi" @@ -386,13 +455,13 @@ "type": "string", "title": "Currently supported ecosystems", "description": "These ecosystems are also documented at https://ossf.github.io/osv-schema/#affectedpackage-field", - "pattern": "^(AlmaLinux|Alpaquita|Alpine|Android|Azure Linux|BellSoft Hardened Containers|Bioconductor|Bitnami|Chainguard|CleanStart|ConanCenter|CRAN|crates\\.io|Debian|Docker Hardened Images|Echo|FreeBSD|GHC|GitHub Actions|Go|Hackage|Hex|Julia|Kubernetes|Linux|Mageia|Maven|MinimOS|npm|NuGet|opam|openEuler|openSUSE|OSS-Fuzz|Packagist|Photon OS|Pub|PyPI|Red Hat|Rocky Linux|Root|RubyGems|SUSE|SwiftURL|Ubuntu|VSCode|Wolfi|GIT)(:.+)?$" + "pattern": "^(AlmaLinux|Alpaquita|Alpine|Android|Azure Linux|BellSoft Hardened Containers|Bioconductor|Bitnami|Chainguard|CleanStart|ConanCenter|CRAN|crates\\.io|Debian|Docker Hardened Images|Echo|FreeBSD|GHC|GitHub Actions|Go|Hackage|Hex|Julia|Kubernetes|Linux|Mageia|Maven|MinimOS|npm|NuGet|opam|openEuler|openSUSE|OSS-Fuzz|Packagist|Photon OS|Pub|PyPI|Red Hat|Rocky Linux|Root|RubyGems|SUSE|SwiftURL|TuxCare|Ubuntu|VSCode|Wolfi|GIT)(:.+)?$" }, "prefix": { "type": "string", "title": "Currently supported home database identifier prefixes", "description": "These home databases are also documented at https://ossf.github.io/osv-schema/#id-modified-fields", - "pattern": "^(x_|(ASB-A|PUB-A|ALPINE|ALSA|ALBA|ALEA|AZL|BELL|BIT|CGA|CLEANSTART|CURL|CVE|DEBIAN|DHI|DRUPAL|DSA|DLA|ELA|DTSA|ECHO|EEF|FreeBSD|GHSA|GO|GSD|HSEC|JLSEC|KUBE|LBSEC|LSN|MAL|MINI|MGASA|OESA|OSEC|OSV|openSUSE-SU|PHSA|PSF|PYSEC|RHBA|RHEA|RHSA|RLSA|RXSA|RSEC|ROOT|RUSTSEC|SUSE-[SRFO]U|UBUNTU|USN|V8)-)" + "pattern": "^(x_|(ASB-A|PUB-A|ALPINE|ALSA|ALBA|ALEA|AZL|BELL|BIT|CGA|CLEANSTART|CLSA|CURL|CVE|DEBIAN|DHI|DRUPAL|DSA|DLA|ELA|DTSA|ECHO|EEF|FreeBSD|GHSA|GO|GSD|HSEC|JLSEC|KUBE|LBSEC|LSN|MAL|MINI|MGASA|OESA|OSEC|OSV|openSUSE-SU|PHSA|PSF|PYSEC|RHBA|RHEA|RHSA|RLSA|RXSA|RSEC|ROOT|RUSTSEC|SUSE-[SRFO]U|UBUNTU|USN|V8)-)" }, "severity": { "type": [ diff --git a/go/internal/worker/engine.go b/go/internal/worker/engine.go index 53427fe5356..bc2d5b75a29 100644 --- a/go/internal/worker/engine.go +++ b/go/internal/worker/engine.go @@ -15,6 +15,7 @@ import ( "github.com/google/osv.dev/go/internal/models" "github.com/google/osv.dev/go/internal/worker/pipeline" "github.com/google/osv.dev/go/logger" + "github.com/google/osv.dev/go/osv/ecosystem" "github.com/ossf/osv-schema/bindings/go/osvschema" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" @@ -26,9 +27,10 @@ type Engine struct { Stores Stores Pipeline []pipeline.Enricher - GitterHost string - GitterClient *http.Client - NotifyPyPI bool + GitterHost string + GitterClient *http.Client + NotifyPyPI bool + EcosystemProvider *ecosystem.Provider } func (e *Engine) RunTask(ctx context.Context, task Task) error { @@ -44,7 +46,9 @@ func (e *Engine) RunTask(ctx context.Context, task Task) error { func (e *Engine) handleUpdate(ctx context.Context, task Task) error { params := pipeline.EnrichParams{ - PathInSource: task.PathInSource, + PathInSource: task.PathInSource, + EcosystemProvider: e.EcosystemProvider, + RelationsStore: e.Stores.Relations, } var err error params.SourceRepo, err = e.Stores.SourceRepo.Get(ctx, task.SourceID) @@ -55,6 +59,16 @@ func (e *Engine) handleUpdate(ctx context.Context, task Task) error { return errors.New("vuln not provided") } + // Get the current state of the vuln to check against + current, err := e.Stores.Vulnerability.Get(ctx, task.Vuln.GetId()) + if err == nil { + params.ExistingVuln = current + } else if !errors.Is(err, models.ErrNotFound) { + logger.ErrorContext(ctx, "Failed to get current vuln state", slog.String("vuln_id", task.Vuln.GetId()), slog.Any("error", err)) + + return fmt.Errorf("failed to get current vuln state: %w", err) + } + enriched := proto.Clone(task.Vuln).(*osvschema.Vulnerability) for _, enricher := range e.Pipeline { if err := enricher.Enrich(ctx, enriched, ¶ms); err != nil { @@ -75,22 +89,17 @@ func (e *Engine) handleUpdate(ctx context.Context, task Task) error { return err } - // Get the current state of the vuln to check against - current, err := e.Stores.Vulnerability.Get(ctx, enriched.GetId()) - isNotFound := errors.Is(err, models.ErrNotFound) - - if err != nil && !isNotFound { - logger.ErrorContext(ctx, "Failed to get current vuln state", slog.String("vuln_id", enriched.GetId()), slog.Any("error", err)) - - return fmt.Errorf("failed to get current vuln state: %w", err) - } - - if isNotFound || e.isSemanticallyDifferent(current, enriched) { + if params.ExistingVuln == nil || e.isSemanticallyDifferent(current, enriched) { enriched.Modified = timestamppb.Now() } else if current.GetModified().AsTime().After(enriched.GetModified().AsTime()) { enriched.Modified = current.GetModified() } + // Ensure Modified is at least as new as Withdrawn + if enriched.GetWithdrawn() != nil && enriched.GetWithdrawn().AsTime().After(enriched.GetModified().AsTime()) { + enriched.Modified = enriched.GetWithdrawn() + } + if err := e.Stores.Vulnerability.Write(ctx, models.WriteRequest{ ID: enriched.GetId(), Source: task.SourceID, diff --git a/go/internal/worker/engine_test.go b/go/internal/worker/engine_test.go new file mode 100644 index 00000000000..4da91e579bc --- /dev/null +++ b/go/internal/worker/engine_test.go @@ -0,0 +1,231 @@ +package worker + +import ( + "context" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + gitterpb "github.com/google/osv.dev/go/internal/gitter/pb/repository" + "github.com/google/osv.dev/go/internal/models" + "github.com/google/osv.dev/go/internal/worker/pipeline/registry" + "github.com/ossf/osv-schema/bindings/go/osvconstants" + "github.com/ossf/osv-schema/bindings/go/osvschema" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/testing/protocmp" + "google.golang.org/protobuf/types/known/structpb" + "google.golang.org/protobuf/types/known/timestamppb" + "k8s.io/apimachinery/pkg/util/yaml" +) + +type mockRelationsStore struct{} + +func (m mockRelationsStore) GetAliases(_ context.Context, _ string) (*models.GetAliasResult, error) { + return nil, models.ErrNotFound +} + +func (m mockRelationsStore) GetRelated(_ context.Context, _ string) (*models.GetRelatedResult, error) { + return nil, models.ErrNotFound +} + +func (m mockRelationsStore) GetUpstream(_ context.Context, _ string) (*models.GetUpstreamResult, error) { + return nil, models.ErrNotFound +} + +type mockSourceRepoStore struct { + models.SourceRepositoryStore + + repo *models.SourceRepository +} + +func (m mockSourceRepoStore) Get(_ context.Context, _ string) (*models.SourceRepository, error) { + return m.repo, nil +} + +type mockVulnerabilityStore struct { + models.VulnerabilityStore + + existing *osvschema.Vulnerability + written *models.WriteRequest +} + +func (m *mockVulnerabilityStore) Get(_ context.Context, _ string) (*osvschema.Vulnerability, error) { + if m.existing == nil { + return nil, models.ErrNotFound + } + + return m.existing, nil +} + +func (m *mockVulnerabilityStore) Write(_ context.Context, req models.WriteRequest) error { + m.written = &req + return nil +} + +func TestPipeline_EndToEnd_PortedFromPython(t *testing.T) { + ctx := context.Background() + + // 1. Mock gitter response to simulate git analysis + mockResp := &gitterpb.AffectedCommitsResponse{ + Commits: []*gitterpb.Commit{ + {Hash: []byte("4c155795426727ea05575bd5904321def23c03f4")}, + {Hash: []byte("b1c95a196f22d06fcf80df8c6691cd113d8fefff")}, + {Hash: []byte("eefe8ec3f1f90d0e684890e810f3f21e8500a4cd")}, + {Hash: []byte("febfac1940086bc1f6d3dc33fda0a1d1ba336209")}, + {Hash: []byte("ff8cc32ba60ad9cbb3b23f0a82aad96ebe9ff76b")}, + }, + Tags: []*gitterpb.Ref{ + {Label: "branch_1_cherrypick_regress"}, + {Label: "v0.1.1"}, + }, + CherryPickedEvents: []*gitterpb.Event{ + {EventType: gitterpb.EventType_INTRODUCED, Hash: "febfac1940086bc1f6d3dc33fda0a1d1ba336209"}, + {EventType: gitterpb.EventType_FIXED, Hash: "b9b3fd4732695b83c3068b7b6a14bb372ec31f98"}, + }, + } + mockRespBytes, _ := proto.Marshal(mockResp) + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/x-protobuf") + w.WriteHeader(http.StatusOK) + _, _ = w.Write(mockRespBytes) + })) + defer server.Close() + + mockVulnStore := &mockVulnerabilityStore{ + existing: &osvschema.Vulnerability{ + Id: "OSV-123", + Published: timestamppb.New(time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)), + Modified: timestamppb.New(time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)), + }, + } + + engine := &Engine{ + Pipeline: registry.List, + GitterHost: server.URL, + GitterClient: server.Client(), + Stores: Stores{ + SourceRepo: mockSourceRepoStore{ + repo: &models.SourceRepository{ + Name: "source", + GitAnalysis: &models.GitAnalysisConfig{ + IgnoreGit: false, + }, + }, + }, + Vulnerability: mockVulnStore, + Relations: mockRelationsStore{}, + }, + } + + // 2. Load input YAML (OSV-123.yaml) + inputPath := filepath.Join("testdata", "OSV-123.yaml") + inputBytes, err := os.ReadFile(inputPath) + if err != nil { + t.Fatalf("Failed to read input file: %v", err) + } + + var vuln osvschema.Vulnerability + jsonBytes, err := yaml.ToJSON(inputBytes) + if err != nil { + t.Fatalf("Failed to convert YAML to JSON: %v", err) + } + if err := protojson.Unmarshal(jsonBytes, &vuln); err != nil { + t.Fatalf("Failed to unmarshal protojson: %v", err) + } + + task := Task{ + Type: TaskUpdate, + SourceID: "source", + PathInSource: "OSV-123.yaml", + Vuln: &vuln, + } + + // 3. Run handleUpdate + if err := engine.handleUpdate(ctx, task); err != nil { + t.Fatalf("handleUpdate failed: %v", err) + } + + // 4. Verify results from mock store + if mockVulnStore.written == nil { + t.Fatalf("Expected vulnerability to be written, but it wasn't") + } + + enriched := mockVulnStore.written.Enriched + + expectedVuln := &osvschema.Vulnerability{ + Id: "OSV-123", + Summary: "A vulnerability", + Details: "Blah blah blah\nBlah\n", //nolint:dupword + SchemaVersion: osvconstants.SchemaVersion, + Published: timestamppb.New(time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)), + Severity: []*osvschema.Severity{ + { + Type: osvschema.Severity_CVSS_V3, + Score: "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L", + }, + }, + Credits: []*osvschema.Credit{ + { + Name: "Foo bar", + Contact: []string{ + "mailto:foo@bar.com", + }, + }, + }, + References: []*osvschema.Reference{ + { + Type: osvschema.Reference_WEB, + Url: "https://ref.com/ref", + }, + }, + Affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "Go", + Name: "blah.com/package", + Purl: "pkg:golang/blah.com/package", + }, + Ranges: []*osvschema.Range{ + { + Type: osvschema.Range_GIT, + Repo: "https://osv-test/repo/url", + Events: []*osvschema.Event{ + {Introduced: "eefe8ec3f1f90d0e684890e810f3f21e8500a4cd"}, + {Fixed: "8d8242f545e9cec3e6d0d2e3f5bde8be1c659735"}, + {Introduced: "febfac1940086bc1f6d3dc33fda0a1d1ba336209"}, + {Fixed: "b9b3fd4732695b83c3068b7b6a14bb372ec31f98"}, + }, + }, + }, + Versions: []string{"branch-v0.1.1", "branch_1_cherrypick_regress", "v0.1.1"}, + }, + }, + } + + var errConstruct error + expectedVuln.DatabaseSpecific, errConstruct = structpb.NewStruct(map[string]any{"specific": 1337.0}) + if errConstruct != nil { + t.Fatalf("Failed to construct expected database_specific: %v", errConstruct) + } + + opts := []cmp.Option{ + protocmp.Transform(), + protocmp.IgnoreFields(&osvschema.Vulnerability{}, "modified"), + } + + if diff := cmp.Diff(expectedVuln, enriched, opts...); diff != "" { + t.Errorf("Vulnerability mismatch (-want +got):\n%s", diff) + } + + // Verify that the modified date was pushed forward + existingModified := time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC) + if !enriched.GetModified().AsTime().After(existingModified) { + t.Errorf("Expected modified date to be after %v, got %v", existingModified, enriched.GetModified().AsTime()) + } +} diff --git a/go/internal/worker/pipeline/enrich.go b/go/internal/worker/pipeline/enrich.go index d189bbfb174..9e9d5b90a69 100644 --- a/go/internal/worker/pipeline/enrich.go +++ b/go/internal/worker/pipeline/enrich.go @@ -5,12 +5,16 @@ import ( "context" "github.com/google/osv.dev/go/internal/models" + "github.com/google/osv.dev/go/osv/ecosystem" "github.com/ossf/osv-schema/bindings/go/osvschema" ) type EnrichParams struct { - PathInSource string - SourceRepo *models.SourceRepository + PathInSource string + SourceRepo *models.SourceRepository + EcosystemProvider *ecosystem.Provider + ExistingVuln *osvschema.Vulnerability + RelationsStore models.RelationsStore } type Enricher interface { diff --git a/go/internal/worker/pipeline/enumerateversions/enumerateversions.go b/go/internal/worker/pipeline/enumerateversions/enumerateversions.go new file mode 100644 index 00000000000..36bfd5a5ddb --- /dev/null +++ b/go/internal/worker/pipeline/enumerateversions/enumerateversions.go @@ -0,0 +1,177 @@ +// Package enumerateversions implements an enricher that populates the affected[].versions field for supported ecosystems. +package enumerateversions + +import ( + "context" + "errors" + "fmt" + "log/slog" + "slices" + + "github.com/google/osv.dev/go/internal/osvutil" + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/google/osv.dev/go/logger" + "github.com/google/osv.dev/go/osv/ecosystem" + "github.com/ossf/osv-schema/bindings/go/osvschema" +) + +type Enricher struct{} + +var _ pipeline.Enricher = (*Enricher)(nil) + +func (*Enricher) Enrich(ctx context.Context, vuln *osvschema.Vulnerability, params *pipeline.EnrichParams) error { + provider := params.EcosystemProvider + if provider == nil { + logger.WarnContext(ctx, "ecosystem provider is nil, using default", slog.String("vuln_id", vuln.GetId())) + provider = ecosystem.DefaultProvider + } + for _, affected := range vuln.GetAffected() { + pkg := affected.GetPackage() + ecosystemName := pkg.GetEcosystem() + if ecosystemName == "" { + continue + } + sys, ok := provider.Get(ecosystemName) + if !ok { + continue + } + enumerableSys, ok := sys.(ecosystem.Enumerable) + if !ok { + // Only ecosystems that implement Enumerable can have their versions enumerated. + continue + } + allVersions, err := enumerableSys.GetVersions(pkg.GetName()) + if errors.Is(err, ecosystem.ErrPackageNotFound) { + // The package doesn't exist in this ecosystem, so we can't enumerate its versions. + logger.WarnContext(ctx, "package not found in ecosystem", + slog.String("vuln_id", vuln.GetId()), + slog.String("package", pkg.GetName()), + slog.String("ecosystem", ecosystemName)) + + continue + } + if err != nil { + return fmt.Errorf("failed to get versions for package %s in ecosystem %s: %w", pkg.GetName(), ecosystemName, err) + } + + var newVersions []string + + RangeLoop: + for _, r := range affected.GetRanges() { + if r.GetType() != osvschema.Range_ECOSYSTEM && r.GetType() != osvschema.Range_SEMVER { + continue + } + + // 1. Convert schema events to the internal Event struct. + var events []osvutil.Event + for _, e := range r.GetEvents() { + evt := osvutil.FromSchemaEvent(e) + if evt.Version == "" { + continue + } + if evt.Type == osvutil.Limit && evt.Version == "*" { + // We shouldn't get limit events, but if we do, + // limit: "*" is a valid value for indicating no limit. + continue + } + events = append(events, evt) + } + + // 2. Sort the events chronologically. + if err := osvutil.SortEvents(sys, events); err != nil { + logger.ErrorContext(ctx, "failed to sort events, skipping range", + slog.String("vuln_id", vuln.GetId()), + slog.String("package", pkg.GetName()), + slog.String("ecosystem", ecosystemName), + slog.String("error", err.Error())) + + continue + } + + // 3. Cache parsed versions to avoid repetitive parsing. + type parsedEvent struct { + osvutil.Event + + Parsed ecosystem.Version + } + + var parsedEvents []parsedEvent + for _, evt := range events { + p, err := sys.Parse(evt.Version) + if err != nil { + logger.ErrorContext(ctx, "failed to parse event version, skipping range", + slog.String("vuln_id", vuln.GetId()), + slog.String("package", pkg.GetName()), + slog.String("ecosystem", ecosystemName), + slog.String("version", evt.Version), + slog.String("error", err.Error())) + + continue RangeLoop + } + parsedEvents = append(parsedEvents, parsedEvent{Event: evt, Parsed: p}) + } + + // 4. Walk both versions and events simultaneously. + eventIdx := 0 + isAffected := false + + for _, vStr := range allVersions { + vParsed, err := sys.Parse(vStr) + if err != nil { + continue + } + + for eventIdx < len(parsedEvents) { + evt := parsedEvents[eventIdx] + cmp, _ := evt.Parsed.Compare(vParsed) + + if cmp < 0 { + switch evt.Type { + case osvutil.Introduced: + isAffected = true + case osvutil.Fixed, osvutil.LastAffected, osvutil.Limit: + isAffected = false + } + eventIdx++ + + continue + } + + if cmp == 0 { + switch evt.Type { + case osvutil.Introduced: + isAffected = true + case osvutil.Fixed, osvutil.Limit: // treat limit as fixed + isAffected = false + case osvutil.LastAffected: + newVersions = append(newVersions, vStr) + isAffected = false + } + eventIdx++ + + continue + } + + if cmp > 0 { + break + } + } + + if isAffected { + newVersions = append(newVersions, vStr) + } + } + } + + if len(newVersions) > 0 { + // Append newly discovered versions to the end. + versions := append(affected.GetVersions(), newVersions...) + // Deduplicate by sorting and compacting. + slices.Sort(versions) + versions = slices.Compact(versions) + affected.Versions = versions + } + } + + return nil +} diff --git a/go/internal/worker/pipeline/enumerateversions/enumerateversions_test.go b/go/internal/worker/pipeline/enumerateversions/enumerateversions_test.go new file mode 100644 index 00000000000..b627f04548a --- /dev/null +++ b/go/internal/worker/pipeline/enumerateversions/enumerateversions_test.go @@ -0,0 +1,106 @@ +package enumerateversions + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/google/osv.dev/go/osv/ecosystem" + "github.com/google/osv.dev/go/testutils" + "github.com/ossf/osv-schema/bindings/go/osvschema" +) + +func TestEnricher_Enrich(t *testing.T) { + enricher := &Enricher{} + ctx := context.Background() + + r := testutils.SetupVCR(t) + provider := ecosystem.NewProvider(r.GetDefaultClient()) + + vuln := &osvschema.Vulnerability{ + Id: "TEST-123", + Affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "PyPI", + Name: "atomicwrites", + }, + Ranges: []*osvschema.Range{ + { + Type: osvschema.Range_ECOSYSTEM, + Events: []*osvschema.Event{ + // events are intentionally out of order + {Fixed: "1.4.1"}, + {Introduced: "1.3.0"}, + }, + }, + }, + }, + }, + } + + params := &pipeline.EnrichParams{ + EcosystemProvider: provider, + } + + if err := enricher.Enrich(ctx, vuln, params); err != nil { + t.Fatalf("Enrich failed: %v", err) + } + + affected := vuln.GetAffected()[0] + versions := affected.GetVersions() + + if len(versions) == 0 { + t.Fatalf("Expected enumerated versions, got none") + } + + expectedVersions := []string{"1.3.0", "1.4.0"} + if diff := cmp.Diff(expectedVersions, versions); diff != "" { + t.Errorf("Enricher versions mismatch (-want +got):\n%s", diff) + } +} + +func TestEnricher_Enrich_ParseError(t *testing.T) { + enricher := &Enricher{} + ctx := context.Background() + + r := testutils.SetupVCR(t) + provider := ecosystem.NewProvider(r.GetDefaultClient()) + + vuln := &osvschema.Vulnerability{ + Id: "TEST-124", + Affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "CRAN", + Name: "stringr", + }, + Ranges: []*osvschema.Range{ + { + Type: osvschema.Range_ECOSYSTEM, + Events: []*osvschema.Event{ + {Introduced: "!!!"}, + }, + }, + }, + }, + }, + } + + params := &pipeline.EnrichParams{ + EcosystemProvider: provider, + } + + if err := enricher.Enrich(ctx, vuln, params); err != nil { + t.Fatalf("Enrich failed: %v", err) + } + + affected := vuln.GetAffected()[0] + versions := affected.GetVersions() + + // We expect no versions to be added because the range should be skipped due to parse error. + if len(versions) != 0 { + t.Errorf("Expected no versions due to parse error, got %v", versions) + } +} diff --git a/go/internal/worker/pipeline/enumerateversions/testdata/TestEnricher_Enrich.yaml b/go/internal/worker/pipeline/enumerateversions/testdata/TestEnricher_Enrich.yaml new file mode 100644 index 00000000000..47cb467db09 --- /dev/null +++ b/go/internal/worker/pipeline/enumerateversions/testdata/TestEnricher_Enrich.yaml @@ -0,0 +1,74 @@ +--- +version: 2 +interactions: + - id: 0 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + host: pypi.org + url: https://pypi.org/pypi/atomicwrites/json + method: GET + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + content_length: -1 + uncompressed: true + body: | + {"info":{"author":"Markus Unterwaditzer","author_email":"markus@unterwaditzer.net","bugtrack_url":null,"classifiers":["License :: OSI Approved :: MIT License","Programming Language :: Python :: 2","Programming Language :: Python :: 2.7","Programming Language :: Python :: 3","Programming Language :: Python :: 3.4","Programming Language :: Python :: 3.5","Programming Language :: Python :: 3.6","Programming Language :: Python :: 3.7","Programming Language :: Python :: 3.8","Programming Language :: Python :: Implementation :: CPython"],"description":"===================\npython-atomicwrites\n===================\n\n.. image:: https://travis-ci.com/untitaker/python-atomicwrites.svg?branch=master\n :target: https://travis-ci.com/untitaker/python-atomicwrites\n.. image:: https://ci.appveyor.com/api/projects/status/vadc4le3c27to59x/branch/master?svg=true\n :target: https://ci.appveyor.com/project/untitaker/python-atomicwrites/branch/master\n.. image:: https://readthedocs.org/projects/python-atomicwrites/badge/?version=latest\n :target: https://python-atomicwrites.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n**Atomic file writes.**\n\n.. code-block:: python\n\n from atomicwrites import atomic_write\n\n with atomic_write('foo.txt', overwrite=True) as f:\n f.write('Hello world.')\n # \"foo.txt\" doesn't exist yet.\n\n # Now it does.\n \nSee `API documentation `_ for more\nlow-level interfaces.\n\nFeatures that distinguish it from other similar libraries (see `Alternatives and Credit`_):\n\n- Race-free assertion that the target file doesn't yet exist. This can be\n controlled with the ``overwrite`` parameter.\n\n- Windows support, although not well-tested. The MSDN resources are not very\n explicit about which operations are atomic. I'm basing my assumptions off `a\n comment\n `_\n by `Doug Cook\n `_, who appears\n to be a Microsoft employee:\n\n Question: Is MoveFileEx atomic if the existing and new\n files are both on the same drive?\n\n The simple answer is \"usually, but in some cases it will silently fall-back\n to a non-atomic method, so don't count on it\".\n\n The implementation of MoveFileEx looks something like this: [...]\n\n The problem is if the rename fails, you might end up with a CopyFile, which\n is definitely not atomic.\n\n If you really need atomic-or-nothing, you can try calling\n NtSetInformationFile, which is unsupported but is much more likely to be\n atomic. \n\n- Simple high-level API that wraps a very flexible class-based API.\n\n- Consistent error handling across platforms.\n\n\nHow it works\n============\n\nIt uses a temporary file in the same directory as the given path. This ensures\nthat the temporary file resides on the same filesystem.\n\nThe temporary file will then be atomically moved to the target location: On\nPOSIX, it will use ``rename`` if files should be overwritten, otherwise a\ncombination of ``link`` and ``unlink``. On Windows, it uses MoveFileEx_ through\nstdlib's ``ctypes`` with the appropriate flags.\n\nNote that with ``link`` and ``unlink``, there's a timewindow where the file\nmight be available under two entries in the filesystem: The name of the\ntemporary file, and the name of the target file.\n\nAlso note that the permissions of the target file may change this way. In some\nsituations a ``chmod`` can be issued without any concurrency problems, but\nsince that is not always the case, this library doesn't do it by itself.\n\n.. _MoveFileEx: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365240%28v=vs.85%29.aspx\n\nfsync\n-----\n\nOn POSIX, ``fsync`` is invoked on the temporary file after it is written (to\nflush file content and metadata), and on the parent directory after the file is\nmoved (to flush filename).\n\n``fsync`` does not take care of disks' internal buffers, but there don't seem\nto be any standard POSIX APIs for that. On OS X, ``fcntl`` is used with\n``F_FULLFSYNC`` instead of ``fsync`` for that reason.\n\nOn Windows, `_commit `_\nis used, but there are no guarantees about disk internal buffers.\n\nAlternatives and Credit\n=======================\n\nAtomicwrites is directly inspired by the following libraries (and shares a\nminimal amount of code):\n\n- The Trac project's `utility functions\n `_,\n also used in `Werkzeug `_ and\n `mitsuhiko/python-atomicfile\n `_. The idea to use\n ``ctypes`` instead of ``PyWin32`` originated there.\n\n- `abarnert/fatomic `_. Windows support\n (based on ``PyWin32``) was originally taken from there.\n\nOther alternatives to atomicwrites include:\n\n- `sashka/atomicfile `_. Originally I\n considered using that, but at the time it was lacking a lot of features I\n needed (Windows support, overwrite-parameter, overriding behavior through\n subclassing).\n\n- The `Boltons library collection `_\n features a class for atomic file writes, which seems to have a very similar\n ``overwrite`` parameter. It is lacking Windows support though.\n\nLicense\n=======\n\nLicensed under the MIT, see ``LICENSE``.\n","description_content_type":null,"docs_url":null,"download_url":null,"downloads":{"last_day":-1,"last_month":-1,"last_week":-1},"dynamic":null,"home_page":"https://github.com/untitaker/python-atomicwrites","keywords":null,"license":"MIT","license_expression":null,"license_files":null,"maintainer":null,"maintainer_email":null,"name":"atomicwrites","package_url":"https://pypi.org/project/atomicwrites/","platform":null,"project_url":"https://pypi.org/project/atomicwrites/","project_urls":{"Homepage":"https://github.com/untitaker/python-atomicwrites"},"provides_extra":null,"release_url":"https://pypi.org/project/atomicwrites/1.4.1/","requires_dist":null,"requires_python":null,"summary":"Atomic file writes.","version":"1.4.1","yanked":false,"yanked_reason":null},"last_serial":14382305,"ownership":{"organization":null,"roles":[{"role":"Owner","user":"untitaker"}]},"releases":{"0.1.0":[{"comment_text":"","digests":{"blake2b_256":"7015b8f2759ed6acfdb9f7053fc4d000431d8af561787ff494f4d53b829e2863","md5":"b3707efd40d3041be528034f8470bbaa","sha256":"e41d3f987c2b2125f1c190d9d2015f63e8e4a03b6edb38bdfb59185751c7b221"},"downloads":-1,"filename":"atomicwrites-0.1.0-py2.py3-none-any.whl","has_sig":false,"md5_digest":"b3707efd40d3041be528034f8470bbaa","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":3561,"upload_time":"2022-07-09T03:54:05","upload_time_iso_8601":"2022-07-09T03:54:05.284183Z","url":"https://files.pythonhosted.org/packages/70/15/b8f2759ed6acfdb9f7053fc4d000431d8af561787ff494f4d53b829e2863/atomicwrites-0.1.0-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"3861f4049f2f9fa40792c2c32e23168061055680d493b4e97db179589becf2b3","md5":"ccb4eaa3e026f23543c2efd2eb8c1dec","sha256":"af825fdad1e2336ae12ddfa4808026f9612cbbb3421a18e8a618c66f6107bfd3"},"downloads":-1,"filename":"atomicwrites-0.1.0.tar.gz","has_sig":false,"md5_digest":"ccb4eaa3e026f23543c2efd2eb8c1dec","packagetype":"sdist","python_version":"source","requires_python":null,"size":7816,"upload_time":"2022-07-09T04:09:11","upload_time_iso_8601":"2022-07-09T04:09:11.913819Z","url":"https://files.pythonhosted.org/packages/38/61/f4049f2f9fa40792c2c32e23168061055680d493b4e97db179589becf2b3/atomicwrites-0.1.0.tar.gz","yanked":false,"yanked_reason":null}],"0.1.1":[{"comment_text":"","digests":{"blake2b_256":"d1f0657b0513c3fd5208feca853bcba2443458923a78169718fdb957703e6d05","md5":"88d68020d9862ea8275338ac0f81b27d","sha256":"60b1132676f8546320f2527d14bacc3e8e594b917284573aa6fb62907a015cdc"},"downloads":-1,"filename":"atomicwrites-0.1.1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"88d68020d9862ea8275338ac0f81b27d","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":3562,"upload_time":"2022-07-09T04:08:34","upload_time_iso_8601":"2022-07-09T04:08:34.517612Z","url":"https://files.pythonhosted.org/packages/d1/f0/657b0513c3fd5208feca853bcba2443458923a78169718fdb957703e6d05/atomicwrites-0.1.1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"b129ab1f44c6be0e4f9b8a3f8af43c7c244a2dbc2e92bf21199ed4b2c5f78751","md5":"54a55547e653de20a0a5cad62dcb14dd","sha256":"cb000de21bd8f676f538893d0c5594554bb40e8c079994314849c2381bf8f4aa"},"downloads":-1,"filename":"atomicwrites-0.1.1.tar.gz","has_sig":false,"md5_digest":"54a55547e653de20a0a5cad62dcb14dd","packagetype":"sdist","python_version":"source","requires_python":null,"size":9080,"upload_time":"2022-07-09T04:09:13","upload_time_iso_8601":"2022-07-09T04:09:13.799351Z","url":"https://files.pythonhosted.org/packages/b1/29/ab1f44c6be0e4f9b8a3f8af43c7c244a2dbc2e92bf21199ed4b2c5f78751/atomicwrites-0.1.1.tar.gz","yanked":false,"yanked_reason":null}],"0.1.2":[{"comment_text":"","digests":{"blake2b_256":"0f3763bddc74cce777d109fb8eb5cf049727601398fee2f7e9bbd42bacb5f5d0","md5":"deb49596f39ad2e2961602b4b6c04026","sha256":"088471b73d3ac375f42b1167b80c3de1e8d7fe2824113b9a1706af21d76ba0e7"},"downloads":-1,"filename":"atomicwrites-0.1.2-py2.py3-none-any.whl","has_sig":false,"md5_digest":"deb49596f39ad2e2961602b4b6c04026","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":4363,"upload_time":"2022-07-09T04:08:36","upload_time_iso_8601":"2022-07-09T04:08:36.313368Z","url":"https://files.pythonhosted.org/packages/0f/37/63bddc74cce777d109fb8eb5cf049727601398fee2f7e9bbd42bacb5f5d0/atomicwrites-0.1.2-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"48991181274826d893fa4dd003ecc09ff0ad62b32409f8d36d8f68129d3c5e8b","md5":"7a65126ed31b9d9d00fd16447c190122","sha256":"4788d40b10d1a832354a35ffa20d592b0a0d4038e3b15adccfbfc966e7886862"},"downloads":-1,"filename":"atomicwrites-0.1.2.tar.gz","has_sig":false,"md5_digest":"7a65126ed31b9d9d00fd16447c190122","packagetype":"sdist","python_version":"source","requires_python":null,"size":9706,"upload_time":"2022-07-09T04:09:16","upload_time_iso_8601":"2022-07-09T04:09:16.137450Z","url":"https://files.pythonhosted.org/packages/48/99/1181274826d893fa4dd003ecc09ff0ad62b32409f8d36d8f68129d3c5e8b/atomicwrites-0.1.2.tar.gz","yanked":false,"yanked_reason":null}],"0.1.3":[{"comment_text":"","digests":{"blake2b_256":"6a310f57245fce8cb88ae6afcbbd4d8a243745d47da7f2b6cf37d93580b72b95","md5":"8cd00483ecc934519dc77521914ceef4","sha256":"325695964342ab6ba553ebf12c7c29e99ddfd2826ead22893a99cd8ea02c1302"},"downloads":-1,"filename":"atomicwrites-0.1.3-py2.py3-none-any.whl","has_sig":false,"md5_digest":"8cd00483ecc934519dc77521914ceef4","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":5144,"upload_time":"2022-07-09T04:08:38","upload_time_iso_8601":"2022-07-09T04:08:38.270848Z","url":"https://files.pythonhosted.org/packages/6a/31/0f57245fce8cb88ae6afcbbd4d8a243745d47da7f2b6cf37d93580b72b95/atomicwrites-0.1.3-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"ae176f7d8499d31051c4c407aad555507ef331cca76062dfcd8050b6fb629bab","md5":"46718419abd1767fc2fdf25366f5d2d9","sha256":"54b5670375f85281db4eb244e374fc4fbeeea409039fd6f559e48b2e899bc8b5"},"downloads":-1,"filename":"atomicwrites-0.1.3.tar.gz","has_sig":false,"md5_digest":"46718419abd1767fc2fdf25366f5d2d9","packagetype":"sdist","python_version":"source","requires_python":null,"size":12129,"upload_time":"2022-07-09T04:09:18","upload_time_iso_8601":"2022-07-09T04:09:18.570535Z","url":"https://files.pythonhosted.org/packages/ae/17/6f7d8499d31051c4c407aad555507ef331cca76062dfcd8050b6fb629bab/atomicwrites-0.1.3.tar.gz","yanked":false,"yanked_reason":null}],"0.1.4":[{"comment_text":"","digests":{"blake2b_256":"c9e4ea41357ee64e24489e135968900cfc3fd545cd90d6a94365ecc788fca1f1","md5":"ef55bb5aa94ef3b3b4c612f37ecd9ece","sha256":"9887db002cf80bf1e589956b11d05a214adfc9d00bc87d8afc22bcada88787d2"},"downloads":-1,"filename":"atomicwrites-0.1.4-py2.py3-none-any.whl","has_sig":false,"md5_digest":"ef55bb5aa94ef3b3b4c612f37ecd9ece","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":5139,"upload_time":"2022-07-09T04:08:40","upload_time_iso_8601":"2022-07-09T04:08:40.038489Z","url":"https://files.pythonhosted.org/packages/c9/e4/ea41357ee64e24489e135968900cfc3fd545cd90d6a94365ecc788fca1f1/atomicwrites-0.1.4-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"de261fda905e1fc22f036a6bdb27021c10d1559ad59083eee46e2b0a5caaa2b0","md5":"022de5ac9b58500914b52e41ab9ea69d","sha256":"6fc694e318b46eec816c937c081a9ba05960967d77b81758d62352f4e6f108cc"},"downloads":-1,"filename":"atomicwrites-0.1.4.tar.gz","has_sig":false,"md5_digest":"022de5ac9b58500914b52e41ab9ea69d","packagetype":"sdist","python_version":"source","requires_python":null,"size":13650,"upload_time":"2022-07-09T04:09:21","upload_time_iso_8601":"2022-07-09T04:09:21.198181Z","url":"https://files.pythonhosted.org/packages/de/26/1fda905e1fc22f036a6bdb27021c10d1559ad59083eee46e2b0a5caaa2b0/atomicwrites-0.1.4.tar.gz","yanked":false,"yanked_reason":null}],"0.1.5":[{"comment_text":"","digests":{"blake2b_256":"4f508ee3eb4a08618edbb7a1776ce79cdeae4e6b0727d1455a078e4c1eb6e904","md5":"69f6fe62af69cdd02f7fd2fb4e99d3d4","sha256":"84b589669b4dbf231cecfc4b890abb23d171b8c71b2f1d999477d9b9c8b8515b"},"downloads":-1,"filename":"atomicwrites-0.1.5-py2.py3-none-any.whl","has_sig":false,"md5_digest":"69f6fe62af69cdd02f7fd2fb4e99d3d4","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":5842,"upload_time":"2022-07-09T04:08:42","upload_time_iso_8601":"2022-07-09T04:08:42.278438Z","url":"https://files.pythonhosted.org/packages/4f/50/8ee3eb4a08618edbb7a1776ce79cdeae4e6b0727d1455a078e4c1eb6e904/atomicwrites-0.1.5-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"e6e0991aa5eb1b3942aa669c55fadd486dc1f91bbe3c2114f04e83b9b25af31c","md5":"c683a18ec30fcacd65a2617079d50486","sha256":"9b16a8f1d366fb550f3d5a5ed4587022735f139a4187735466f34cf4577e4eaa"},"downloads":-1,"filename":"atomicwrites-0.1.5.tar.gz","has_sig":false,"md5_digest":"c683a18ec30fcacd65a2617079d50486","packagetype":"sdist","python_version":"source","requires_python":null,"size":14058,"upload_time":"2022-07-09T04:09:24","upload_time_iso_8601":"2022-07-09T04:09:24.291833Z","url":"https://files.pythonhosted.org/packages/e6/e0/991aa5eb1b3942aa669c55fadd486dc1f91bbe3c2114f04e83b9b25af31c/atomicwrites-0.1.5.tar.gz","yanked":false,"yanked_reason":null}],"0.1.6":[{"comment_text":"","digests":{"blake2b_256":"c7d4dbedb373376316337edead24b4d4dee5768b7c06db63d0f12f2807a2afe8","md5":"5ac4f2df155c8d619805ee4b5f6e97a2","sha256":"ca9d29c9b837d2e2a01662fce5f32076fa5d33a4a29593e7913f4cfc2d580369"},"downloads":-1,"filename":"atomicwrites-0.1.6-py2.py3-none-any.whl","has_sig":false,"md5_digest":"5ac4f2df155c8d619805ee4b5f6e97a2","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":6377,"upload_time":"2022-07-09T04:08:44","upload_time_iso_8601":"2022-07-09T04:08:44.432202Z","url":"https://files.pythonhosted.org/packages/c7/d4/dbedb373376316337edead24b4d4dee5768b7c06db63d0f12f2807a2afe8/atomicwrites-0.1.6-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"4e4b9b2afec4c97202c0cc5e8caf26a9762dc2942a24ae8252b83f929cc83e70","md5":"0a7b9a82fb0b658546442cfc6ca20aa7","sha256":"825a615f1aead817feaf6a151ffe636dcca50703ea917407558cb4c15c1e646b"},"downloads":-1,"filename":"atomicwrites-0.1.6.tar.gz","has_sig":false,"md5_digest":"0a7b9a82fb0b658546442cfc6ca20aa7","packagetype":"sdist","python_version":"source","requires_python":null,"size":14400,"upload_time":"2022-07-09T04:09:26","upload_time_iso_8601":"2022-07-09T04:09:26.858797Z","url":"https://files.pythonhosted.org/packages/4e/4b/9b2afec4c97202c0cc5e8caf26a9762dc2942a24ae8252b83f929cc83e70/atomicwrites-0.1.6.tar.gz","yanked":false,"yanked_reason":null}],"0.1.7":[{"comment_text":"","digests":{"blake2b_256":"209ac23dfd01f3020dc310a9f753a000910d3d43cae059432edb2337b29e5ebf","md5":"042efd3eea9f577ed2f32051e95347a3","sha256":"d7e3037067c045e8cb224100ab6e6b08b60cd2c8c9a8ca27b8182bd9c1283ec5"},"downloads":-1,"filename":"atomicwrites-0.1.7-py2.py3-none-any.whl","has_sig":false,"md5_digest":"042efd3eea9f577ed2f32051e95347a3","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":6382,"upload_time":"2022-07-09T04:08:46","upload_time_iso_8601":"2022-07-09T04:08:46.627295Z","url":"https://files.pythonhosted.org/packages/20/9a/c23dfd01f3020dc310a9f753a000910d3d43cae059432edb2337b29e5ebf/atomicwrites-0.1.7-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"7a2ead3859d7c5a3dae166e07353bf3ec3879bd760ceacc3ddc6c1fa6de5d672","md5":"cbc13f0c5948f98145fa1b108fe3f436","sha256":"02486f9f270ceea79f160218f03f691688a5c73049e807d475137125d43023e5"},"downloads":-1,"filename":"atomicwrites-0.1.7.tar.gz","has_sig":false,"md5_digest":"cbc13f0c5948f98145fa1b108fe3f436","packagetype":"sdist","python_version":"source","requires_python":null,"size":14393,"upload_time":"2022-07-09T04:09:29","upload_time_iso_8601":"2022-07-09T04:09:29.707990Z","url":"https://files.pythonhosted.org/packages/7a/2e/ad3859d7c5a3dae166e07353bf3ec3879bd760ceacc3ddc6c1fa6de5d672/atomicwrites-0.1.7.tar.gz","yanked":false,"yanked_reason":null}],"0.1.8":[{"comment_text":"","digests":{"blake2b_256":"eb3f1432945cf76f63b41499c378155fc15addf3df07e7c27430be748e1bc378","md5":"231ecfa3e9f8ec334581c46c8c4c57fc","sha256":"6d1e9c078d4647e06b38fa4b800e60937ad3614bc25171c5ba8e21d9e5d9ac4d"},"downloads":-1,"filename":"atomicwrites-0.1.8-py2.py3-none-any.whl","has_sig":false,"md5_digest":"231ecfa3e9f8ec334581c46c8c4c57fc","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":6426,"upload_time":"2022-07-09T04:08:49","upload_time_iso_8601":"2022-07-09T04:08:49.337720Z","url":"https://files.pythonhosted.org/packages/eb/3f/1432945cf76f63b41499c378155fc15addf3df07e7c27430be748e1bc378/atomicwrites-0.1.8-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"3d9e03394706e33153462500ae1b628e458da907d3bc2775a3954f20c0af1424","md5":"f8abc61a8b0d811d6e7d7a3aebf33a37","sha256":"3274adb52bd3ae91d87ba923e0f21fd86c05b71bbaefe2ec0d6679c01f98dc8e"},"downloads":-1,"filename":"atomicwrites-0.1.8.tar.gz","has_sig":false,"md5_digest":"f8abc61a8b0d811d6e7d7a3aebf33a37","packagetype":"sdist","python_version":"source","requires_python":null,"size":14440,"upload_time":"2022-07-09T04:09:32","upload_time_iso_8601":"2022-07-09T04:09:32.036654Z","url":"https://files.pythonhosted.org/packages/3d/9e/03394706e33153462500ae1b628e458da907d3bc2775a3954f20c0af1424/atomicwrites-0.1.8.tar.gz","yanked":false,"yanked_reason":null}],"0.1.9":[{"comment_text":"","digests":{"blake2b_256":"3675b7641133abb7959577ded0ca568bd80551c03cb1a2e355cc97781ab737a6","md5":"bf84f72c16469bc7de2353bd779c65a3","sha256":"2c46b4fc67a8c44eaa52ff3d03fc332f3bf73a6347669fd34d2fc0b88b479c3e"},"downloads":-1,"filename":"atomicwrites-0.1.9-py2.py3-none-any.whl","has_sig":false,"md5_digest":"bf84f72c16469bc7de2353bd779c65a3","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":6457,"upload_time":"2022-07-09T04:08:51","upload_time_iso_8601":"2022-07-09T04:08:51.597337Z","url":"https://files.pythonhosted.org/packages/36/75/b7641133abb7959577ded0ca568bd80551c03cb1a2e355cc97781ab737a6/atomicwrites-0.1.9-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"22330bde412a35d79be32504192e45c6073db6dad049ce0fbbc8405decba5015","md5":"8c2dfc2c584b197168b6ed570e9c9983","sha256":"7cdfcee8c064bc0ba30b0444ba0919ebafccf5b0b1916c8cde07e410042c4023"},"downloads":-1,"filename":"atomicwrites-0.1.9.tar.gz","has_sig":false,"md5_digest":"8c2dfc2c584b197168b6ed570e9c9983","packagetype":"sdist","python_version":"source","requires_python":null,"size":14475,"upload_time":"2022-07-09T04:09:35","upload_time_iso_8601":"2022-07-09T04:09:35.070291Z","url":"https://files.pythonhosted.org/packages/22/33/0bde412a35d79be32504192e45c6073db6dad049ce0fbbc8405decba5015/atomicwrites-0.1.9.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0":[{"comment_text":"","digests":{"blake2b_256":"6f7e9a49e30f5dd941a3e57b76221e007d93a67d67d9d84e3f215303e5541096","md5":"d624fb96ff8bf88adeb05c0443489cbf","sha256":"65ab13ed810d9b97ab3b5c7b51a865173f431b9e63dbcda7c0d1ed7f82484309"},"downloads":-1,"filename":"atomicwrites-1.0.0-py2.py3-none-any.whl","has_sig":false,"md5_digest":"d624fb96ff8bf88adeb05c0443489cbf","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":6481,"upload_time":"2022-07-09T04:08:54","upload_time_iso_8601":"2022-07-09T04:08:54.128164Z","url":"https://files.pythonhosted.org/packages/6f/7e/9a49e30f5dd941a3e57b76221e007d93a67d67d9d84e3f215303e5541096/atomicwrites-1.0.0-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"b655127c32cbe8e2e2aef2fb41e5dc5b72bf5d4b0631a0d5cc0f9b13b4b44bac","md5":"9bcb01d6f3affb398a12db4e83a97479","sha256":"1b977e9a6cbf8ae36a4e259e6da28d98fda6ab81cbf9634258eee0700e512e05"},"downloads":-1,"filename":"atomicwrites-1.0.0.tar.gz","has_sig":false,"md5_digest":"9bcb01d6f3affb398a12db4e83a97479","packagetype":"sdist","python_version":"source","requires_python":null,"size":14696,"upload_time":"2022-07-09T04:09:38","upload_time_iso_8601":"2022-07-09T04:09:38.022046Z","url":"https://files.pythonhosted.org/packages/b6/55/127c32cbe8e2e2aef2fb41e5dc5b72bf5d4b0631a0d5cc0f9b13b4b44bac/atomicwrites-1.0.0.tar.gz","yanked":false,"yanked_reason":null}],"1.1.0":[{"comment_text":"","digests":{"blake2b_256":"c29a60ad797dd21879eda174f8c42fa5b5475ec9f60089f4519c508bd0f14ad8","md5":"6e07815348ec50a99e28d67216765c6e","sha256":"b035da9b25f78d08c1a6077dd2b014a74772d7925c729f337bbff5d92b4f5e3d"},"downloads":-1,"filename":"atomicwrites-1.1.0-py2.py3-none-any.whl","has_sig":false,"md5_digest":"6e07815348ec50a99e28d67216765c6e","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":7498,"upload_time":"2022-07-09T04:08:56","upload_time_iso_8601":"2022-07-09T04:08:56.943612Z","url":"https://files.pythonhosted.org/packages/c2/9a/60ad797dd21879eda174f8c42fa5b5475ec9f60089f4519c508bd0f14ad8/atomicwrites-1.1.0-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"c5a736b00169a0e097b8b4410135f97a38f22c8f74867691253911793f09c68f","md5":"96c41e3f8db03c8cf31c1436bfe4a474","sha256":"80768f9608ff0806dc20d4133a7eb88dda9fa60bdf96bc534b546785226b01e8"},"downloads":-1,"filename":"atomicwrites-1.1.0.tar.gz","has_sig":false,"md5_digest":"96c41e3f8db03c8cf31c1436bfe4a474","packagetype":"sdist","python_version":"source","requires_python":null,"size":17545,"upload_time":"2022-07-09T04:09:40","upload_time_iso_8601":"2022-07-09T04:09:40.885989Z","url":"https://files.pythonhosted.org/packages/c5/a7/36b00169a0e097b8b4410135f97a38f22c8f74867691253911793f09c68f/atomicwrites-1.1.0.tar.gz","yanked":false,"yanked_reason":null}],"1.1.5":[{"comment_text":"","digests":{"blake2b_256":"0ae8cd6375e7a59664eeea9e1c77a766eeac0fc3083bb958c2b41ec46b95f29c","md5":"19f7b2eb84a8521e55fe7ae288c2bbf7","sha256":"a24da68318b08ac9c9c45029f4a10371ab5b20e4226738e150e6e7c571630ae6"},"downloads":-1,"filename":"atomicwrites-1.1.5-py2.py3-none-any.whl","has_sig":false,"md5_digest":"19f7b2eb84a8521e55fe7ae288c2bbf7","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":7513,"upload_time":"2022-07-09T04:08:59","upload_time_iso_8601":"2022-07-09T04:08:59.110782Z","url":"https://files.pythonhosted.org/packages/0a/e8/cd6375e7a59664eeea9e1c77a766eeac0fc3083bb958c2b41ec46b95f29c/atomicwrites-1.1.5-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"a1e12d9bc76838e6e6667fde5814aa25d7feb93d6fa471bf6816daac2596e8b2","md5":"2669c1222f2886cab9a1f1d6370d47da","sha256":"240831ea22da9ab882b551b31d4225591e5e447a68c5e188db5b89ca1d487585"},"downloads":-1,"filename":"atomicwrites-1.1.5.tar.gz","has_sig":false,"md5_digest":"2669c1222f2886cab9a1f1d6370d47da","packagetype":"sdist","python_version":"source","requires_python":null,"size":18951,"upload_time":"2022-07-09T04:09:43","upload_time_iso_8601":"2022-07-09T04:09:43.180891Z","url":"https://files.pythonhosted.org/packages/a1/e1/2d9bc76838e6e6667fde5814aa25d7feb93d6fa471bf6816daac2596e8b2/atomicwrites-1.1.5.tar.gz","yanked":false,"yanked_reason":null}],"1.2.0":[{"comment_text":"","digests":{"blake2b_256":"0a676cc7ebe2c939aa8e0de9cc3d2660b105d365330c2a8ffb066738fc83562f","md5":"efcee35fd256adc0a7448f993ed2f6a5","sha256":"6b5282987b21cd79151f51caccead7a09d0a32e89c568bd9e3c4aaa7bbdf3f3a"},"downloads":-1,"filename":"atomicwrites-1.2.0-py2.py3-none-any.whl","has_sig":false,"md5_digest":"efcee35fd256adc0a7448f993ed2f6a5","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*","size":5852,"upload_time":"2022-07-09T04:09:01","upload_time_iso_8601":"2022-07-09T04:09:01.485071Z","url":"https://files.pythonhosted.org/packages/0a/67/6cc7ebe2c939aa8e0de9cc3d2660b105d365330c2a8ffb066738fc83562f/atomicwrites-1.2.0-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"6996becfc14dcd4c216ef01205848dea19a42b7b5b9c16cc4997e8df075a583e","md5":"74d9f779ca03aca1e9a1c510548bc445","sha256":"e16334d50fe0f90919ef7339c24b9b62e6abaa78cd2d226f3d94eb067eb89043"},"downloads":-1,"filename":"atomicwrites-1.2.0.tar.gz","has_sig":false,"md5_digest":"74d9f779ca03aca1e9a1c510548bc445","packagetype":"sdist","python_version":"source","requires_python":">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*","size":16928,"upload_time":"2022-07-09T04:09:45","upload_time_iso_8601":"2022-07-09T04:09:45.569022Z","url":"https://files.pythonhosted.org/packages/69/96/becfc14dcd4c216ef01205848dea19a42b7b5b9c16cc4997e8df075a583e/atomicwrites-1.2.0.tar.gz","yanked":false,"yanked_reason":null}],"1.2.1":[{"comment_text":"","digests":{"blake2b_256":"3a9a9d878f8d885706e2530402de6417141129a943802c084238914fa6798d97","md5":"7335a59c5ecc22a3a6306b2caa5ff7e7","sha256":"0312ad34fcad8fac3704d441f7b317e50af620823353ec657a53e981f92920c0"},"downloads":-1,"filename":"atomicwrites-1.2.1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"7335a59c5ecc22a3a6306b2caa5ff7e7","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*","size":5852,"upload_time":"2022-07-09T04:09:04","upload_time_iso_8601":"2022-07-09T04:09:04.500532Z","url":"https://files.pythonhosted.org/packages/3a/9a/9d878f8d885706e2530402de6417141129a943802c084238914fa6798d97/atomicwrites-1.2.1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"aceda311712ef6b4355035489f665e63e1a73f9eb371929e3c98e5efd451069e","md5":"9b64377c3f93e9877adc4460e9984f2b","sha256":"ec9ae8adaae229e4f8446952d204a3e4b5fdd2d099f9be3aaf556120135fb3ee"},"downloads":-1,"filename":"atomicwrites-1.2.1.tar.gz","has_sig":false,"md5_digest":"9b64377c3f93e9877adc4460e9984f2b","packagetype":"sdist","python_version":"source","requires_python":">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*","size":11660,"upload_time":"2022-07-09T04:09:47","upload_time_iso_8601":"2022-07-09T04:09:47.956975Z","url":"https://files.pythonhosted.org/packages/ac/ed/a311712ef6b4355035489f665e63e1a73f9eb371929e3c98e5efd451069e/atomicwrites-1.2.1.tar.gz","yanked":false,"yanked_reason":null}],"1.3.0":[{"comment_text":"","digests":{"blake2b_256":"52906155aa926f43f2b2a22b01be7241be3bfd1ceaf7d0b3267213e8127d41f4","md5":"793e602b383d2f4a86d3c410053c0ccd","sha256":"03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4"},"downloads":-1,"filename":"atomicwrites-1.3.0-py2.py3-none-any.whl","has_sig":false,"md5_digest":"793e602b383d2f4a86d3c410053c0ccd","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*","size":5885,"upload_time":"2022-07-09T04:09:07","upload_time_iso_8601":"2022-07-09T04:09:07.052260Z","url":"https://files.pythonhosted.org/packages/52/90/6155aa926f43f2b2a22b01be7241be3bfd1ceaf7d0b3267213e8127d41f4/atomicwrites-1.3.0-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"ec0fcd484ac8820fed363b374af30049adc8fd13065720fd4f4c6be8a2309da7","md5":"ce11f780a4ce0fce8a55d64494a88178","sha256":"75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6"},"downloads":-1,"filename":"atomicwrites-1.3.0.tar.gz","has_sig":false,"md5_digest":"ce11f780a4ce0fce8a55d64494a88178","packagetype":"sdist","python_version":"source","requires_python":">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*","size":11699,"upload_time":"2022-07-09T04:09:50","upload_time_iso_8601":"2022-07-09T04:09:50.226713Z","url":"https://files.pythonhosted.org/packages/ec/0f/cd484ac8820fed363b374af30049adc8fd13065720fd4f4c6be8a2309da7/atomicwrites-1.3.0.tar.gz","yanked":false,"yanked_reason":null}],"1.4.0":[{"comment_text":"","digests":{"blake2b_256":"2ca0da5f49008ec6e9a658dbf5d7310a4debd397bce0b4db03cf8a410066bb87","md5":"acc030856f5d16b2aac6dcc74d1b36a4","sha256":"6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},"downloads":-1,"filename":"atomicwrites-1.4.0-py2.py3-none-any.whl","has_sig":false,"md5_digest":"acc030856f5d16b2aac6dcc74d1b36a4","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*","size":6790,"upload_time":"2022-07-09T04:09:09","upload_time_iso_8601":"2022-07-09T04:09:09.073080Z","url":"https://files.pythonhosted.org/packages/2c/a0/da5f49008ec6e9a658dbf5d7310a4debd397bce0b4db03cf8a410066bb87/atomicwrites-1.4.0-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"558d74a75635f2c3c914ab5b3850112fd4b0c8039975ecb320e4449aa363ba54","md5":"b5cc15c8f9f180a48665f9aacf91d817","sha256":"ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},"downloads":-1,"filename":"atomicwrites-1.4.0.tar.gz","has_sig":false,"md5_digest":"b5cc15c8f9f180a48665f9aacf91d817","packagetype":"sdist","python_version":"source","requires_python":">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*","size":11790,"upload_time":"2022-07-09T04:09:52","upload_time_iso_8601":"2022-07-09T04:09:52.757713Z","url":"https://files.pythonhosted.org/packages/55/8d/74a75635f2c3c914ab5b3850112fd4b0c8039975ecb320e4449aa363ba54/atomicwrites-1.4.0.tar.gz","yanked":false,"yanked_reason":null}],"1.4.1":[{"comment_text":"","digests":{"blake2b_256":"87c653da25344e3e3a9c01095a89f16dbcda021c609ddb42dd6d7c0528236fb2","md5":"9ff8e556d0b4a411d0cebbdb3fb0c70d","sha256":"81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"},"downloads":-1,"filename":"atomicwrites-1.4.1.tar.gz","has_sig":false,"md5_digest":"9ff8e556d0b4a411d0cebbdb3fb0c70d","packagetype":"sdist","python_version":"source","requires_python":null,"size":14227,"upload_time":"2022-07-08T18:31:40","upload_time_iso_8601":"2022-07-08T18:31:40.459492Z","url":"https://files.pythonhosted.org/packages/87/c6/53da25344e3e3a9c01095a89f16dbcda021c609ddb42dd6d7c0528236fb2/atomicwrites-1.4.1.tar.gz","yanked":false,"yanked_reason":null}]},"urls":[{"comment_text":"","digests":{"blake2b_256":"87c653da25344e3e3a9c01095a89f16dbcda021c609ddb42dd6d7c0528236fb2","md5":"9ff8e556d0b4a411d0cebbdb3fb0c70d","sha256":"81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"},"downloads":-1,"filename":"atomicwrites-1.4.1.tar.gz","has_sig":false,"md5_digest":"9ff8e556d0b4a411d0cebbdb3fb0c70d","packagetype":"sdist","python_version":"source","requires_python":null,"size":14227,"upload_time":"2022-07-08T18:31:40","upload_time_iso_8601":"2022-07-08T18:31:40.459492Z","url":"https://files.pythonhosted.org/packages/87/c6/53da25344e3e3a9c01095a89f16dbcda021c609ddb42dd6d7c0528236fb2/atomicwrites-1.4.1.tar.gz","yanked":false,"yanked_reason":null}],"vulnerabilities":[]} + headers: + Accept-Ranges: + - bytes + Access-Control-Allow-Headers: + - Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since + Access-Control-Allow-Methods: + - GET + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - X-PyPI-Last-Serial + Access-Control-Max-Age: + - "86400" + Cache-Control: + - max-age=900, public + Content-Security-Policy: + - base-uri 'self'; connect-src 'self' https://api.github.com/repos/ https://api.github.com/search/issues https://gitlab.com/api/ https://analytics.python.org *.ethicalads.io https://api.pwnedpasswords.com https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/sre/mathmaps/ https://2p66nmmycsj3.statuspage.io; default-src 'none'; font-src 'self'; form-action 'self' https://checkout.stripe.com https://billing.stripe.com; frame-ancestors 'none'; frame-src 'none'; img-src 'self' https://pypi-camo.freetls.fastly.net/ *.ethicalads.io ethicalads.blob.core.windows.net; script-src 'self' https://analytics.python.org *.ethicalads.io 'sha256-U3hKDidudIaxBDEzwGJApJgPEf2mWk6cfMWghrAa6i0=' https://cdn.jsdelivr.net/npm/mathjax@3.2.2/ 'sha256-1CldwzdEg2k1wTmf7s5RWVd7NMXI/7nxxjJM2C4DqII=' 'sha256-0POaN8stWYQxhzjKS+/eOfbbJ/u4YHO5ZagJvLpMypo='; style-src 'self' *.ethicalads.io 'sha256-2YHqZokjiizkHi1Zt+6ar0XJ0OeEy/egBnlm+MDMtrM=' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=' 'sha256-JLEjeN9e5dGsz5475WyRaoA4eQOdNPxDIeUhclnJDCE=' 'sha256-mQyxHEuwZJqpxCw3SLmc4YOySNKXunyu2Oiz1r3/wAE=' 'sha256-OCf+kv5Asiwp++8PIevKBYSgnNLNUZvxAp4a7wMLuKA=' 'sha256-h5LOiLhk6wiJrGsG5ItM0KimwzWQH/yAcmoJDJL//bY=' + Content-Type: + - application/json + Date: + - Tue, 05 May 2026 04:53:22 GMT + Etag: + - '"b2ITDcsoZOKG7Mm0Sd8UNQ"' + Permissions-Policy: + - publickey-credentials-create=(self),publickey-credentials-get=(self),accelerometer=(),ambient-light-sensor=(),autoplay=(),battery=(),camera=(),display-capture=(),document-domain=(),encrypted-media=(),execution-while-not-rendered=(),execution-while-out-of-viewport=(),fullscreen=(),gamepad=(),geolocation=(),gyroscope=(),hid=(),identity-credentials-get=(),idle-detection=(),local-fonts=(),magnetometer=(),microphone=(),midi=(),otp-credentials=(),payment=(),picture-in-picture=(),screen-wake-lock=(),serial=(),speaker-selection=(),storage-access=(),usb=(),web-share=(),xr-spatial-tracking=() + Referrer-Policy: + - origin-when-cross-origin + Server: + - gunicorn + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Vary: + - Accept-Encoding + X-Cache: + - MISS, HIT, HIT + X-Cache-Hits: + - 0, 33, 0 + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - deny + X-Permitted-Cross-Domain-Policies: + - none + X-Pypi-Last-Serial: + - "14382305" + X-Served-By: + - cache-iad-kjyo7100058-IAD, cache-iad-kjyo7100068-IAD, cache-wsi-ysbk1060050-WSI + X-Timer: + - S1777956802.408920,VS0,VE206 + X-Xss-Protection: + - 1; mode=block + status: 200 OK + code: 200 + duration: 238.706687ms diff --git a/go/internal/worker/pipeline/enumerateversions/testdata/TestEnricher_Enrich_ParseError.yaml b/go/internal/worker/pipeline/enumerateversions/testdata/TestEnricher_Enrich_ParseError.yaml new file mode 100644 index 00000000000..3a1f2b94480 --- /dev/null +++ b/go/internal/worker/pipeline/enumerateversions/testdata/TestEnricher_Enrich_ParseError.yaml @@ -0,0 +1,42 @@ +--- +version: 2 +interactions: + - id: 0 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + host: packagemanager.posit.co + url: https://packagemanager.posit.co/__api__/repos/2/packages/stringr + method: GET + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + content_length: -1 + body: '{"id":0,"source_type":"","source":"cran","name":"stringr","version":"1.6.0","source_id":1,"tran_create":0,"tran_delete":0,"repo_id":2,"repo_type":"R","repository":"RSPM","checksum":"24f2fc5df980a7eb888659e22b9744d2316c558624015c7a7cd8c3ce3e370064","tran_archive":null,"type":"","description":"A consistent, simple and easy to use set of wrappers around\n the fantastic ''stringi'' package. All function and argument names (and\n positions) are consistent, all functions deal with \"NA\"''s and zero\n length vectors in the same way, and the output from one function is\n easy to feed into the input of another.\n","package_date":null,"date_publication":"2025-11-04T14:00:02Z","authors_r":"c(\n person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\", \"cph\")),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )\n","author":"Hadley Wickham [aut, cre, cph],\n Posit Software, PBC [cph, fnd]\n","maintainer":"Hadley Wickham \u003chadley@posit.co\u003e","license":"MIT + file LICENSE","url":"https://stringr.tidyverse.org,\n https://github.com/tidyverse/stringr\n","bug_reports":"https://github.com/tidyverse/stringr/issues","occurred":null,"depends":"R (\u003e= 4.1.0)","imports":"cli, glue (\u003e= 1.6.1), lifecycle (\u003e= 1.0.3), magrittr, rlang (\u003e= 1.0.0), stringi (\u003e= 1.5.3), vctrs (\u003e= 0.4.0)","suggests":"covr, dplyr, gt, htmltools, htmlwidgets, knitr, rmarkdown, testthat (\u003e= 3.0.0), tibble","linking_to":null,"enhances":null,"needs_compilation":"no","system_requirements":null,"installed":false,"title":"Simple, Consistent Wrappers for Common String Operations","package_size":195406,"path":null,"r_dep":null,"os_type":null,"readme":"md","remote_sha":null,"collate":null,"bioc_views":null,"readme_data":"\n\u003c!-- README.md is generated from README.Rmd. Please edit that file --\u003e\n\n# stringr \u003ca href=''https://stringr.tidyverse.org''\u003e\u003cimg src=''man/figures/logo.png'' align=\"right\" height=\"139\" /\u003e\u003c/a\u003e\n\n\u003c!-- badges: start --\u003e\n\n[![CRAN\nstatus](https://www.r-pkg.org/badges/version/stringr)](https://cran.r-project.org/package=stringr)\n[![R-CMD-check](https://github.com/tidyverse/stringr/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/tidyverse/stringr/actions/workflows/R-CMD-check.yaml)\n[![Codecov test\ncoverage](https://codecov.io/gh/tidyverse/stringr/branch/main/graph/badge.svg)](https://app.codecov.io/gh/tidyverse/stringr?branch=main)\n[![Lifecycle:\nstable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable)\n\u003c!-- badges: end --\u003e\n\n## Overview\n\nStrings are not glamorous, high-profile components of R, but they do\nplay a big role in many data cleaning and preparation tasks. The stringr\npackage provides a cohesive set of functions designed to make working\nwith strings as easy as possible. If you’re not familiar with strings,\nthe best place to start is the [chapter on\nstrings](https://r4ds.hadley.nz/strings) in R for Data Science.\n\nstringr is built on top of\n[stringi](https://github.com/gagolews/stringi), which uses the\n[ICU](https://icu.unicode.org) C library to provide fast, correct\nimplementations of common string manipulations. stringr focusses on the\nmost important and commonly used string manipulation functions whereas\nstringi provides a comprehensive set covering almost anything you can\nimagine. If you find that stringr is missing a function that you need,\ntry looking in stringi. Both packages share similar conventions, so once\nyou’ve mastered stringr, you should find stringi similarly easy to use.\n\n## Installation\n\n``` r\n# The easiest way to get stringr is to install the whole tidyverse:\ninstall.packages(\"tidyverse\")\n\n# Alternatively, install just stringr:\ninstall.packages(\"stringr\")\n```\n\n## Cheatsheet\n\n\u003ca href=\"https://github.com/rstudio/cheatsheets/blob/main/strings.pdf\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/rstudio/cheatsheets/main/pngs/thumbnails/strings-cheatsheet-thumbs.png\" width=\"630\" height=\"242\"/\u003e\u003c/a\u003e\n\n## Usage\n\nAll functions in stringr start with `str_` and take a vector of strings\nas the first argument:\n\n``` r\nx \u003c- c(\"why\", \"video\", \"cross\", \"extra\", \"deal\", \"authority\")\nstr_length(x) \n#\u003e [1] 3 5 5 5 4 9\nstr_c(x, collapse = \", \")\n#\u003e [1] \"why, video, cross, extra, deal, authority\"\nstr_sub(x, 1, 2)\n#\u003e [1] \"wh\" \"vi\" \"cr\" \"ex\" \"de\" \"au\"\n```\n\nMost string functions work with regular expressions, a concise language\nfor describing patterns of text. For example, the regular expression\n`\"[aeiou]\"` matches any single character that is a vowel:\n\n``` r\nstr_subset(x, \"[aeiou]\")\n#\u003e [1] \"video\" \"cross\" \"extra\" \"deal\" \"authority\"\nstr_count(x, \"[aeiou]\")\n#\u003e [1] 0 3 1 2 2 4\n```\n\nThere are seven main verbs that work with patterns:\n\n- `str_detect(x, pattern)` tells you if there’s any match to the\n pattern:\n\n ``` r\n str_detect(x, \"[aeiou]\")\n #\u003e [1] FALSE TRUE TRUE TRUE TRUE TRUE\n ```\n\n- `str_count(x, pattern)` counts the number of patterns:\n\n ``` r\n str_count(x, \"[aeiou]\")\n #\u003e [1] 0 3 1 2 2 4\n ```\n\n- `str_subset(x, pattern)` extracts the matching components:\n\n ``` r\n str_subset(x, \"[aeiou]\")\n #\u003e [1] \"video\" \"cross\" \"extra\" \"deal\" \"authority\"\n ```\n\n- `str_locate(x, pattern)` gives the position of the match:\n\n ``` r\n str_locate(x, \"[aeiou]\")\n #\u003e start end\n #\u003e [1,] NA NA\n #\u003e [2,] 2 2\n #\u003e [3,] 3 3\n #\u003e [4,] 1 1\n #\u003e [5,] 2 2\n #\u003e [6,] 1 1\n ```\n\n- `str_extract(x, pattern)` extracts the text of the match:\n\n ``` r\n str_extract(x, \"[aeiou]\")\n #\u003e [1] NA \"i\" \"o\" \"e\" \"e\" \"a\"\n ```\n\n- `str_match(x, pattern)` extracts parts of the match defined by\n parentheses:\n\n ``` r\n # extract the characters on either side of the vowel\n str_match(x, \"(.)[aeiou](.)\")\n #\u003e [,1] [,2] [,3]\n #\u003e [1,] NA NA NA \n #\u003e [2,] \"vid\" \"v\" \"d\" \n #\u003e [3,] \"ros\" \"r\" \"s\" \n #\u003e [4,] NA NA NA \n #\u003e [5,] \"dea\" \"d\" \"a\" \n #\u003e [6,] \"aut\" \"a\" \"t\"\n ```\n\n- `str_replace(x, pattern, replacement)` replaces the matches with new\n text:\n\n ``` r\n str_replace(x, \"[aeiou]\", \"?\")\n #\u003e [1] \"why\" \"v?deo\" \"cr?ss\" \"?xtra\" \"d?al\" \"?uthority\"\n ```\n\n- `str_split(x, pattern)` splits up a string into multiple pieces:\n\n ``` r\n str_split(c(\"a,b\", \"c,d,e\"), \",\")\n #\u003e [[1]]\n #\u003e [1] \"a\" \"b\"\n #\u003e \n #\u003e [[2]]\n #\u003e [1] \"c\" \"d\" \"e\"\n ```\n\nAs well as regular expressions (the default), there are three other\npattern matching engines:\n\n- `fixed()`: match exact bytes\n- `coll()`: match human letters\n- `boundary()`: match boundaries\n\n## RStudio Addin\n\nThe [RegExplain RStudio\naddin](https://www.garrickadenbuie.com/project/regexplain/) provides a\nfriendly interface for working with regular expressions and functions\nfrom stringr. This addin allows you to interactively build your regexp,\ncheck the output of common string matching functions, consult the\ninteractive help pages, or use the included resources to learn regular\nexpressions.\n\nThis addin can easily be installed with devtools:\n\n``` r\n# install.packages(\"devtools\")\ndevtools::install_github(\"gadenbuie/regexplain\")\n```\n\n## Compared to base R\n\nR provides a solid set of string operations, but because they have grown\norganically over time, they can be inconsistent and a little hard to\nlearn. Additionally, they lag behind the string operations in other\nprogramming languages, so that some things that are easy to do in\nlanguages like Ruby or Python are rather hard to do in R.\n\n- Uses consistent function and argument names. The first argument is\n always the vector of strings to modify, which makes stringr work\n particularly well in conjunction with the pipe:\n\n ``` r\n letters %\u003e%\n .[1:10] %\u003e% \n str_pad(3, \"right\") %\u003e%\n str_c(letters[2:11])\n #\u003e [1] \"a b\" \"b c\" \"c d\" \"d e\" \"e f\" \"f g\" \"g h\" \"h i\" \"i j\" \"j k\"\n ```\n\n- Simplifies string operations by eliminating options that you don’t\n need 95% of the time.\n\n- Produces outputs than can easily be used as inputs. This includes\n ensuring that missing inputs result in missing outputs, and zero\n length inputs result in zero length outputs.\n\nLearn more in `vignette(\"from-base\")`\n","releases":null,"last_serial":0,"downloads":{"count":0},"links":[{"package_id":0,"type":0,"name":"cli","operator":null,"version":null,"linked_to":"18578","reverse":false},{"package_id":0,"type":0,"name":"glue","operator":2,"version":"1.6.1","linked_to":"52241","reverse":false},{"package_id":0,"type":0,"name":"lifecycle","operator":2,"version":"1.0.3","linked_to":"68920","reverse":false},{"package_id":0,"type":0,"name":"magrittr","operator":null,"version":null,"linked_to":"71925","reverse":false},{"package_id":0,"type":0,"name":"rlang","operator":2,"version":"1.0.0","linked_to":"114188","reverse":false},{"package_id":0,"type":0,"name":"stringi","operator":2,"version":"1.5.3","linked_to":"135353","reverse":false},{"package_id":0,"type":0,"name":"vctrs","operator":2,"version":"0.4.0","linked_to":"147552","reverse":false},{"package_id":0,"type":1,"name":"R","operator":2,"version":"4.1.0","linked_to":"","reverse":false},{"package_id":0,"type":2,"name":"covr","operator":null,"version":null,"linked_to":"23658","reverse":false},{"package_id":0,"type":2,"name":"dplyr","operator":null,"version":null,"linked_to":"32243","reverse":false},{"package_id":0,"type":2,"name":"gt","operator":null,"version":null,"linked_to":"54844","reverse":false},{"package_id":0,"type":2,"name":"htmltools","operator":null,"version":null,"linked_to":"58208","reverse":false},{"package_id":0,"type":2,"name":"htmlwidgets","operator":null,"version":null,"linked_to":"58226","reverse":false},{"package_id":0,"type":2,"name":"knitr","operator":null,"version":null,"linked_to":"66052","reverse":false},{"package_id":0,"type":2,"name":"rmarkdown","operator":null,"version":null,"linked_to":"114601","reverse":false},{"package_id":0,"type":2,"name":"testthat","operator":2,"version":"3.0.0","linked_to":"139644","reverse":false},{"package_id":0,"type":2,"name":"tibble","operator":null,"version":null,"linked_to":"140493","reverse":false},{"package_id":0,"type":0,"name":"ABCDscores","operator":null,"version":null,"linked_to":"39","reverse":true},{"package_id":0,"type":0,"name":"AID","operator":null,"version":null,"linked_to":"1787","reverse":true},{"package_id":0,"type":0,"name":"AIscreenR","operator":null,"version":null,"linked_to":"1948","reverse":true},{"package_id":0,"type":0,"name":"AMAPVox","operator":null,"version":null,"linked_to":"2475","reverse":true},{"package_id":0,"type":0,"name":"APCI","operator":null,"version":null,"linked_to":"3423","reverse":true},{"package_id":0,"type":0,"name":"APCalign","operator":null,"version":null,"linked_to":"3398","reverse":true},{"package_id":0,"type":0,"name":"APCtools","operator":null,"version":null,"linked_to":"3445","reverse":true},{"package_id":0,"type":0,"name":"ARDECO","operator":null,"version":null,"linked_to":"4056","reverse":true},{"package_id":0,"type":0,"name":"ARDL","operator":null,"version":null,"linked_to":"4068","reverse":true},{"package_id":0,"type":0,"name":"ARUtools","operator":null,"version":null,"linked_to":"4597","reverse":true},{"package_id":0,"type":0,"name":"AbSolution","operator":null,"version":null,"linked_to":"176","reverse":true},{"package_id":0,"type":0,"name":"ActiSleep","operator":null,"version":null,"linked_to":"450","reverse":true},{"package_id":0,"type":0,"name":"AeroSampleR","operator":null,"version":null,"linked_to":"1373","reverse":true},{"package_id":0,"type":0,"name":"AgePopDenom","operator":null,"version":null,"linked_to":"1508","reverse":true},{"package_id":0,"type":0,"name":"AgeTopicModels","operator":null,"version":null,"linked_to":"1513","reverse":true},{"package_id":0,"type":0,"name":"AirMonitor","operator":null,"version":null,"linked_to":"1912","reverse":true},{"package_id":0,"type":0,"name":"AnanseSeurat","operator":null,"version":null,"linked_to":"2765","reverse":true},{"package_id":0,"type":0,"name":"AnimalSequences","operator":null,"version":null,"linked_to":"2851","reverse":true},{"package_id":0,"type":0,"name":"AntClassify","operator":null,"version":null,"linked_to":"3128","reverse":true},{"package_id":0,"type":0,"name":"AntibodyForests","operator":null,"version":null,"linked_to":"3168","reverse":true},{"package_id":0,"type":0,"name":"AovBay","operator":null,"version":null,"linked_to":"3336","reverse":true},{"package_id":0,"type":0,"name":"ApacheLogProcessor","operator":null,"version":null,"linked_to":"3366","reverse":true},{"package_id":0,"type":0,"name":"AplosNCA","operator":null,"version":null,"linked_to":"3535","reverse":true},{"package_id":0,"type":0,"name":"Arothron","operator":null,"version":null,"linked_to":"4320","reverse":true},{"package_id":0,"type":0,"name":"AuxSurvey","operator":null,"version":null,"linked_to":"5702","reverse":true},{"package_id":0,"type":0,"name":"AvInertia","operator":null,"version":null,"linked_to":"5762","reverse":true},{"package_id":0,"type":0,"name":"BAwiR","operator":null,"version":null,"linked_to":"7037","reverse":true},{"package_id":0,"type":0,"name":"BED","operator":null,"version":null,"linked_to":"8665","reverse":true},{"package_id":0,"type":0,"name":"BGPhazard","operator":null,"version":null,"linked_to":"9342","reverse":true},{"package_id":0,"type":0,"name":"BGmisc","operator":null,"version":null,"linked_to":"9313","reverse":true},{"package_id":0,"type":0,"name":"BIGr","operator":null,"version":null,"linked_to":"9937","reverse":true},{"package_id":0,"type":0,"name":"BLSloadR","operator":null,"version":null,"linked_to":"11571","reverse":true},{"package_id":0,"type":0,"name":"BMIselect","operator":null,"version":null,"linked_to":"11657","reverse":true},{"package_id":0,"type":0,"name":"BPrinStratTTE","operator":null,"version":null,"linked_to":"12785","reverse":true},{"package_id":0,"type":0,"name":"BREADR","operator":null,"version":null,"linked_to":"12984","reverse":true},{"package_id":0,"type":0,"name":"BSL","operator":null,"version":null,"linked_to":"13580","reverse":true},{"package_id":0,"type":0,"name":"BTLLasso","operator":null,"version":null,"linked_to":"13803","reverse":true},{"package_id":0,"type":0,"name":"BallMapper","operator":null,"version":null,"linked_to":"6385","reverse":true},{"package_id":0,"type":0,"name":"BasketballAnalyzeR","operator":null,"version":null,"linked_to":"6900","reverse":true},{"package_id":0,"type":0,"name":"BatchGetSymbols","operator":null,"version":null,"linked_to":"6968","reverse":true},{"package_id":0,"type":0,"name":"BayesFactor","operator":null,"version":null,"linked_to":"7240","reverse":true},{"package_id":0,"type":0,"name":"BayesGWQS","operator":null,"version":null,"linked_to":"7297","reverse":true},{"package_id":0,"type":0,"name":"BayesMultiMode","operator":null,"version":null,"linked_to":"7587","reverse":true},{"package_id":0,"type":0,"name":"BayesianDisaggregation","operator":null,"version":null,"linked_to":"7316","reverse":true},{"package_id":0,"type":0,"name":"BayesianFitForecast","operator":null,"version":null,"linked_to":"7323","reverse":true},{"package_id":0,"type":0,"name":"BayesianPlatformDesignTimeTrend","operator":null,"version":null,"linked_to":"7370","reverse":true},{"package_id":0,"type":0,"name":"Bchron","operator":null,"version":null,"linked_to":"8290","reverse":true},{"package_id":0,"type":0,"name":"BeeBDC","operator":null,"version":null,"linked_to":"8694","reverse":true},{"package_id":0,"type":0,"name":"BioVizSeq","operator":null,"version":null,"linked_to":"10847","reverse":true},{"package_id":0,"type":0,"name":"BiostatsUHNplus","operator":null,"version":null,"linked_to":"10806","reverse":true},{"package_id":0,"type":0,"name":"BivRec","operator":null,"version":null,"linked_to":"11082","reverse":true},{"package_id":0,"type":0,"name":"BrazilMet","operator":null,"version":null,"linked_to":"12957","reverse":true},{"package_id":0,"type":0,"name":"CB2","operator":null,"version":null,"linked_to":"15755","reverse":true},{"package_id":0,"type":0,"name":"CDMConnector","operator":null,"version":null,"linked_to":"16216","reverse":true},{"package_id":0,"type":0,"name":"CEOdata","operator":null,"version":null,"linked_to":"16541","reverse":true},{"package_id":0,"type":0,"name":"CHOIRBM","operator":null,"version":null,"linked_to":"17553","reverse":true},{"package_id":0,"type":0,"name":"CIAAWconsensus","operator":null,"version":null,"linked_to":"17727","reverse":true},{"package_id":0,"type":0,"name":"CIMTx","operator":null,"version":null,"linked_to":"17811","reverse":true},{"package_id":0,"type":0,"name":"CLME","operator":null,"version":null,"linked_to":"18974","reverse":true},{"package_id":0,"type":0,"name":"CMIP6VisR","operator":null,"version":null,"linked_to":"19918","reverse":true},{"package_id":0,"type":0,"name":"CMapViz","operator":null,"version":null,"linked_to":"19830","reverse":true},{"package_id":0,"type":0,"name":"CNAIM","operator":null,"version":null,"linked_to":"20088","reverse":true},{"package_id":0,"type":0,"name":"CNVScope","operator":null,"version":null,"linked_to":"20183","reverse":true},{"package_id":0,"type":0,"name":"COMIX","operator":null,"version":null,"linked_to":"21417","reverse":true},{"package_id":0,"type":0,"name":"CRANsearcher","operator":null,"version":null,"linked_to":"24150","reverse":true},{"package_id":0,"type":0,"name":"CRE","operator":null,"version":null,"linked_to":"24195","reverse":true},{"package_id":0,"type":0,"name":"CSCNet","operator":null,"version":null,"linked_to":"24912","reverse":true},{"package_id":0,"type":0,"name":"CSHShydRology","operator":null,"version":null,"linked_to":"24961","reverse":true},{"package_id":0,"type":0,"name":"CTNote","operator":null,"version":null,"linked_to":"25221","reverse":true},{"package_id":0,"type":0,"name":"CancerEvolutionVisualization","operator":null,"version":null,"linked_to":"14681","reverse":true},{"package_id":0,"type":0,"name":"CardiacDP","operator":null,"version":null,"linked_to":"14985","reverse":true},{"package_id":0,"type":0,"name":"CausalQueries","operator":null,"version":null,"linked_to":"15671","reverse":true},{"package_id":0,"type":0,"name":"Certara.RsNLME.ModelExecutor","operator":null,"version":null,"linked_to":"16619","reverse":true},{"package_id":0,"type":0,"name":"Certara.Xpose.NLME","operator":null,"version":null,"linked_to":"16623","reverse":true},{"package_id":0,"type":0,"name":"ClusTCR2","operator":null,"version":null,"linked_to":"19222","reverse":true},{"package_id":0,"type":0,"name":"ClustAssess","operator":null,"version":null,"linked_to":"19200","reverse":true},{"package_id":0,"type":0,"name":"Cluster.OBeu","operator":null,"version":null,"linked_to":"19474","reverse":true},{"package_id":0,"type":0,"name":"CodelistGenerator","operator":null,"version":null,"linked_to":"20441","reverse":true},{"package_id":0,"type":0,"name":"CohortCharacteristics","operator":null,"version":null,"linked_to":"20813","reverse":true},{"package_id":0,"type":0,"name":"CohortContrast","operator":null,"version":null,"linked_to":"20845","reverse":true},{"package_id":0,"type":0,"name":"CohortSurvival","operator":null,"version":null,"linked_to":"20868","reverse":true},{"package_id":0,"type":0,"name":"Colossus","operator":null,"version":null,"linked_to":"21249","reverse":true},{"package_id":0,"type":0,"name":"CommonDataModel","operator":null,"version":null,"linked_to":"21457","reverse":true},{"package_id":0,"type":0,"name":"ConSciR","operator":null,"version":null,"linked_to":"22354","reverse":true},{"package_id":0,"type":0,"name":"CongressData","operator":null,"version":null,"linked_to":"22207","reverse":true},{"package_id":0,"type":0,"name":"Conigrave","operator":null,"version":null,"linked_to":"22217","reverse":true},{"package_id":0,"type":0,"name":"ConversationAlign","operator":null,"version":null,"linked_to":"22594","reverse":true},{"package_id":0,"type":0,"name":"CopernicusClimate","operator":null,"version":null,"linked_to":"22749","reverse":true},{"package_id":0,"type":0,"name":"CopernicusMarine","operator":null,"version":null,"linked_to":"22759","reverse":true},{"package_id":0,"type":0,"name":"CovidMutations","operator":null,"version":null,"linked_to":"23632","reverse":true},{"package_id":0,"type":0,"name":"CrossExpression","operator":null,"version":null,"linked_to":"24534","reverse":true},{"package_id":0,"type":0,"name":"DCLEAR","operator":null,"version":null,"linked_to":"27696","reverse":true},{"package_id":0,"type":0,"name":"DEXiR","operator":null,"version":null,"linked_to":"29204","reverse":true},{"package_id":0,"type":0,"name":"DEplotting","operator":null,"version":null,"linked_to":"28701","reverse":true},{"package_id":0,"type":0,"name":"DFD","operator":null,"version":null,"linked_to":"29314","reverse":true},{"package_id":0,"type":0,"name":"DGEobj","operator":null,"version":null,"linked_to":"29413","reverse":true},{"package_id":0,"type":0,"name":"DGEobj.utils","operator":null,"version":null,"linked_to":"29418","reverse":true},{"package_id":0,"type":0,"name":"DIDmultiplegt","operator":null,"version":null,"linked_to":"29815","reverse":true},{"package_id":0,"type":0,"name":"DIVINE","operator":null,"version":null,"linked_to":"31157","reverse":true},{"package_id":0,"type":0,"name":"DOPE","operator":null,"version":null,"linked_to":"31970","reverse":true},{"package_id":0,"type":0,"name":"DSMolgenisArmadillo","operator":null,"version":null,"linked_to":"33011","reverse":true},{"package_id":0,"type":0,"name":"DSSAT","operator":null,"version":null,"linked_to":"33061","reverse":true},{"package_id":0,"type":0,"name":"DSpoty","operator":null,"version":null,"linked_to":"33051","reverse":true},{"package_id":0,"type":0,"name":"DTSEA","operator":null,"version":null,"linked_to":"33317","reverse":true},{"package_id":0,"type":0,"name":"DataMetProcess","operator":null,"version":null,"linked_to":"26829","reverse":true},{"package_id":0,"type":0,"name":"DataQualityDashboard","operator":null,"version":null,"linked_to":"26963","reverse":true},{"package_id":0,"type":0,"name":"DatabaseConnector","operator":null,"version":null,"linked_to":"26622","reverse":true},{"package_id":0,"type":0,"name":"DatastreamDSWS2R","operator":null,"version":null,"linked_to":"27117","reverse":true},{"package_id":0,"type":0,"name":"DatastreamR","operator":null,"version":null,"linked_to":"27122","reverse":true},{"package_id":0,"type":0,"name":"DiagrammeR","operator":null,"version":null,"linked_to":"29583","reverse":true},{"package_id":0,"type":0,"name":"DisImpact","operator":null,"version":null,"linked_to":"30641","reverse":true},{"package_id":0,"type":0,"name":"DisasterAlert","operator":null,"version":null,"linked_to":"30414","reverse":true},{"package_id":0,"type":0,"name":"DistPlotter","operator":null,"version":null,"linked_to":"30864","reverse":true},{"package_id":0,"type":0,"name":"DrDimont","operator":null,"version":null,"linked_to":"32564","reverse":true},{"package_id":0,"type":0,"name":"DramaAnalysis","operator":null,"version":null,"linked_to":"32502","reverse":true},{"package_id":0,"type":0,"name":"DrugUtilisation","operator":null,"version":null,"linked_to":"32789","reverse":true},{"package_id":0,"type":0,"name":"DynForest","operator":null,"version":null,"linked_to":"33820","reverse":true},{"package_id":0,"type":0,"name":"EAVA","operator":null,"version":null,"linked_to":"34363","reverse":true},{"package_id":0,"type":0,"name":"ECOTOXr","operator":null,"version":null,"linked_to":"34988","reverse":true},{"package_id":0,"type":0,"name":"EDCimport","operator":null,"version":null,"linked_to":"35091","reverse":true},{"package_id":0,"type":0,"name":"EFAtools","operator":null,"version":null,"linked_to":"35418","reverse":true},{"package_id":0,"type":0,"name":"EFSATools","operator":null,"version":null,"linked_to":"35559","reverse":true},{"package_id":0,"type":0,"name":"EGM","operator":null,"version":null,"linked_to":"35617","reverse":true},{"package_id":0,"type":0,"name":"EQUALPrognosis","operator":null,"version":null,"linked_to":"37736","reverse":true},{"package_id":0,"type":0,"name":"EnvNJ","operator":null,"version":null,"linked_to":"37054","reverse":true},{"package_id":0,"type":0,"name":"EpiForsk","operator":null,"version":null,"linked_to":"37266","reverse":true},{"package_id":0,"type":0,"name":"EpiSemble","operator":null,"version":null,"linked_to":"37468","reverse":true},{"package_id":0,"type":0,"name":"EpiStandard","operator":null,"version":null,"linked_to":"37499","reverse":true},{"package_id":0,"type":0,"name":"EpiTest","operator":null,"version":null,"linked_to":"37517","reverse":true},{"package_id":0,"type":0,"name":"EstimationTools","operator":null,"version":null,"linked_to":"38249","reverse":true},{"package_id":0,"type":0,"name":"Evomorph","operator":null,"version":null,"linked_to":"38841","reverse":true},{"package_id":0,"type":0,"name":"ExcelFunctionsR","operator":null,"version":null,"linked_to":"39079","reverse":true},{"package_id":0,"type":0,"name":"FAIRmaterials","operator":null,"version":null,"linked_to":"40091","reverse":true},{"package_id":0,"type":0,"name":"FARS","operator":null,"version":null,"linked_to":"40353","reverse":true},{"package_id":0,"type":0,"name":"FAST.R","operator":null,"version":null,"linked_to":"40410","reverse":true},{"package_id":0,"type":0,"name":"FAVA","operator":null,"version":null,"linked_to":"40954","reverse":true},{"package_id":0,"type":0,"name":"FCO","operator":null,"version":null,"linked_to":"41094","reverse":true},{"package_id":0,"type":0,"name":"FFTrees","operator":null,"version":null,"linked_to":"41767","reverse":true},{"package_id":0,"type":0,"name":"FMAT","operator":null,"version":null,"linked_to":"43378","reverse":true},{"package_id":0,"type":0,"name":"FedData","operator":null,"version":null,"linked_to":"41521","reverse":true},{"package_id":0,"type":0,"name":"FinanceGraphs","operator":null,"version":null,"linked_to":"42201","reverse":true},{"package_id":0,"type":0,"name":"FluxSeparator","operator":null,"version":null,"linked_to":"43346","reverse":true},{"package_id":0,"type":0,"name":"ForestElementsR","operator":null,"version":null,"linked_to":"44124","reverse":true},{"package_id":0,"type":0,"name":"GALLO","operator":null,"version":null,"linked_to":"46204","reverse":true},{"package_id":0,"type":0,"name":"GB5mcPred","operator":null,"version":null,"linked_to":"46848","reverse":true},{"package_id":0,"type":0,"name":"GCCfactor","operator":null,"version":null,"linked_to":"46933","reverse":true},{"package_id":0,"type":0,"name":"GCalignR","operator":null,"version":null,"linked_to":"46922","reverse":true},{"package_id":0,"type":0,"name":"GFDmcv","operator":null,"version":null,"linked_to":"49253","reverse":true},{"package_id":0,"type":0,"name":"GIFTr","operator":null,"version":null,"linked_to":"51270","reverse":true},{"package_id":0,"type":0,"name":"GISINTEGRATION","operator":null,"version":null,"linked_to":"51409","reverse":true},{"package_id":0,"type":0,"name":"GISSB","operator":null,"version":null,"linked_to":"51410","reverse":true},{"package_id":0,"type":0,"name":"GLMcat","operator":null,"version":null,"linked_to":"51784","reverse":true},{"package_id":0,"type":0,"name":"GOCompare","operator":null,"version":null,"linked_to":"52670","reverse":true},{"package_id":0,"type":0,"name":"GPAbin","operator":null,"version":null,"linked_to":"53061","reverse":true},{"package_id":0,"type":0,"name":"GRIN2","operator":null,"version":null,"linked_to":"54236","reverse":true},{"package_id":0,"type":0,"name":"GRShiny","operator":null,"version":null,"linked_to":"54542","reverse":true},{"package_id":0,"type":0,"name":"GenomeAdmixR","operator":null,"version":null,"linked_to":"47965","reverse":true},{"package_id":0,"type":0,"name":"GeoTox","operator":null,"version":null,"linked_to":"48836","reverse":true},{"package_id":0,"type":0,"name":"GetDFPData2","operator":null,"version":null,"linked_to":"49066","reverse":true},{"package_id":0,"type":0,"name":"GetFREData","operator":null,"version":null,"linked_to":"49073","reverse":true},{"package_id":0,"type":0,"name":"GetLattesData","operator":null,"version":null,"linked_to":"49098","reverse":true},{"package_id":0,"type":0,"name":"GetTDData","operator":null,"version":null,"linked_to":"49195","reverse":true},{"package_id":0,"type":0,"name":"GillespieSSA2","operator":null,"version":null,"linked_to":"51282","reverse":true},{"package_id":0,"type":0,"name":"GimmeMyPlot","operator":null,"version":null,"linked_to":"51339","reverse":true},{"package_id":0,"type":0,"name":"GimmeMyStats","operator":null,"version":null,"linked_to":"51340","reverse":true},{"package_id":0,"type":0,"name":"GitStats","operator":null,"version":null,"linked_to":"51500","reverse":true},{"package_id":0,"type":0,"name":"GlmSimulatoR","operator":null,"version":null,"linked_to":"52092","reverse":true},{"package_id":0,"type":0,"name":"Gmisc","operator":null,"version":null,"linked_to":"52403","reverse":true},{"package_id":0,"type":0,"name":"Goodreader","operator":null,"version":null,"linked_to":"52833","reverse":true},{"package_id":0,"type":0,"name":"GreedyExperimentalDesign","operator":null,"version":null,"linked_to":"53897","reverse":true},{"package_id":0,"type":0,"name":"Greg","operator":null,"version":null,"linked_to":"53963","reverse":true},{"package_id":0,"type":0,"name":"GroupBN","operator":null,"version":null,"linked_to":"54300","reverse":true},{"package_id":0,"type":0,"name":"GrowthCurveME","operator":null,"version":null,"linked_to":"54434","reverse":true},{"package_id":0,"type":0,"name":"HACSim","operator":null,"version":null,"linked_to":"55532","reverse":true},{"package_id":0,"type":0,"name":"HCD","operator":null,"version":null,"linked_to":"55985","reverse":true},{"package_id":0,"type":0,"name":"HDXBoxeR","operator":null,"version":null,"linked_to":"56326","reverse":true},{"package_id":0,"type":0,"name":"HGDMr","operator":null,"version":null,"linked_to":"56936","reverse":true},{"package_id":0,"type":0,"name":"HLAtools","operator":null,"version":null,"linked_to":"57476","reverse":true},{"package_id":0,"type":0,"name":"HLMdiag","operator":null,"version":null,"linked_to":"57484","reverse":true},{"package_id":0,"type":0,"name":"HMDHFDplus","operator":null,"version":null,"linked_to":"57525","reverse":true},{"package_id":0,"type":0,"name":"HPZoneAPI","operator":null,"version":null,"linked_to":"57946","reverse":true},{"package_id":0,"type":0,"name":"HTGM3D","operator":null,"version":null,"linked_to":"58146","reverse":true},{"package_id":0,"type":0,"name":"HYPEtools","operator":null,"version":null,"linked_to":"58925","reverse":true},{"package_id":0,"type":0,"name":"HiGarrote","operator":null,"version":null,"linked_to":"57176","reverse":true},{"package_id":0,"type":0,"name":"Holomics","operator":null,"version":null,"linked_to":"57796","reverse":true},{"package_id":0,"type":0,"name":"IATscores","operator":null,"version":null,"linked_to":"59105","reverse":true},{"package_id":0,"type":0,"name":"ICED","operator":null,"version":null,"linked_to":"59391","reverse":true},{"package_id":0,"type":0,"name":"IDCard","operator":null,"version":null,"linked_to":"59735","reverse":true},{"package_id":0,"type":0,"name":"IOBR","operator":null,"version":null,"linked_to":"62238","reverse":true},{"package_id":0,"type":0,"name":"IOLS","operator":null,"version":null,"linked_to":"62259","reverse":true},{"package_id":0,"type":0,"name":"IPEDSuploadables","operator":null,"version":null,"linked_to":"62446","reverse":true},{"package_id":0,"type":0,"name":"IPV","operator":null,"version":null,"linked_to":"62613","reverse":true},{"package_id":0,"type":0,"name":"IRISMustangMetrics","operator":null,"version":null,"linked_to":"62742","reverse":true},{"package_id":0,"type":0,"name":"IRISSeismic","operator":null,"version":null,"linked_to":"62759","reverse":true},{"package_id":0,"type":0,"name":"ISCA","operator":null,"version":null,"linked_to":"62928","reverse":true},{"package_id":0,"type":0,"name":"ISO11784Tools","operator":null,"version":null,"linked_to":"63029","reverse":true},{"package_id":0,"type":0,"name":"ISOweek","operator":null,"version":null,"linked_to":"63292","reverse":true},{"package_id":0,"type":0,"name":"IncidencePrevalence","operator":null,"version":null,"linked_to":"60933","reverse":true},{"package_id":0,"type":0,"name":"InsectLabelR","operator":null,"version":null,"linked_to":"61506","reverse":true},{"package_id":0,"type":0,"name":"JBrowseR","operator":null,"version":null,"linked_to":"63807","reverse":true},{"package_id":0,"type":0,"name":"JCRImpactFactor","operator":null,"version":null,"linked_to":"63829","reverse":true},{"package_id":0,"type":0,"name":"JLPM","operator":null,"version":null,"linked_to":"64013","reverse":true},{"package_id":0,"type":0,"name":"JustifyAlpha","operator":null,"version":null,"linked_to":"64936","reverse":true},{"package_id":0,"type":0,"name":"KMLtoSHAPE","operator":null,"version":null,"linked_to":"66023","reverse":true},{"package_id":0,"type":0,"name":"Karen","operator":null,"version":null,"linked_to":"65065","reverse":true},{"package_id":0,"type":0,"name":"LAGOSNE","operator":null,"version":null,"linked_to":"66802","reverse":true},{"package_id":0,"type":0,"name":"LAIr","operator":null,"version":null,"linked_to":"66834","reverse":true},{"package_id":0,"type":0,"name":"LLM","operator":null,"version":null,"linked_to":"69615","reverse":true},{"package_id":0,"type":0,"name":"LOGAN","operator":null,"version":null,"linked_to":"70217","reverse":true},{"package_id":0,"type":0,"name":"LRTesteR","operator":null,"version":null,"linked_to":"71019","reverse":true},{"package_id":0,"type":0,"name":"LSAMBA","operator":null,"version":null,"linked_to":"71058","reverse":true},{"package_id":0,"type":0,"name":"LTASR","operator":null,"version":null,"linked_to":"71252","reverse":true},{"package_id":0,"type":0,"name":"LTFGRS","operator":null,"version":null,"linked_to":"71271","reverse":true},{"package_id":0,"type":0,"name":"LTFHPlus","operator":null,"version":null,"linked_to":"71274","reverse":true},{"package_id":0,"type":0,"name":"LadderFuelsR","operator":null,"version":null,"linked_to":"66771","reverse":true},{"package_id":0,"type":0,"name":"LearnVizLMM","operator":null,"version":null,"linked_to":"68209","reverse":true},{"package_id":0,"type":0,"name":"LifeInsureR","operator":null,"version":null,"linked_to":"68934","reverse":true},{"package_id":0,"type":0,"name":"LightFitR","operator":null,"version":null,"linked_to":"68980","reverse":true},{"package_id":0,"type":0,"name":"LightLogR","operator":null,"version":null,"linked_to":"69000","reverse":true},{"package_id":0,"type":0,"name":"LipidomicsR","operator":null,"version":null,"linked_to":"69384","reverse":true},{"package_id":0,"type":0,"name":"LogisticCopula","operator":null,"version":null,"linked_to":"70329","reverse":true},{"package_id":0,"type":0,"name":"LongDat","operator":null,"version":null,"linked_to":"70513","reverse":true},{"package_id":0,"type":0,"name":"LorMe","operator":null,"version":null,"linked_to":"70713","reverse":true},{"package_id":0,"type":0,"name":"MAICtools","operator":null,"version":null,"linked_to":"71949","reverse":true},{"package_id":0,"type":0,"name":"MAPCtools","operator":null,"version":null,"linked_to":"72360","reverse":true},{"package_id":0,"type":0,"name":"MBMethPred","operator":null,"version":null,"linked_to":"74381","reverse":true},{"package_id":0,"type":0,"name":"MCM","operator":null,"version":null,"linked_to":"74684","reverse":true},{"package_id":0,"type":0,"name":"MDPIexploreR","operator":null,"version":null,"linked_to":"75104","reverse":true},{"package_id":0,"type":0,"name":"MEAanalysis","operator":null,"version":null,"linked_to":"75175","reverse":true},{"package_id":0,"type":0,"name":"MFO","operator":null,"version":null,"linked_to":"76765","reverse":true},{"package_id":0,"type":0,"name":"MIC","operator":null,"version":null,"linked_to":"77310","reverse":true},{"package_id":0,"type":0,"name":"MIMER","operator":null,"version":null,"linked_to":"77895","reverse":true},{"package_id":0,"type":0,"name":"MMeM","operator":null,"version":null,"linked_to":"80259","reverse":true},{"package_id":0,"type":0,"name":"MSbox","operator":null,"version":null,"linked_to":"82488","reverse":true},{"package_id":0,"type":0,"name":"MVN","operator":null,"version":null,"linked_to":"84097","reverse":true},{"package_id":0,"type":0,"name":"MaOEA","operator":null,"version":null,"linked_to":"72301","reverse":true},{"package_id":0,"type":0,"name":"MadanText","operator":null,"version":null,"linked_to":"71703","reverse":true},{"package_id":0,"type":0,"name":"MadanTextNetwork","operator":null,"version":null,"linked_to":"71704","reverse":true},{"package_id":0,"type":0,"name":"MantaID","operator":null,"version":null,"linked_to":"72206","reverse":true},{"package_id":0,"type":0,"name":"Mapinguari","operator":null,"version":null,"linked_to":"72422","reverse":true},{"package_id":0,"type":0,"name":"MarginalMediation","operator":null,"version":null,"linked_to":"72808","reverse":true},{"package_id":0,"type":0,"name":"MazamaCoreUtils","operator":null,"version":null,"linked_to":"74189","reverse":true},{"package_id":0,"type":0,"name":"MazamaLocationUtils","operator":null,"version":null,"linked_to":"74214","reverse":true},{"package_id":0,"type":0,"name":"MazamaSpatialUtils","operator":null,"version":null,"linked_to":"74233","reverse":true},{"package_id":0,"type":0,"name":"MazamaTimeSeries","operator":null,"version":null,"linked_to":"74245","reverse":true},{"package_id":0,"type":0,"name":"MeasurementDiagnostics","operator":null,"version":null,"linked_to":"75207","reverse":true},{"package_id":0,"type":0,"name":"MetAlyzer","operator":null,"version":null,"linked_to":"76096","reverse":true},{"package_id":0,"type":0,"name":"MetaUtility","operator":null,"version":null,"linked_to":"76376","reverse":true},{"package_id":0,"type":0,"name":"MethScope","operator":null,"version":null,"linked_to":"76506","reverse":true},{"package_id":0,"type":0,"name":"MolgenisArmadillo","operator":null,"version":null,"linked_to":"81117","reverse":true},{"package_id":0,"type":0,"name":"MplusLGM","operator":null,"version":null,"linked_to":"81999","reverse":true},{"package_id":0,"type":0,"name":"NBDCtools","operator":null,"version":null,"linked_to":"84984","reverse":true},{"package_id":0,"type":0,"name":"NHSDataDictionaRy","operator":null,"version":null,"linked_to":"86455","reverse":true},{"package_id":0,"type":0,"name":"NHSRplotthedots","operator":null,"version":null,"linked_to":"86469","reverse":true},{"package_id":0,"type":0,"name":"NMA","operator":null,"version":null,"linked_to":"87306","reverse":true},{"package_id":0,"type":0,"name":"NMF","operator":null,"version":null,"linked_to":"87388","reverse":true},{"package_id":0,"type":0,"name":"NOVA","operator":null,"version":null,"linked_to":"88430","reverse":true},{"package_id":0,"type":0,"name":"NUSS","operator":null,"version":null,"linked_to":"89063","reverse":true},{"package_id":0,"type":0,"name":"NaileR","operator":null,"version":null,"linked_to":"84569","reverse":true},{"package_id":0,"type":0,"name":"NeuralSens","operator":null,"version":null,"linked_to":"86027","reverse":true},{"package_id":0,"type":0,"name":"NeuroDecodeR","operator":null,"version":null,"linked_to":"86071","reverse":true},{"package_id":0,"type":0,"name":"Nmisc","operator":null,"version":null,"linked_to":"87411","reverse":true},{"package_id":0,"type":0,"name":"NormalityAssessment","operator":null,"version":null,"linked_to":"88324","reverse":true},{"package_id":0,"type":0,"name":"ORFID","operator":null,"version":null,"linked_to":"91609","reverse":true},{"package_id":0,"type":0,"name":"ORION","operator":null,"version":null,"linked_to":"91663","reverse":true},{"package_id":0,"type":0,"name":"ORscraper","operator":null,"version":null,"linked_to":"91717","reverse":true},{"package_id":0,"type":0,"name":"OlinkAnalyze","operator":null,"version":null,"linked_to":"89858","reverse":true},{"package_id":0,"type":0,"name":"OmopOnSpark","operator":null,"version":null,"linked_to":"90011","reverse":true},{"package_id":0,"type":0,"name":"OmopSketch","operator":null,"version":null,"linked_to":"90014","reverse":true},{"package_id":0,"type":0,"name":"OmopViewer","operator":null,"version":null,"linked_to":"90029","reverse":true},{"package_id":0,"type":0,"name":"OpEnCAST","operator":null,"version":null,"linked_to":"90531","reverse":true},{"package_id":0,"type":0,"name":"OpEnHiMR","operator":null,"version":null,"linked_to":"90648","reverse":true},{"package_id":0,"type":0,"name":"OpenMindat","operator":null,"version":null,"linked_to":"90699","reverse":true},{"package_id":0,"type":0,"name":"OpenRepGrid","operator":null,"version":null,"linked_to":"90769","reverse":true},{"package_id":0,"type":0,"name":"OpenRepGrid.ic","operator":null,"version":null,"linked_to":"90778","reverse":true},{"package_id":0,"type":0,"name":"OpenSourceAP.DownloadR","operator":null,"version":null,"linked_to":"90818","reverse":true},{"package_id":0,"type":0,"name":"OptimaRegion","operator":null,"version":null,"linked_to":"91148","reverse":true},{"package_id":0,"type":0,"name":"OralOpioids","operator":null,"version":null,"linked_to":"91386","reverse":true},{"package_id":0,"type":0,"name":"OrgHeatmap","operator":null,"version":null,"linked_to":"91622","reverse":true},{"package_id":0,"type":0,"name":"OtsuFire","operator":null,"version":null,"linked_to":"91988","reverse":true},{"package_id":0,"type":0,"name":"PEIMAN2","operator":null,"version":null,"linked_to":"95308","reverse":true},{"package_id":0,"type":0,"name":"PFIM","operator":null,"version":null,"linked_to":"95879","reverse":true},{"package_id":0,"type":0,"name":"PKPDsim","operator":null,"version":null,"linked_to":"97466","reverse":true},{"package_id":0,"type":0,"name":"PKbioanalysis","operator":null,"version":null,"linked_to":"97195","reverse":true},{"package_id":0,"type":0,"name":"PL94171","operator":null,"version":null,"linked_to":"97501","reverse":true},{"package_id":0,"type":0,"name":"POMADE","operator":null,"version":null,"linked_to":"99140","reverse":true},{"package_id":0,"type":0,"name":"PRISMA2020","operator":null,"version":null,"linked_to":"100925","reverse":true},{"package_id":0,"type":0,"name":"PSPI","operator":null,"version":null,"linked_to":"102146","reverse":true},{"package_id":0,"type":0,"name":"PStrata","operator":null,"version":null,"linked_to":"102246","reverse":true},{"package_id":0,"type":0,"name":"PUMP","operator":null,"version":null,"linked_to":"102808","reverse":true},{"package_id":0,"type":0,"name":"PaRe","operator":null,"version":null,"linked_to":"93411","reverse":true},{"package_id":0,"type":0,"name":"PatientGenerator","operator":null,"version":null,"linked_to":"93911","reverse":true},{"package_id":0,"type":0,"name":"PatientProfiles","operator":null,"version":null,"linked_to":"93917","reverse":true},{"package_id":0,"type":0,"name":"PepMapViz","operator":null,"version":null,"linked_to":"95490","reverse":true},{"package_id":0,"type":0,"name":"PesticideLoadIndicator","operator":null,"version":null,"linked_to":"95810","reverse":true},{"package_id":0,"type":0,"name":"PlateVision","operator":null,"version":null,"linked_to":"97638","reverse":true},{"package_id":0,"type":0,"name":"PolisheR","operator":null,"version":null,"linked_to":"98850","reverse":true},{"package_id":0,"type":0,"name":"PoolTestR","operator":null,"version":null,"linked_to":"99280","reverse":true},{"package_id":0,"type":0,"name":"PopComm","operator":null,"version":null,"linked_to":"99313","reverse":true},{"package_id":0,"type":0,"name":"PopED","operator":null,"version":null,"linked_to":"99328","reverse":true},{"package_id":0,"type":0,"name":"PrInDT","operator":null,"version":null,"linked_to":"100820","reverse":true},{"package_id":0,"type":0,"name":"PreProcessRecordLinkage","operator":null,"version":null,"linked_to":"100520","reverse":true},{"package_id":0,"type":0,"name":"PriceIndices","operator":null,"version":null,"linked_to":"100674","reverse":true},{"package_id":0,"type":0,"name":"ProActive","operator":null,"version":null,"linked_to":"100970","reverse":true},{"package_id":0,"type":0,"name":"ProPublicaR","operator":null,"version":null,"linked_to":"101591","reverse":true},{"package_id":0,"type":0,"name":"PsychWordVec","operator":null,"version":null,"linked_to":"102467","reverse":true},{"package_id":0,"type":0,"name":"PubChemR","operator":null,"version":null,"linked_to":"102642","reverse":true},{"package_id":0,"type":0,"name":"PubMedMining","operator":null,"version":null,"linked_to":"102733","reverse":true},{"package_id":0,"type":0,"name":"PubMedWordcloud","operator":null,"version":null,"linked_to":"102743","reverse":true},{"package_id":0,"type":0,"name":"PupillometryR","operator":null,"version":null,"linked_to":"102830","reverse":true},{"package_id":0,"type":0,"name":"PvSTATEM","operator":null,"version":null,"linked_to":"102969","reverse":true},{"package_id":0,"type":0,"name":"QAIG","operator":null,"version":null,"linked_to":"103180","reverse":true},{"package_id":0,"type":0,"name":"QTL.gCIMapping","operator":null,"version":null,"linked_to":"103943","reverse":true},{"package_id":0,"type":0,"name":"QTL.gCIMapping.GUI","operator":null,"version":null,"linked_to":"103951","reverse":true},{"package_id":0,"type":0,"name":"Qploidy","operator":null,"version":null,"linked_to":"103638","reverse":true},{"package_id":0,"type":0,"name":"R2jags","operator":null,"version":null,"linked_to":"104988","reverse":true},{"package_id":0,"type":0,"name":"R2ucare","operator":null,"version":null,"linked_to":"105130","reverse":true},{"package_id":0,"type":0,"name":"R4GoodPersonalFinances","operator":null,"version":null,"linked_to":"105174","reverse":true},{"package_id":0,"type":0,"name":"R6P","operator":null,"version":null,"linked_to":"105247","reverse":true},{"package_id":0,"type":0,"name":"RAINBOWR","operator":null,"version":null,"linked_to":"105651","reverse":true},{"package_id":0,"type":0,"name":"RALSA","operator":null,"version":null,"linked_to":"105702","reverse":true},{"package_id":0,"type":0,"name":"RAQSAPI","operator":null,"version":null,"linked_to":"106309","reverse":true},{"package_id":0,"type":0,"name":"RAT","operator":null,"version":null,"linked_to":"106509","reverse":true},{"package_id":0,"type":0,"name":"RBaseX","operator":null,"version":null,"linked_to":"106867","reverse":true},{"package_id":0,"type":0,"name":"RCPA","operator":null,"version":null,"linked_to":"108012","reverse":true},{"package_id":0,"type":0,"name":"RCT","operator":null,"version":null,"linked_to":"108780","reverse":true},{"package_id":0,"type":0,"name":"RCTS","operator":null,"version":null,"linked_to":"108795","reverse":true},{"package_id":0,"type":0,"name":"RChASM","operator":null,"version":null,"linked_to":"107451","reverse":true},{"package_id":0,"type":0,"name":"RClimacell","operator":null,"version":null,"linked_to":"107576","reverse":true},{"package_id":0,"type":0,"name":"RDML","operator":null,"version":null,"linked_to":"109173","reverse":true},{"package_id":0,"type":0,"name":"REDCapDM","operator":null,"version":null,"linked_to":"110096","reverse":true},{"package_id":0,"type":0,"name":"REDCapTidieR","operator":null,"version":null,"linked_to":"110133","reverse":true},{"package_id":0,"type":0,"name":"REMixed","operator":null,"version":null,"linked_to":"110873","reverse":true},{"package_id":0,"type":0,"name":"REPS","operator":null,"version":null,"linked_to":"111399","reverse":true},{"package_id":0,"type":0,"name":"RFishBC","operator":null,"version":null,"linked_to":"112250","reverse":true},{"package_id":0,"type":0,"name":"RHclust","operator":null,"version":null,"linked_to":"113038","reverse":true},{"package_id":0,"type":0,"name":"RJafroc","operator":null,"version":null,"linked_to":"113797","reverse":true},{"package_id":0,"type":0,"name":"RJalaliDate","operator":null,"version":null,"linked_to":"113822","reverse":true},{"package_id":0,"type":0,"name":"RKorAPClient","operator":null,"version":null,"linked_to":"114097","reverse":true},{"package_id":0,"type":0,"name":"RLogicalOps","operator":null,"version":null,"linked_to":"114420","reverse":true},{"package_id":0,"type":0,"name":"RNAseqQC","operator":null,"version":null,"linked_to":"115254","reverse":true},{"package_id":0,"type":0,"name":"RNeXML","operator":null,"version":null,"linked_to":"115382","reverse":true},{"package_id":0,"type":0,"name":"ROCnGO","operator":null,"version":null,"linked_to":"116253","reverse":true},{"package_id":0,"type":0,"name":"ROMDB","operator":null,"version":null,"linked_to":"116576","reverse":true},{"package_id":0,"type":0,"name":"RPyGeo","operator":null,"version":null,"linked_to":"117731","reverse":true},{"package_id":0,"type":0,"name":"RSAGA","operator":null,"version":null,"linked_to":"118234","reverse":true},{"package_id":0,"type":0,"name":"RSDA","operator":null,"version":null,"linked_to":"118471","reverse":true},{"package_id":0,"type":0,"name":"RSentiment","operator":null,"version":null,"linked_to":"118553","reverse":true},{"package_id":0,"type":0,"name":"RSqlParser","operator":null,"version":null,"linked_to":"118996","reverse":true},{"package_id":0,"type":0,"name":"RTL","operator":null,"version":null,"linked_to":"119652","reverse":true},{"package_id":0,"type":0,"name":"Rapi","operator":null,"version":null,"linked_to":"106189","reverse":true},{"package_id":0,"type":0,"name":"RareComb","operator":null,"version":null,"linked_to":"106323","reverse":true},{"package_id":0,"type":0,"name":"RavenR","operator":null,"version":null,"linked_to":"106675","reverse":true},{"package_id":0,"type":0,"name":"Rbearcat","operator":null,"version":null,"linked_to":"106914","reverse":true},{"package_id":0,"type":0,"name":"RcensusPkg","operator":null,"version":null,"linked_to":"107435","reverse":true},{"package_id":0,"type":0,"name":"RchivalTag","operator":null,"version":null,"linked_to":"107503","reverse":true},{"package_id":0,"type":0,"name":"Rcurvep","operator":null,"version":null,"linked_to":"108829","reverse":true},{"package_id":0,"type":0,"name":"RefManageR","operator":null,"version":null,"linked_to":"110367","reverse":true},{"package_id":0,"type":0,"name":"RegDDM","operator":null,"version":null,"linked_to":"110450","reverse":true},{"package_id":0,"type":0,"name":"ReporterScore","operator":null,"version":null,"linked_to":"111241","reverse":true},{"package_id":0,"type":0,"name":"RestoreNet","operator":null,"version":null,"linked_to":"111755","reverse":true},{"package_id":0,"type":0,"name":"ReviewR","operator":null,"version":null,"linked_to":"111985","reverse":true},{"package_id":0,"type":0,"name":"Revticulate","operator":null,"version":null,"linked_to":"112005","reverse":true},{"package_id":0,"type":0,"name":"Riex","operator":null,"version":null,"linked_to":"113339","reverse":true},{"package_id":0,"type":0,"name":"Rilostat","operator":null,"version":null,"linked_to":"113373","reverse":true},{"package_id":0,"type":0,"name":"RivRetrieve","operator":null,"version":null,"linked_to":"113762","reverse":true},{"package_id":0,"type":0,"name":"RmecabKo","operator":null,"version":null,"linked_to":"114774","reverse":true},{"package_id":0,"type":0,"name":"Rmonize","operator":null,"version":null,"linked_to":"114934","reverse":true},{"package_id":0,"type":0,"name":"RoME","operator":null,"version":null,"linked_to":"116577","reverse":true},{"package_id":0,"type":0,"name":"Robyn","operator":null,"version":null,"linked_to":"116170","reverse":true},{"package_id":0,"type":0,"name":"RonFHIR","operator":null,"version":null,"linked_to":"116588","reverse":true},{"package_id":0,"type":0,"name":"RootscanR","operator":null,"version":null,"linked_to":"116609","reverse":true},{"package_id":0,"type":0,"name":"Rprofet","operator":null,"version":null,"linked_to":"117653","reverse":true},{"package_id":0,"type":0,"name":"Rrdap","operator":null,"version":null,"linked_to":"118027","reverse":true},{"package_id":0,"type":0,"name":"Rrepest","operator":null,"version":null,"linked_to":"118072","reverse":true},{"package_id":0,"type":0,"name":"Rsagacmd","operator":null,"version":null,"linked_to":"118242","reverse":true},{"package_id":0,"type":0,"name":"Rsearch","operator":null,"version":null,"linked_to":"118521","reverse":true},{"package_id":0,"type":0,"name":"Rsgf","operator":null,"version":null,"linked_to":"118587","reverse":true},{"package_id":0,"type":0,"name":"Rwhois","operator":null,"version":null,"linked_to":"120543","reverse":true},{"package_id":0,"type":0,"name":"SCDB","operator":null,"version":null,"linked_to":"122281","reverse":true},{"package_id":0,"type":0,"name":"SCFMonitor","operator":null,"version":null,"linked_to":"122352","reverse":true},{"package_id":0,"type":0,"name":"SCtools","operator":null,"version":null,"linked_to":"122949","reverse":true},{"package_id":0,"type":0,"name":"SDGdetector","operator":null,"version":null,"linked_to":"123118","reverse":true},{"package_id":0,"type":0,"name":"SDMtune","operator":null,"version":null,"linked_to":"123204","reverse":true},{"package_id":0,"type":0,"name":"SEAHORS","operator":null,"version":null,"linked_to":"123337","reverse":true},{"package_id":0,"type":0,"name":"SEERaBomb","operator":null,"version":null,"linked_to":"123674","reverse":true},{"package_id":0,"type":0,"name":"SEQTaRget","operator":null,"version":null,"linked_to":"124636","reverse":true},{"package_id":0,"type":0,"name":"SIAmodules","operator":null,"version":null,"linked_to":"126488","reverse":true},{"package_id":0,"type":0,"name":"SIMle","operator":null,"version":null,"linked_to":"127112","reverse":true},{"package_id":0,"type":0,"name":"SIRE","operator":null,"version":null,"linked_to":"127709","reverse":true},{"package_id":0,"type":0,"name":"SLEMI","operator":null,"version":null,"linked_to":"128322","reverse":true},{"package_id":0,"type":0,"name":"SPARTAAS","operator":null,"version":null,"linked_to":"130657","reverse":true},{"package_id":0,"type":0,"name":"SQL","operator":null,"version":null,"linked_to":"132949","reverse":true},{"package_id":0,"type":0,"name":"SSEparser","operator":null,"version":null,"linked_to":"133361","reverse":true},{"package_id":0,"type":0,"name":"SSHAARP","operator":null,"version":null,"linked_to":"133406","reverse":true},{"package_id":0,"type":0,"name":"SSRA","operator":null,"version":null,"linked_to":"133543","reverse":true},{"package_id":0,"type":0,"name":"STICr","operator":null,"version":null,"linked_to":"134670","reverse":true},{"package_id":0,"type":0,"name":"SUMO","operator":null,"version":null,"linked_to":"135848","reverse":true},{"package_id":0,"type":0,"name":"SVAlignR","operator":null,"version":null,"linked_to":"137021","reverse":true},{"package_id":0,"type":0,"name":"SWTools","operator":null,"version":null,"linked_to":"137502","reverse":true},{"package_id":0,"type":0,"name":"SafeVote","operator":null,"version":null,"linked_to":"121212","reverse":true},{"package_id":0,"type":0,"name":"SchoolDataIT","operator":null,"version":null,"linked_to":"122402","reverse":true},{"package_id":0,"type":0,"name":"ScriptMapR","operator":null,"version":null,"linked_to":"122858","reverse":true},{"package_id":0,"type":0,"name":"SeaSondeR","operator":null,"version":null,"linked_to":"123412","reverse":true},{"package_id":0,"type":0,"name":"SeaVal","operator":null,"version":null,"linked_to":"123415","reverse":true},{"package_id":0,"type":0,"name":"SemanticDistance","operator":null,"version":null,"linked_to":"123947","reverse":true},{"package_id":0,"type":0,"name":"SeroTrackR","operator":null,"version":null,"linked_to":"124779","reverse":true},{"package_id":0,"type":0,"name":"SerolyzeR","operator":null,"version":null,"linked_to":"124767","reverse":true},{"package_id":0,"type":0,"name":"SherlockHolmes","operator":null,"version":null,"linked_to":"125669","reverse":true},{"package_id":0,"type":0,"name":"ShinyQuickStarter","operator":null,"version":null,"linked_to":"126139","reverse":true},{"package_id":0,"type":0,"name":"ShortForm","operator":null,"version":null,"linked_to":"126345","reverse":true},{"package_id":0,"type":0,"name":"Sie2nts","operator":null,"version":null,"linked_to":"126553","reverse":true},{"package_id":0,"type":0,"name":"SimNPH","operator":null,"version":null,"linked_to":"127192","reverse":true},{"package_id":0,"type":0,"name":"SimplyAgree","operator":null,"version":null,"linked_to":"127349","reverse":true},{"package_id":0,"type":0,"name":"SleepCycles","operator":null,"version":null,"linked_to":"128288","reverse":true},{"package_id":0,"type":0,"name":"SlideCNA","operator":null,"version":null,"linked_to":"128387","reverse":true},{"package_id":0,"type":0,"name":"SoilTaxonomy","operator":null,"version":null,"linked_to":"129525","reverse":true},{"package_id":0,"type":0,"name":"SoundShape","operator":null,"version":null,"linked_to":"129862","reverse":true},{"package_id":0,"type":0,"name":"Spectran","operator":null,"version":null,"linked_to":"131892","reverse":true},{"package_id":0,"type":0,"name":"SpiceFP","operator":null,"version":null,"linked_to":"132114","reverse":true},{"package_id":0,"type":0,"name":"SppTrend","operator":null,"version":null,"linked_to":"132703","reverse":true},{"package_id":0,"type":0,"name":"StatTeacherAssistant","operator":null,"version":null,"linked_to":"134382","reverse":true},{"package_id":0,"type":0,"name":"StepRegShiny","operator":null,"version":null,"linked_to":"134565","reverse":true},{"package_id":0,"type":0,"name":"SticsRFiles","operator":null,"version":null,"linked_to":"134674","reverse":true},{"package_id":0,"type":0,"name":"StormR","operator":null,"version":null,"linked_to":"134893","reverse":true},{"package_id":0,"type":0,"name":"StratigrapheR","operator":null,"version":null,"linked_to":"135134","reverse":true},{"package_id":0,"type":0,"name":"SunsVoc","operator":null,"version":null,"linked_to":"135920","reverse":true},{"package_id":0,"type":0,"name":"SveltePlots","operator":null,"version":null,"linked_to":"137092","reverse":true},{"package_id":0,"type":0,"name":"SwimmeR","operator":null,"version":null,"linked_to":"137376","reverse":true},{"package_id":0,"type":0,"name":"Sysrecon","operator":null,"version":null,"linked_to":"137812","reverse":true},{"package_id":0,"type":0,"name":"T2Qv","operator":null,"version":null,"linked_to":"137867","reverse":true},{"package_id":0,"type":0,"name":"TDCM","operator":null,"version":null,"linked_to":"138881","reverse":true},{"package_id":0,"type":0,"name":"TFunHDDC","operator":null,"version":null,"linked_to":"140128","reverse":true},{"package_id":0,"type":0,"name":"TUFLOWR","operator":null,"version":null,"linked_to":"145042","reverse":true},{"package_id":0,"type":0,"name":"TUGLab","operator":null,"version":null,"linked_to":"145064","reverse":true},{"package_id":0,"type":0,"name":"TcGSA","operator":null,"version":null,"linked_to":"138689","reverse":true},{"package_id":0,"type":0,"name":"TernTables","operator":null,"version":null,"linked_to":"139358","reverse":true},{"package_id":0,"type":0,"name":"TestAnaAPP","operator":null,"version":null,"linked_to":"139496","reverse":true},{"package_id":0,"type":0,"name":"TestGardener","operator":null,"version":null,"linked_to":"139600","reverse":true},{"package_id":0,"type":0,"name":"TexExamRandomizer","operator":null,"version":null,"linked_to":"139705","reverse":true},{"package_id":0,"type":0,"name":"TheOpenAIR","operator":null,"version":null,"linked_to":"140271","reverse":true},{"package_id":0,"type":0,"name":"TheseusPlot","operator":null,"version":null,"linked_to":"140296","reverse":true},{"package_id":0,"type":0,"name":"ThreeWiseMonkeys","operator":null,"version":null,"linked_to":"140422","reverse":true},{"package_id":0,"type":0,"name":"TiPS","operator":null,"version":null,"linked_to":"142212","reverse":true},{"package_id":0,"type":0,"name":"TidyDensity","operator":null,"version":null,"linked_to":"140756","reverse":true},{"package_id":0,"type":0,"name":"TidyMultiqc","operator":null,"version":null,"linked_to":"141033","reverse":true},{"package_id":0,"type":0,"name":"Tivy","operator":null,"version":null,"linked_to":"142264","reverse":true},{"package_id":0,"type":0,"name":"Toothnroll","operator":null,"version":null,"linked_to":"142728","reverse":true},{"package_id":0,"type":0,"name":"Tplyr","operator":null,"version":null,"linked_to":"143058","reverse":true},{"package_id":0,"type":0,"name":"TransProR","operator":null,"version":null,"linked_to":"143620","reverse":true},{"package_id":0,"type":0,"name":"TreeDiagram","operator":null,"version":null,"linked_to":"143791","reverse":true},{"package_id":0,"type":0,"name":"TriMatch","operator":null,"version":null,"linked_to":"144208","reverse":true},{"package_id":0,"type":0,"name":"UCSCXenaShiny","operator":null,"version":null,"linked_to":"145610","reverse":true},{"package_id":0,"type":0,"name":"UniprotR","operator":null,"version":null,"linked_to":"146149","reverse":true},{"package_id":0,"type":0,"name":"VDAP","operator":null,"version":null,"linked_to":"147588","reverse":true},{"package_id":0,"type":0,"name":"VennItem","operator":null,"version":null,"linked_to":"147854","reverse":true},{"package_id":0,"type":0,"name":"VertexWiseR","operator":null,"version":null,"linked_to":"147906","reverse":true},{"package_id":0,"type":0,"name":"Virusparies","operator":null,"version":null,"linked_to":"148320","reverse":true},{"package_id":0,"type":0,"name":"WINS","operator":null,"version":null,"linked_to":"150513","reverse":true},{"package_id":0,"type":0,"name":"WaterBalanceR","operator":null,"version":null,"linked_to":"149355","reverse":true},{"package_id":0,"type":0,"name":"WeatherSentiment","operator":null,"version":null,"linked_to":"149708","reverse":true},{"package_id":0,"type":0,"name":"Xplortext","operator":null,"version":null,"linked_to":"152003","reverse":true},{"package_id":0,"type":0,"name":"Z10","operator":null,"version":null,"linked_to":"152635","reverse":true},{"package_id":0,"type":0,"name":"aMNLFA","operator":null,"version":null,"linked_to":"2595","reverse":true},{"package_id":0,"type":0,"name":"aNCA","operator":null,"version":null,"linked_to":"2771","reverse":true},{"package_id":0,"type":0,"name":"abba","operator":null,"version":null,"linked_to":"21","reverse":true},{"package_id":0,"type":0,"name":"abcrf","operator":null,"version":null,"linked_to":"53","reverse":true},{"package_id":0,"type":0,"name":"abjutils","operator":null,"version":null,"linked_to":"103","reverse":true},{"package_id":0,"type":0,"name":"accessrmd","operator":null,"version":null,"linked_to":"257","reverse":true},{"package_id":0,"type":0,"name":"accucor","operator":null,"version":null,"linked_to":"282","reverse":true},{"package_id":0,"type":0,"name":"ace2fastq","operator":null,"version":null,"linked_to":"307","reverse":true},{"package_id":0,"type":0,"name":"acledR","operator":null,"version":null,"linked_to":"359","reverse":true},{"package_id":0,"type":0,"name":"acoRn","operator":null,"version":null,"linked_to":"381","reverse":true},{"package_id":0,"type":0,"name":"acroname","operator":null,"version":null,"linked_to":"396","reverse":true},{"package_id":0,"type":0,"name":"act","operator":null,"version":null,"linked_to":"415","reverse":true},{"package_id":0,"type":0,"name":"actel","operator":null,"version":null,"linked_to":"433","reverse":true},{"package_id":0,"type":0,"name":"activAnalyzer","operator":null,"version":null,"linked_to":"456","reverse":true},{"package_id":0,"type":0,"name":"adas.utils","operator":null,"version":null,"linked_to":"690","reverse":true},{"package_id":0,"type":0,"name":"addinsJoaoMelo","operator":null,"version":null,"linked_to":"774","reverse":true},{"package_id":0,"type":0,"name":"addinsOutline","operator":null,"version":null,"linked_to":"779","reverse":true},{"package_id":0,"type":0,"name":"adelie","operator":null,"version":null,"linked_to":"885","reverse":true},{"package_id":0,"type":0,"name":"admiral","operator":null,"version":null,"linked_to":"1045","reverse":true},{"package_id":0,"type":0,"name":"admiraldev","operator":null,"version":null,"linked_to":"1081","reverse":true},{"package_id":0,"type":0,"name":"admiralmetabolic","operator":null,"version":null,"linked_to":"1092","reverse":true},{"package_id":0,"type":0,"name":"admiralneuro","operator":null,"version":null,"linked_to":"1095","reverse":true},{"package_id":0,"type":0,"name":"admiralophtha","operator":null,"version":null,"linked_to":"1107","reverse":true},{"package_id":0,"type":0,"name":"admiralvaccine","operator":null,"version":null,"linked_to":"1119","reverse":true},{"package_id":0,"type":0,"name":"admixr","operator":null,"version":null,"linked_to":"1184","reverse":true},{"package_id":0,"type":0,"name":"adobeanalyticsr","operator":null,"version":null,"linked_to":"1222","reverse":true},{"package_id":0,"type":0,"name":"aedseo","operator":null,"version":null,"linked_to":"1334","reverse":true},{"package_id":0,"type":0,"name":"aelab","operator":null,"version":null,"linked_to":"1344","reverse":true},{"package_id":0,"type":0,"name":"aftables","operator":null,"version":null,"linked_to":"1458","reverse":true},{"package_id":0,"type":0,"name":"agcounts","operator":null,"version":null,"linked_to":"1494","reverse":true},{"package_id":0,"type":0,"name":"aggTrees","operator":null,"version":null,"linked_to":"1538","reverse":true},{"package_id":0,"type":0,"name":"aggreCAT","operator":null,"version":null,"linked_to":"1529","reverse":true},{"package_id":0,"type":0,"name":"agregR","operator":null,"version":null,"linked_to":"1591","reverse":true},{"package_id":0,"type":0,"name":"agricolaeplotr","operator":null,"version":null,"linked_to":"1600","reverse":true},{"package_id":0,"type":0,"name":"agrobox","operator":null,"version":null,"linked_to":"1645","reverse":true},{"package_id":0,"type":0,"name":"ags","operator":null,"version":null,"linked_to":"1692","reverse":true},{"package_id":0,"type":0,"name":"agvgd","operator":null,"version":null,"linked_to":"1711","reverse":true},{"package_id":0,"type":0,"name":"aihuman","operator":null,"version":null,"linked_to":"1833","reverse":true},{"package_id":0,"type":0,"name":"aire.zmvm","operator":null,"version":null,"linked_to":"1857","reverse":true},{"package_id":0,"type":0,"name":"airship","operator":null,"version":null,"linked_to":"1938","reverse":true},{"package_id":0,"type":0,"name":"akc","operator":null,"version":null,"linked_to":"1965","reverse":true},{"package_id":0,"type":0,"name":"alarmdata","operator":null,"version":null,"linked_to":"2032","reverse":true},{"package_id":0,"type":0,"name":"ale","operator":null,"version":null,"linked_to":"2087","reverse":true},{"package_id":0,"type":0,"name":"alfr","operator":null,"version":null,"linked_to":"2106","reverse":true},{"package_id":0,"type":0,"name":"allMT","operator":null,"version":null,"linked_to":"2223","reverse":true},{"package_id":0,"type":0,"name":"allestimates","operator":null,"version":null,"linked_to":"2211","reverse":true},{"package_id":0,"type":0,"name":"allofus","operator":null,"version":null,"linked_to":"2226","reverse":true},{"package_id":0,"type":0,"name":"alphavantagepf","operator":null,"version":null,"linked_to":"2354","reverse":true},{"package_id":0,"type":0,"name":"alphavantager","operator":null,"version":null,"linked_to":"2355","reverse":true},{"package_id":0,"type":0,"name":"altfuelr","operator":null,"version":null,"linked_to":"2417","reverse":true},{"package_id":0,"type":0,"name":"angstromATE","operator":null,"version":null,"linked_to":"2831","reverse":true},{"package_id":0,"type":0,"name":"aniSNA","operator":null,"version":null,"linked_to":"2896","reverse":true},{"package_id":0,"type":0,"name":"anipaths","operator":null,"version":null,"linked_to":"2884","reverse":true},{"package_id":0,"type":0,"name":"annotater","operator":null,"version":null,"linked_to":"2945","reverse":true},{"package_id":0,"type":0,"name":"antaresRead","operator":null,"version":null,"linked_to":"3074","reverse":true},{"package_id":0,"type":0,"name":"anyflights","operator":null,"version":null,"linked_to":"3232","reverse":true},{"package_id":0,"type":0,"name":"apa","operator":null,"version":null,"linked_to":"3337","reverse":true},{"package_id":0,"type":0,"name":"apa7","operator":null,"version":null,"linked_to":"3346","reverse":true},{"package_id":0,"type":0,"name":"apollo","operator":null,"version":null,"linked_to":"3598","reverse":true},{"package_id":0,"type":0,"name":"appRiori","operator":null,"version":null,"linked_to":"3666","reverse":true},{"package_id":0,"type":0,"name":"aquodom","operator":null,"version":null,"linked_to":"3811","reverse":true},{"package_id":0,"type":0,"name":"arabic2kansuji","operator":null,"version":null,"linked_to":"3820","reverse":true},{"package_id":0,"type":0,"name":"archetyper","operator":null,"version":null,"linked_to":"3943","reverse":true},{"package_id":0,"type":0,"name":"archiveRetriever","operator":null,"version":null,"linked_to":"3980","reverse":true},{"package_id":0,"type":0,"name":"ardl.nardl","operator":null,"version":null,"linked_to":"4075","reverse":true},{"package_id":0,"type":0,"name":"arete","operator":null,"version":null,"linked_to":"4119","reverse":true},{"package_id":0,"type":0,"name":"arf","operator":null,"version":null,"linked_to":"4120","reverse":true},{"package_id":0,"type":0,"name":"artpack","operator":null,"version":null,"linked_to":"4507","reverse":true},{"package_id":0,"type":0,"name":"asciiSetupReader","operator":null,"version":null,"linked_to":"4656","reverse":true},{"package_id":0,"type":0,"name":"asciiruler","operator":null,"version":null,"linked_to":"4655","reverse":true},{"package_id":0,"type":0,"name":"aslib","operator":null,"version":null,"linked_to":"4729","reverse":true},{"package_id":0,"type":0,"name":"asremlPlus","operator":null,"version":null,"linked_to":"4787","reverse":true},{"package_id":0,"type":0,"name":"assignPOP","operator":null,"version":null,"linked_to":"4923","reverse":true},{"package_id":0,"type":0,"name":"atpolR","operator":null,"version":null,"linked_to":"5229","reverse":true},{"package_id":0,"type":0,"name":"atrrr","operator":null,"version":null,"linked_to":"5238","reverse":true},{"package_id":0,"type":0,"name":"attachment","operator":null,"version":null,"linked_to":"5249","reverse":true},{"package_id":0,"type":0,"name":"attrib","operator":null,"version":null,"linked_to":"5279","reverse":true},{"package_id":0,"type":0,"name":"auk","operator":null,"version":null,"linked_to":"5362","reverse":true},{"package_id":0,"type":0,"name":"ausplotsR","operator":null,"version":null,"linked_to":"5399","reverse":true},{"package_id":0,"type":0,"name":"autoGO","operator":null,"version":null,"linked_to":"5469","reverse":true},{"package_id":0,"type":0,"name":"autoReg","operator":null,"version":null,"linked_to":"5597","reverse":true},{"package_id":0,"type":0,"name":"autogam","operator":null,"version":null,"linked_to":"5467","reverse":true},{"package_id":0,"type":0,"name":"autoharp","operator":null,"version":null,"linked_to":"5483","reverse":true},{"package_id":0,"type":0,"name":"autoimport","operator":null,"version":null,"linked_to":"5511","reverse":true},{"package_id":0,"type":0,"name":"autoslider.core","operator":null,"version":null,"linked_to":"5618","reverse":true},{"package_id":0,"type":0,"name":"autostats","operator":null,"version":null,"linked_to":"5629","reverse":true},{"package_id":0,"type":0,"name":"autothresholdr","operator":null,"version":null,"linked_to":"5669","reverse":true},{"package_id":0,"type":0,"name":"avotrex","operator":null,"version":null,"linked_to":"5769","reverse":true},{"package_id":0,"type":0,"name":"azuremapsr","operator":null,"version":null,"linked_to":"5999","reverse":true},{"package_id":0,"type":0,"name":"babette","operator":null,"version":null,"linked_to":"6109","reverse":true},{"package_id":0,"type":0,"name":"bacenR","operator":null,"version":null,"linked_to":"6157","reverse":true},{"package_id":0,"type":0,"name":"baizer","operator":null,"version":null,"linked_to":"6322","reverse":true},{"package_id":0,"type":0,"name":"baldur","operator":null,"version":null,"linked_to":"6367","reverse":true},{"package_id":0,"type":0,"name":"bambooHR","operator":null,"version":null,"linked_to":"6431","reverse":true},{"package_id":0,"type":0,"name":"banR","operator":null,"version":null,"linked_to":"6534","reverse":true},{"package_id":0,"type":0,"name":"banffIT","operator":null,"version":null,"linked_to":"6507","reverse":true},{"package_id":0,"type":0,"name":"banxicoR","operator":null,"version":null,"linked_to":"6546","reverse":true},{"package_id":0,"type":0,"name":"barrks","operator":null,"version":null,"linked_to":"6593","reverse":true},{"package_id":0,"type":0,"name":"bartXViz","operator":null,"version":null,"linked_to":"6677","reverse":true},{"package_id":0,"type":0,"name":"baseballr","operator":null,"version":null,"linked_to":"6744","reverse":true},{"package_id":0,"type":0,"name":"basedosdados","operator":null,"version":null,"linked_to":"6758","reverse":true},{"package_id":0,"type":0,"name":"batchtma","operator":null,"version":null,"linked_to":"7007","reverse":true},{"package_id":0,"type":0,"name":"baymedr","operator":null,"version":null,"linked_to":"8019","reverse":true},{"package_id":0,"type":0,"name":"bbw","operator":null,"version":null,"linked_to":"8188","reverse":true},{"package_id":0,"type":0,"name":"bdc","operator":null,"version":null,"linked_to":"8418","reverse":true},{"package_id":0,"type":0,"name":"bea.R","operator":null,"version":null,"linked_to":"8566","reverse":true},{"package_id":0,"type":0,"name":"beakr","operator":null,"version":null,"linked_to":"8585","reverse":true},{"package_id":0,"type":0,"name":"beastier","operator":null,"version":null,"linked_to":"8615","reverse":true},{"package_id":0,"type":0,"name":"beastt","operator":null,"version":null,"linked_to":"8640","reverse":true},{"package_id":0,"type":0,"name":"beautier","operator":null,"version":null,"linked_to":"8645","reverse":true},{"package_id":0,"type":0,"name":"beaver","operator":null,"version":null,"linked_to":"8664","reverse":true},{"package_id":0,"type":0,"name":"beezdiscounting","operator":null,"version":null,"linked_to":"8724","reverse":true},{"package_id":0,"type":0,"name":"benchmarkme","operator":null,"version":null,"linked_to":"8815","reverse":true},{"package_id":0,"type":0,"name":"bertopicr","operator":null,"version":null,"linked_to":"8910","reverse":true},{"package_id":0,"type":0,"name":"bestSDP","operator":null,"version":null,"linked_to":"8975","reverse":true},{"package_id":0,"type":0,"name":"besthr","operator":null,"version":null,"linked_to":"8939","reverse":true},{"package_id":0,"type":0,"name":"bib2df","operator":null,"version":null,"linked_to":"9484","reverse":true},{"package_id":0,"type":0,"name":"biblio","operator":null,"version":null,"linked_to":"9492","reverse":true},{"package_id":0,"type":0,"name":"bibliometrix","operator":null,"version":null,"linked_to":"9504","reverse":true},{"package_id":0,"type":0,"name":"bidser","operator":null,"version":null,"linked_to":"9648","reverse":true},{"package_id":0,"type":0,"name":"bigergm","operator":null,"version":null,"linked_to":"9781","reverse":true},{"package_id":0,"type":0,"name":"bioRad","operator":null,"version":null,"linked_to":"10715","reverse":true},{"package_id":0,"type":0,"name":"bioacoustics","operator":null,"version":null,"linked_to":"10361","reverse":true},{"package_id":0,"type":0,"name":"biocompute","operator":null,"version":null,"linked_to":"10426","reverse":true},{"package_id":0,"type":0,"name":"biomartr","operator":null,"version":null,"linked_to":"10610","reverse":true},{"package_id":0,"type":0,"name":"bioseq","operator":null,"version":null,"linked_to":"10759","reverse":true},{"package_id":0,"type":0,"name":"bipartiteD3","operator":null,"version":null,"linked_to":"10871","reverse":true},{"package_id":0,"type":0,"name":"birddog","operator":null,"version":null,"linked_to":"10906","reverse":true},{"package_id":0,"type":0,"name":"birdie","operator":null,"version":null,"linked_to":"10908","reverse":true},{"package_id":0,"type":0,"name":"bitfield","operator":null,"version":null,"linked_to":"11008","reverse":true},{"package_id":0,"type":0,"name":"bitmexr","operator":null,"version":null,"linked_to":"11010","reverse":true},{"package_id":0,"type":0,"name":"blackmarbler","operator":null,"version":null,"linked_to":"11166","reverse":true},{"package_id":0,"type":0,"name":"blaise","operator":null,"version":null,"linked_to":"11174","reverse":true},{"package_id":0,"type":0,"name":"blandr","operator":null,"version":null,"linked_to":"11184","reverse":true},{"package_id":0,"type":0,"name":"blastula","operator":null,"version":null,"linked_to":"11207","reverse":true},{"package_id":0,"type":0,"name":"blsR","operator":null,"version":null,"linked_to":"11575","reverse":true},{"package_id":0,"type":0,"name":"bluebike","operator":null,"version":null,"linked_to":"11583","reverse":true},{"package_id":0,"type":0,"name":"bml","operator":null,"version":null,"linked_to":"11675","reverse":true},{"package_id":0,"type":0,"name":"bootCT","operator":null,"version":null,"linked_to":"12441","reverse":true},{"package_id":0,"type":0,"name":"box.linters","operator":null,"version":null,"linked_to":"12654","reverse":true},{"package_id":0,"type":0,"name":"boxr","operator":null,"version":null,"linked_to":"12695","reverse":true},{"package_id":0,"type":0,"name":"bracer","operator":null,"version":null,"linked_to":"12830","reverse":true},{"package_id":0,"type":0,"name":"breathtestcore","operator":null,"version":null,"linked_to":"13017","reverse":true},{"package_id":0,"type":0,"name":"breathteststan","operator":null,"version":null,"linked_to":"13033","reverse":true},{"package_id":0,"type":0,"name":"bridgesampling","operator":null,"version":null,"linked_to":"13126","reverse":true},{"package_id":0,"type":0,"name":"brightspaceR","operator":null,"version":null,"linked_to":"13142","reverse":true},{"package_id":0,"type":0,"name":"broom","operator":null,"version":null,"linked_to":"13301","reverse":true},{"package_id":0,"type":0,"name":"broom.helpers","operator":null,"version":null,"linked_to":"13339","reverse":true},{"package_id":0,"type":0,"name":"broom.mixed","operator":null,"version":null,"linked_to":"13363","reverse":true},{"package_id":0,"type":0,"name":"bruceR","operator":null,"version":null,"linked_to":"13439","reverse":true},{"package_id":0,"type":0,"name":"bskyr","operator":null,"version":null,"linked_to":"13574","reverse":true},{"package_id":0,"type":0,"name":"bsplus","operator":null,"version":null,"linked_to":"13645","reverse":true},{"package_id":0,"type":0,"name":"buildr","operator":null,"version":null,"linked_to":"13917","reverse":true},{"package_id":0,"type":0,"name":"bulkreadr","operator":null,"version":null,"linked_to":"13939","reverse":true},{"package_id":0,"type":0,"name":"bunddev","operator":null,"version":null,"linked_to":"13970","reverse":true},{"package_id":0,"type":0,"name":"bupaR","operator":null,"version":null,"linked_to":"13985","reverse":true},{"package_id":0,"type":0,"name":"burnr","operator":null,"version":null,"linked_to":"14005","reverse":true},{"package_id":0,"type":0,"name":"bursa","operator":null,"version":null,"linked_to":"14013","reverse":true},{"package_id":0,"type":0,"name":"cabinets","operator":null,"version":null,"linked_to":"14273","reverse":true},{"package_id":0,"type":0,"name":"calibrar","operator":null,"version":null,"linked_to":"14438","reverse":true},{"package_id":0,"type":0,"name":"calidad","operator":null,"version":null,"linked_to":"14469","reverse":true},{"package_id":0,"type":0,"name":"callsync","operator":null,"version":null,"linked_to":"14517","reverse":true},{"package_id":0,"type":0,"name":"calms","operator":null,"version":null,"linked_to":"14526","reverse":true},{"package_id":0,"type":0,"name":"calpassapi","operator":null,"version":null,"linked_to":"14528","reverse":true},{"package_id":0,"type":0,"name":"campfin","operator":null,"version":null,"linked_to":"14570","reverse":true},{"package_id":0,"type":0,"name":"camtrapdp","operator":null,"version":null,"linked_to":"14620","reverse":true},{"package_id":0,"type":0,"name":"cancerradarr","operator":null,"version":null,"linked_to":"14688","reverse":true},{"package_id":0,"type":0,"name":"cansim","operator":null,"version":null,"linked_to":"14725","reverse":true},{"package_id":0,"type":0,"name":"capesR","operator":null,"version":null,"linked_to":"14825","reverse":true},{"package_id":0,"type":0,"name":"capl","operator":null,"version":null,"linked_to":"14830","reverse":true},{"package_id":0,"type":0,"name":"carat","operator":null,"version":null,"linked_to":"14902","reverse":true},{"package_id":0,"type":0,"name":"carbonr","operator":null,"version":null,"linked_to":"14962","reverse":true},{"package_id":0,"type":0,"name":"caretSDM","operator":null,"version":null,"linked_to":"15067","reverse":true},{"package_id":0,"type":0,"name":"casimir","operator":null,"version":null,"linked_to":"15273","reverse":true},{"package_id":0,"type":0,"name":"causact","operator":null,"version":null,"linked_to":"15557","reverse":true},{"package_id":0,"type":0,"name":"causalDT","operator":null,"version":null,"linked_to":"15595","reverse":true},{"package_id":0,"type":0,"name":"causalDisco","operator":null,"version":null,"linked_to":"15588","reverse":true},{"package_id":0,"type":0,"name":"causalHyperGraph","operator":null,"version":null,"linked_to":"15623","reverse":true},{"package_id":0,"type":0,"name":"causalQual","operator":null,"version":null,"linked_to":"15670","reverse":true},{"package_id":0,"type":0,"name":"cbioportalR","operator":null,"version":null,"linked_to":"15815","reverse":true},{"package_id":0,"type":0,"name":"cbsREPS","operator":null,"version":null,"linked_to":"15864","reverse":true},{"package_id":0,"type":0,"name":"ccdR","operator":null,"version":null,"linked_to":"15940","reverse":true},{"package_id":0,"type":0,"name":"cder","operator":null,"version":null,"linked_to":"16147","reverse":true},{"package_id":0,"type":0,"name":"cdlTools","operator":null,"version":null,"linked_to":"16191","reverse":true},{"package_id":0,"type":0,"name":"censable","operator":null,"version":null,"linked_to":"16424","reverse":true},{"package_id":0,"type":0,"name":"cepumd","operator":null,"version":null,"linked_to":"16579","reverse":true},{"package_id":0,"type":0,"name":"ceramic","operator":null,"version":null,"linked_to":"16584","reverse":true},{"package_id":0,"type":0,"name":"cfbfastR","operator":null,"version":null,"linked_to":"16645","reverse":true},{"package_id":0,"type":0,"name":"charlesschwabapi","operator":null,"version":null,"linked_to":"17080","reverse":true},{"package_id":0,"type":0,"name":"chartql","operator":null,"version":null,"linked_to":"17085","reverse":true},{"package_id":0,"type":0,"name":"chcd","operator":null,"version":null,"linked_to":"17111","reverse":true},{"package_id":0,"type":0,"name":"checkCLI","operator":null,"version":null,"linked_to":"17160","reverse":true},{"package_id":0,"type":0,"name":"checkLuhn","operator":null,"version":null,"linked_to":"17190","reverse":true},{"package_id":0,"type":0,"name":"checkhelper","operator":null,"version":null,"linked_to":"17188","reverse":true},{"package_id":0,"type":0,"name":"cheese","operator":null,"version":null,"linked_to":"17241","reverse":true},{"package_id":0,"type":0,"name":"chevron","operator":null,"version":null,"linked_to":"17350","reverse":true},{"package_id":0,"type":0,"name":"chilemapas","operator":null,"version":null,"linked_to":"17404","reverse":true},{"package_id":0,"type":0,"name":"chillR","operator":null,"version":null,"linked_to":"17412","reverse":true},{"package_id":0,"type":0,"name":"choroplethr","operator":null,"version":null,"linked_to":"17603","reverse":true},{"package_id":0,"type":0,"name":"chromConverter","operator":null,"version":null,"linked_to":"17641","reverse":true},{"package_id":0,"type":0,"name":"ciecl","operator":null,"version":null,"linked_to":"17762","reverse":true},{"package_id":0,"type":0,"name":"cimir","operator":null,"version":null,"linked_to":"17801","reverse":true},{"package_id":0,"type":0,"name":"citrus","operator":null,"version":null,"linked_to":"18041","reverse":true},{"package_id":0,"type":0,"name":"cjar","operator":null,"version":null,"linked_to":"18081","reverse":true},{"package_id":0,"type":0,"name":"cleanTS","operator":null,"version":null,"linked_to":"18552","reverse":true},{"package_id":0,"type":0,"name":"clidatajp","operator":null,"version":null,"linked_to":"18649","reverse":true},{"package_id":0,"type":0,"name":"climatehealth","operator":null,"version":null,"linked_to":"18722","reverse":true},{"package_id":0,"type":0,"name":"climodr","operator":null,"version":null,"linked_to":"18802","reverse":true},{"package_id":0,"type":0,"name":"clinDataReview","operator":null,"version":null,"linked_to":"18835","reverse":true},{"package_id":0,"type":0,"name":"clinpubr","operator":null,"version":null,"linked_to":"18890","reverse":true},{"package_id":0,"type":0,"name":"clustringr","operator":null,"version":null,"linked_to":"19767","reverse":true},{"package_id":0,"type":0,"name":"cmAnalysis","operator":null,"version":null,"linked_to":"19827","reverse":true},{"package_id":0,"type":0,"name":"cmaRs","operator":null,"version":null,"linked_to":"19832","reverse":true},{"package_id":0,"type":0,"name":"cmhc","operator":null,"version":null,"linked_to":"19904","reverse":true},{"package_id":0,"type":0,"name":"cnum","operator":null,"version":null,"linked_to":"20170","reverse":true},{"package_id":0,"type":0,"name":"codebook","operator":null,"version":null,"linked_to":"20396","reverse":true},{"package_id":0,"type":0,"name":"codebookr","operator":null,"version":null,"linked_to":"20414","reverse":true},{"package_id":0,"type":0,"name":"codestral","operator":null,"version":null,"linked_to":"20503","reverse":true},{"package_id":0,"type":0,"name":"cofad","operator":null,"version":null,"linked_to":"20743","reverse":true},{"package_id":0,"type":0,"name":"colleyRstats","operator":null,"version":null,"linked_to":"21080","reverse":true},{"package_id":0,"type":0,"name":"collidr","operator":null,"version":null,"linked_to":"21084","reverse":true},{"package_id":0,"type":0,"name":"colorfindr","operator":null,"version":null,"linked_to":"21172","reverse":true},{"package_id":0,"type":0,"name":"colorizer","operator":null,"version":null,"linked_to":"21192","reverse":true},{"package_id":0,"type":0,"name":"colormap","operator":null,"version":null,"linked_to":"21193","reverse":true},{"package_id":0,"type":0,"name":"colorrepel","operator":null,"version":null,"linked_to":"21211","reverse":true},{"package_id":0,"type":0,"name":"combcoint","operator":null,"version":null,"linked_to":"21343","reverse":true},{"package_id":0,"type":0,"name":"combinedevents","operator":null,"version":null,"linked_to":"21358","reverse":true},{"package_id":0,"type":0,"name":"combiroc","operator":null,"version":null,"linked_to":"21370","reverse":true},{"package_id":0,"type":0,"name":"compareDF","operator":null,"version":null,"linked_to":"21545","reverse":true},{"package_id":0,"type":0,"name":"completejourney","operator":null,"version":null,"linked_to":"21694","reverse":true},{"package_id":0,"type":0,"name":"comtradr","operator":null,"version":null,"linked_to":"21907","reverse":true},{"package_id":0,"type":0,"name":"conText","operator":null,"version":null,"linked_to":"22479","reverse":true},{"package_id":0,"type":0,"name":"concatipede","operator":null,"version":null,"linked_to":"21928","reverse":true},{"package_id":0,"type":0,"name":"concordance","operator":null,"version":null,"linked_to":"21943","reverse":true},{"package_id":0,"type":0,"name":"condathis","operator":null,"version":null,"linked_to":"21980","reverse":true},{"package_id":0,"type":0,"name":"configr","operator":null,"version":null,"linked_to":"22103","reverse":true},{"package_id":0,"type":0,"name":"configulaR","operator":null,"version":null,"linked_to":"22111","reverse":true},{"package_id":0,"type":0,"name":"congress","operator":null,"version":null,"linked_to":"22193","reverse":true},{"package_id":0,"type":0,"name":"conmet","operator":null,"version":null,"linked_to":"22248","reverse":true},{"package_id":0,"type":0,"name":"conquestr","operator":null,"version":null,"linked_to":"22333","reverse":true},{"package_id":0,"type":0,"name":"contentanalysis","operator":null,"version":null,"linked_to":"22461","reverse":true},{"package_id":0,"type":0,"name":"contourforest","operator":null,"version":null,"linked_to":"22528","reverse":true},{"package_id":0,"type":0,"name":"convergEU","operator":null,"version":null,"linked_to":"22581","reverse":true},{"package_id":0,"type":0,"name":"convergenceDFM","operator":null,"version":null,"linked_to":"22580","reverse":true},{"package_id":0,"type":0,"name":"convertid","operator":null,"version":null,"linked_to":"22604","reverse":true},{"package_id":0,"type":0,"name":"cookiecutter","operator":null,"version":null,"linked_to":"22652","reverse":true},{"package_id":0,"type":0,"name":"copyseparator","operator":null,"version":null,"linked_to":"22885","reverse":true},{"package_id":0,"type":0,"name":"corella","operator":null,"version":null,"linked_to":"22960","reverse":true},{"package_id":0,"type":0,"name":"corporaexplorer","operator":null,"version":null,"linked_to":"23055","reverse":true},{"package_id":0,"type":0,"name":"correctref","operator":null,"version":null,"linked_to":"23123","reverse":true},{"package_id":0,"type":0,"name":"correlationfunnel","operator":null,"version":null,"linked_to":"23155","reverse":true},{"package_id":0,"type":0,"name":"cosinor2","operator":null,"version":null,"linked_to":"23290","reverse":true},{"package_id":0,"type":0,"name":"countries","operator":null,"version":null,"linked_to":"23405","reverse":true},{"package_id":0,"type":0,"name":"countyhealthR","operator":null,"version":null,"linked_to":"23446","reverse":true},{"package_id":0,"type":0,"name":"covid19france","operator":null,"version":null,"linked_to":"23577","reverse":true},{"package_id":0,"type":0,"name":"covid19india","operator":null,"version":null,"linked_to":"23578","reverse":true},{"package_id":0,"type":0,"name":"covid19tunisia","operator":null,"version":null,"linked_to":"23598","reverse":true},{"package_id":0,"type":0,"name":"covid19us","operator":null,"version":null,"linked_to":"23599","reverse":true},{"package_id":0,"type":0,"name":"cpam","operator":null,"version":null,"linked_to":"23841","reverse":true},{"package_id":0,"type":0,"name":"cpgfR","operator":null,"version":null,"linked_to":"23911","reverse":true},{"package_id":0,"type":0,"name":"cpsvote","operator":null,"version":null,"linked_to":"24060","reverse":true},{"package_id":0,"type":0,"name":"crandep","operator":null,"version":null,"linked_to":"24110","reverse":true},{"package_id":0,"type":0,"name":"cranly","operator":null,"version":null,"linked_to":"24141","reverse":true},{"package_id":0,"type":0,"name":"crctStepdown","operator":null,"version":null,"linked_to":"24191","reverse":true},{"package_id":0,"type":0,"name":"cricketdata","operator":null,"version":null,"linked_to":"24360","reverse":true},{"package_id":0,"type":0,"name":"crimedata","operator":null,"version":null,"linked_to":"24380","reverse":true},{"package_id":0,"type":0,"name":"crimeutils","operator":null,"version":null,"linked_to":"24388","reverse":true},{"package_id":0,"type":0,"name":"crispRdesignR","operator":null,"version":null,"linked_to":"24393","reverse":true},{"package_id":0,"type":0,"name":"criticalpath","operator":null,"version":null,"linked_to":"24401","reverse":true},{"package_id":0,"type":0,"name":"critpath","operator":null,"version":null,"linked_to":"24404","reverse":true},{"package_id":0,"type":0,"name":"cromwellDashboard","operator":null,"version":null,"linked_to":"24464","reverse":true},{"package_id":0,"type":0,"name":"crosstable","operator":null,"version":null,"linked_to":"24573","reverse":true},{"package_id":0,"type":0,"name":"cruts","operator":null,"version":null,"linked_to":"24809","reverse":true},{"package_id":0,"type":0,"name":"crystract","operator":null,"version":null,"linked_to":"24886","reverse":true},{"package_id":0,"type":0,"name":"csalert","operator":null,"version":null,"linked_to":"24892","reverse":true},{"package_id":0,"type":0,"name":"csdb","operator":null,"version":null,"linked_to":"24924","reverse":true},{"package_id":0,"type":0,"name":"cspp","operator":null,"version":null,"linked_to":"25019","reverse":true},{"package_id":0,"type":0,"name":"csquares","operator":null,"version":null,"linked_to":"25031","reverse":true},{"package_id":0,"type":0,"name":"cstidy","operator":null,"version":null,"linked_to":"25055","reverse":true},{"package_id":0,"type":0,"name":"csvwr","operator":null,"version":null,"linked_to":"25110","reverse":true},{"package_id":0,"type":0,"name":"cthist","operator":null,"version":null,"linked_to":"25140","reverse":true},{"package_id":0,"type":0,"name":"ctoclient","operator":null,"version":null,"linked_to":"25222","reverse":true},{"package_id":0,"type":0,"name":"ctsmTMB","operator":null,"version":null,"linked_to":"25375","reverse":true},{"package_id":0,"type":0,"name":"ctxR","operator":null,"version":null,"linked_to":"25403","reverse":true},{"package_id":0,"type":0,"name":"cubble","operator":null,"version":null,"linked_to":"25446","reverse":true},{"package_id":0,"type":0,"name":"cucumber","operator":null,"version":null,"linked_to":"25488","reverse":true},{"package_id":0,"type":0,"name":"currr","operator":null,"version":null,"linked_to":"25594","reverse":true},{"package_id":0,"type":0,"name":"cvCovEst","operator":null,"version":null,"linked_to":"25720","reverse":true},{"package_id":0,"type":0,"name":"cvap","operator":null,"version":null,"linked_to":"25691","reverse":true},{"package_id":0,"type":0,"name":"cvasi","operator":null,"version":null,"linked_to":"25706","reverse":true},{"package_id":0,"type":0,"name":"cvms","operator":null,"version":null,"linked_to":"25777","reverse":true},{"package_id":0,"type":0,"name":"cyclestreets","operator":null,"version":null,"linked_to":"25916","reverse":true},{"package_id":0,"type":0,"name":"cylcop","operator":null,"version":null,"linked_to":"25968","reverse":true},{"package_id":0,"type":0,"name":"dMod","operator":null,"version":null,"linked_to":"31512","reverse":true},{"package_id":0,"type":0,"name":"dPCP","operator":null,"version":null,"linked_to":"32199","reverse":true},{"package_id":0,"type":0,"name":"dQTG.seq","operator":null,"version":null,"linked_to":"32403","reverse":true},{"package_id":0,"type":0,"name":"dabestr","operator":null,"version":null,"linked_to":"26137","reverse":true},{"package_id":0,"type":0,"name":"daiR","operator":null,"version":null,"linked_to":"26272","reverse":true},{"package_id":0,"type":0,"name":"dail","operator":null,"version":null,"linked_to":"26247","reverse":true},{"package_id":0,"type":0,"name":"dampack","operator":null,"version":null,"linked_to":"26390","reverse":true},{"package_id":0,"type":0,"name":"dann","operator":null,"version":null,"linked_to":"26434","reverse":true},{"package_id":0,"type":0,"name":"daqapo","operator":null,"version":null,"linked_to":"26454","reverse":true},{"package_id":0,"type":0,"name":"dartR","operator":null,"version":null,"linked_to":"26471","reverse":true},{"package_id":0,"type":0,"name":"dartR.base","operator":null,"version":null,"linked_to":"26492","reverse":true},{"package_id":0,"type":0,"name":"dartR.captive","operator":null,"version":null,"linked_to":"26499","reverse":true},{"package_id":0,"type":0,"name":"dartR.popgen","operator":null,"version":null,"linked_to":"26506","reverse":true},{"package_id":0,"type":0,"name":"dartR.sim","operator":null,"version":null,"linked_to":"26511","reverse":true},{"package_id":0,"type":0,"name":"dataPreparation","operator":null,"version":null,"linked_to":"26942","reverse":true},{"package_id":0,"type":0,"name":"datacutr","operator":null,"version":null,"linked_to":"26712","reverse":true},{"package_id":0,"type":0,"name":"datadogr","operator":null,"version":null,"linked_to":"26726","reverse":true},{"package_id":0,"type":0,"name":"dataframeexplorer","operator":null,"version":null,"linked_to":"26764","reverse":true},{"package_id":0,"type":0,"name":"datamedios","operator":null,"version":null,"linked_to":"26821","reverse":true},{"package_id":0,"type":0,"name":"dataone","operator":null,"version":null,"linked_to":"26887","reverse":true},{"package_id":0,"type":0,"name":"dataspice","operator":null,"version":null,"linked_to":"27109","reverse":true},{"package_id":0,"type":0,"name":"datasusr","operator":null,"version":null,"linked_to":"27144","reverse":true},{"package_id":0,"type":0,"name":"dataviewR","operator":null,"version":null,"linked_to":"27169","reverse":true},{"package_id":0,"type":0,"name":"datazoom.amazonia","operator":null,"version":null,"linked_to":"27235","reverse":true},{"package_id":0,"type":0,"name":"datetoiso","operator":null,"version":null,"linked_to":"27305","reverse":true},{"package_id":0,"type":0,"name":"dbglm","operator":null,"version":null,"linked_to":"27429","reverse":true},{"package_id":0,"type":0,"name":"dcm2","operator":null,"version":null,"linked_to":"27721","reverse":true},{"package_id":0,"type":0,"name":"decisionSupport","operator":null,"version":null,"linked_to":"28020","reverse":true},{"package_id":0,"type":0,"name":"decompositionLE","operator":null,"version":null,"linked_to":"28099","reverse":true},{"package_id":0,"type":0,"name":"deepSTRAPP","operator":null,"version":null,"linked_to":"28234","reverse":true},{"package_id":0,"type":0,"name":"deident","operator":null,"version":null,"linked_to":"28323","reverse":true},{"package_id":0,"type":0,"name":"delimtools","operator":null,"version":null,"linked_to":"28390","reverse":true},{"package_id":0,"type":0,"name":"delma","operator":null,"version":null,"linked_to":"28394","reverse":true},{"package_id":0,"type":0,"name":"demulticoder","operator":null,"version":null,"linked_to":"28495","reverse":true},{"package_id":0,"type":0,"name":"dendRoAnalyst","operator":null,"version":null,"linked_to":"28516","reverse":true},{"package_id":0,"type":0,"name":"dendroNetwork","operator":null,"version":null,"linked_to":"28533","reverse":true},{"package_id":0,"type":0,"name":"denguedatahub","operator":null,"version":null,"linked_to":"28577","reverse":true},{"package_id":0,"type":0,"name":"deprivateR","operator":null,"version":null,"linked_to":"28734","reverse":true},{"package_id":0,"type":0,"name":"describedata","operator":null,"version":null,"linked_to":"28811","reverse":true},{"package_id":0,"type":0,"name":"descutils","operator":null,"version":null,"linked_to":"28924","reverse":true},{"package_id":0,"type":0,"name":"designit","operator":null,"version":null,"linked_to":"28945","reverse":true},{"package_id":0,"type":0,"name":"detector","operator":null,"version":null,"linked_to":"29049","reverse":true},{"package_id":0,"type":0,"name":"detrendr","operator":null,"version":null,"linked_to":"29086","reverse":true},{"package_id":0,"type":0,"name":"devFunc","operator":null,"version":null,"linked_to":"29142","reverse":true},{"package_id":0,"type":0,"name":"dfexpand","operator":null,"version":null,"linked_to":"29323","reverse":true},{"package_id":0,"type":0,"name":"diathor","operator":null,"version":null,"linked_to":"29669","reverse":true},{"package_id":0,"type":0,"name":"diceR","operator":null,"version":null,"linked_to":"29726","reverse":true},{"package_id":0,"type":0,"name":"difconet","operator":null,"version":null,"linked_to":"29883","reverse":true},{"package_id":0,"type":0,"name":"diffEnrich","operator":null,"version":null,"linked_to":"29917","reverse":true},{"package_id":0,"type":0,"name":"digiRhythm","operator":null,"version":null,"linked_to":"30074","reverse":true},{"package_id":0,"type":0,"name":"dilp","operator":null,"version":null,"linked_to":"30100","reverse":true},{"package_id":0,"type":0,"name":"dipsaus","operator":null,"version":null,"linked_to":"30225","reverse":true},{"package_id":0,"type":0,"name":"disclosuR","operator":null,"version":null,"linked_to":"30453","reverse":true},{"package_id":0,"type":0,"name":"discursive","operator":null,"version":null,"linked_to":"30588","reverse":true},{"package_id":0,"type":0,"name":"diseasystore","operator":null,"version":null,"linked_to":"30606","reverse":true},{"package_id":0,"type":0,"name":"distcomp","operator":null,"version":null,"linked_to":"30814","reverse":true},{"package_id":0,"type":0,"name":"distill","operator":null,"version":null,"linked_to":"30833","reverse":true},{"package_id":0,"type":0,"name":"ditwahLandslide","operator":null,"version":null,"linked_to":"31062","reverse":true},{"package_id":0,"type":0,"name":"dkanr","operator":null,"version":null,"linked_to":"31248","reverse":true},{"package_id":0,"type":0,"name":"dmai","operator":null,"version":null,"linked_to":"31449","reverse":true},{"package_id":0,"type":0,"name":"dnafractal","operator":null,"version":null,"linked_to":"31554","reverse":true},{"package_id":0,"type":0,"name":"dndR","operator":null,"version":null,"linked_to":"31585","reverse":true},{"package_id":0,"type":0,"name":"do","operator":null,"version":null,"linked_to":"31625","reverse":true},{"package_id":0,"type":0,"name":"doc2concrete","operator":null,"version":null,"linked_to":"31681","reverse":true},{"package_id":0,"type":0,"name":"docket","operator":null,"version":null,"linked_to":"31712","reverse":true},{"package_id":0,"type":0,"name":"docorator","operator":null,"version":null,"linked_to":"31744","reverse":true},{"package_id":0,"type":0,"name":"documentosbr","operator":null,"version":null,"linked_to":"31780","reverse":true},{"package_id":0,"type":0,"name":"dosedesignR","operator":null,"version":null,"linked_to":"32009","reverse":true},{"package_id":0,"type":0,"name":"dotsViolin","operator":null,"version":null,"linked_to":"32062","reverse":true},{"package_id":0,"type":0,"name":"dotwhisker","operator":null,"version":null,"linked_to":"32064","reverse":true},{"package_id":0,"type":0,"name":"dowser","operator":null,"version":null,"linked_to":"32163","reverse":true},{"package_id":0,"type":0,"name":"dplR","operator":null,"version":null,"linked_to":"32228","reverse":true},{"package_id":0,"type":0,"name":"dplyrAssist","operator":null,"version":null,"linked_to":"32282","reverse":true},{"package_id":0,"type":0,"name":"dpm","operator":null,"version":null,"linked_to":"32283","reverse":true},{"package_id":0,"type":0,"name":"drawer","operator":null,"version":null,"linked_to":"32522","reverse":true},{"package_id":0,"type":0,"name":"drcarlate","operator":null,"version":null,"linked_to":"32539","reverse":true},{"package_id":0,"type":0,"name":"drpop","operator":null,"version":null,"linked_to":"32715","reverse":true},{"package_id":0,"type":0,"name":"drugDemand","operator":null,"version":null,"linked_to":"32749","reverse":true},{"package_id":0,"type":0,"name":"drugsens","operator":null,"version":null,"linked_to":"32785","reverse":true},{"package_id":0,"type":0,"name":"drumr","operator":null,"version":null,"linked_to":"32815","reverse":true},{"package_id":0,"type":0,"name":"dsBase","operator":null,"version":null,"linked_to":"32879","reverse":true},{"package_id":0,"type":0,"name":"dsmSearch","operator":null,"version":null,"linked_to":"33025","reverse":true},{"package_id":0,"type":0,"name":"dtGAP","operator":null,"version":null,"linked_to":"33232","reverse":true},{"package_id":0,"type":0,"name":"dtrackr","operator":null,"version":null,"linked_to":"33281","reverse":true},{"package_id":0,"type":0,"name":"dtreg","operator":null,"version":null,"linked_to":"33289","reverse":true},{"package_id":0,"type":0,"name":"duet","operator":null,"version":null,"linked_to":"33525","reverse":true},{"package_id":0,"type":0,"name":"dunlin","operator":null,"version":null,"linked_to":"33534","reverse":true},{"package_id":0,"type":0,"name":"dwctaxon","operator":null,"version":null,"linked_to":"33605","reverse":true},{"package_id":0,"type":0,"name":"dySEM","operator":null,"version":null,"linked_to":"33962","reverse":true},{"package_id":0,"type":0,"name":"dynparam","operator":null,"version":null,"linked_to":"33859","reverse":true},{"package_id":0,"type":0,"name":"dynutils","operator":null,"version":null,"linked_to":"33937","reverse":true},{"package_id":0,"type":0,"name":"dynwrap","operator":null,"version":null,"linked_to":"33951","reverse":true},{"package_id":0,"type":0,"name":"eDNAfuns","operator":null,"version":null,"linked_to":"35263","reverse":true},{"package_id":0,"type":0,"name":"eHDPrep","operator":null,"version":null,"linked_to":"35697","reverse":true},{"package_id":0,"type":0,"name":"easyScieloPack","operator":null,"version":null,"linked_to":"34259","reverse":true},{"package_id":0,"type":0,"name":"easyalluvial","operator":null,"version":null,"linked_to":"34122","reverse":true},{"package_id":0,"type":0,"name":"easycensus","operator":null,"version":null,"linked_to":"34157","reverse":true},{"package_id":0,"type":0,"name":"easyr","operator":null,"version":null,"linked_to":"34236","reverse":true},{"package_id":0,"type":0,"name":"eatRep","operator":null,"version":null,"linked_to":"34333","reverse":true},{"package_id":0,"type":0,"name":"ebirdst","operator":null,"version":null,"linked_to":"34412","reverse":true},{"package_id":0,"type":0,"name":"ecan","operator":null,"version":null,"linked_to":"34518","reverse":true},{"package_id":0,"type":0,"name":"ecocomDP","operator":null,"version":null,"linked_to":"34757","reverse":true},{"package_id":0,"type":0,"name":"ecode","operator":null,"version":null,"linked_to":"34767","reverse":true},{"package_id":0,"type":0,"name":"econid","operator":null,"version":null,"linked_to":"34872","reverse":true},{"package_id":0,"type":0,"name":"ecoregime","operator":null,"version":null,"linked_to":"34901","reverse":true},{"package_id":0,"type":0,"name":"ecos","operator":null,"version":null,"linked_to":"34914","reverse":true},{"package_id":0,"type":0,"name":"edeaR","operator":null,"version":null,"linked_to":"35110","reverse":true},{"package_id":0,"type":0,"name":"edgar","operator":null,"version":null,"linked_to":"35147","reverse":true},{"package_id":0,"type":0,"name":"edlibR","operator":null,"version":null,"linked_to":"35241","reverse":true},{"package_id":0,"type":0,"name":"educabR","operator":null,"version":null,"linked_to":"35310","reverse":true},{"package_id":0,"type":0,"name":"eemR","operator":null,"version":null,"linked_to":"35373","reverse":true},{"package_id":0,"type":0,"name":"effectcheck","operator":null,"version":null,"linked_to":"35458","reverse":true},{"package_id":0,"type":0,"name":"eiExpand","operator":null,"version":null,"linked_to":"35794","reverse":true},{"package_id":0,"type":0,"name":"elfgen","operator":null,"version":null,"linked_to":"36010","reverse":true},{"package_id":0,"type":0,"name":"elixir","operator":null,"version":null,"linked_to":"36033","reverse":true},{"package_id":0,"type":0,"name":"emayili","operator":null,"version":null,"linked_to":"36162","reverse":true},{"package_id":0,"type":0,"name":"emburden","operator":null,"version":null,"linked_to":"36257","reverse":true},{"package_id":0,"type":0,"name":"emdi","operator":null,"version":null,"linked_to":"36298","reverse":true},{"package_id":0,"type":0,"name":"emery","operator":null,"version":null,"linked_to":"36328","reverse":true},{"package_id":0,"type":0,"name":"emln","operator":null,"version":null,"linked_to":"36412","reverse":true},{"package_id":0,"type":0,"name":"emoji","operator":null,"version":null,"linked_to":"36524","reverse":true},{"package_id":0,"type":0,"name":"emuR","operator":null,"version":null,"linked_to":"36641","reverse":true},{"package_id":0,"type":0,"name":"enderecobr","operator":null,"version":null,"linked_to":"36696","reverse":true},{"package_id":0,"type":0,"name":"ensembleTax","operator":null,"version":null,"linked_to":"36908","reverse":true},{"package_id":0,"type":0,"name":"epe4md","operator":null,"version":null,"linked_to":"37130","reverse":true},{"package_id":0,"type":0,"name":"eph","operator":null,"version":null,"linked_to":"37135","reverse":true},{"package_id":0,"type":0,"name":"epicmodel","operator":null,"version":null,"linked_to":"37195","reverse":true},{"package_id":0,"type":0,"name":"epidm","operator":null,"version":null,"linked_to":"37244","reverse":true},{"package_id":0,"type":0,"name":"episomer","operator":null,"version":null,"linked_to":"37495","reverse":true},{"package_id":0,"type":0,"name":"epiviz","operator":null,"version":null,"linked_to":"37543","reverse":true},{"package_id":0,"type":0,"name":"epos","operator":null,"version":null,"linked_to":"37626","reverse":true},{"package_id":0,"type":0,"name":"ergm","operator":null,"version":null,"linked_to":"37842","reverse":true},{"package_id":0,"type":0,"name":"ern","operator":null,"version":null,"linked_to":"37961","reverse":true},{"package_id":0,"type":0,"name":"escalation","operator":null,"version":null,"linked_to":"38061","reverse":true},{"package_id":0,"type":0,"name":"esci","operator":null,"version":null,"linked_to":"38070","reverse":true},{"package_id":0,"type":0,"name":"esmtools","operator":null,"version":null,"linked_to":"38135","reverse":true},{"package_id":0,"type":0,"name":"ethiodate","operator":null,"version":null,"linked_to":"38347","reverse":true},{"package_id":0,"type":0,"name":"eurodata","operator":null,"version":null,"linked_to":"38495","reverse":true},{"package_id":0,"type":0,"name":"euroleaguer","operator":null,"version":null,"linked_to":"38500","reverse":true},{"package_id":0,"type":0,"name":"eurostat","operator":null,"version":null,"linked_to":"38518","reverse":true},{"package_id":0,"type":0,"name":"eventstudyr","operator":null,"version":null,"linked_to":"38738","reverse":true},{"package_id":0,"type":0,"name":"evinf","operator":null,"version":null,"linked_to":"38793","reverse":true},{"package_id":0,"type":0,"name":"examly","operator":null,"version":null,"linked_to":"38999","reverse":true},{"package_id":0,"type":0,"name":"exampletestr","operator":null,"version":null,"linked_to":"39008","reverse":true},{"package_id":0,"type":0,"name":"exams.forge","operator":null,"version":null,"linked_to":"39039","reverse":true},{"package_id":0,"type":0,"name":"exams.mylearn","operator":null,"version":null,"linked_to":"39046","reverse":true},{"package_id":0,"type":0,"name":"exams2sakai","operator":null,"version":null,"linked_to":"39055","reverse":true},{"package_id":0,"type":0,"name":"excel2eprime","operator":null,"version":null,"linked_to":"39073","reverse":true},{"package_id":0,"type":0,"name":"excluder","operator":null,"version":null,"linked_to":"39103","reverse":true},{"package_id":0,"type":0,"name":"expDB","operator":null,"version":null,"linked_to":"39218","reverse":true},{"package_id":0,"type":0,"name":"experiences","operator":null,"version":null,"linked_to":"39246","reverse":true},{"package_id":0,"type":0,"name":"expertsurv","operator":null,"version":null,"linked_to":"39257","reverse":true},{"package_id":0,"type":0,"name":"explore","operator":null,"version":null,"linked_to":"39317","reverse":true},{"package_id":0,"type":0,"name":"extractFAERS","operator":null,"version":null,"linked_to":"39486","reverse":true},{"package_id":0,"type":0,"name":"eye","operator":null,"version":null,"linked_to":"39654","reverse":true},{"package_id":0,"type":0,"name":"eyelinkReader","operator":null,"version":null,"linked_to":"39666","reverse":true},{"package_id":0,"type":0,"name":"eyelinker","operator":null,"version":null,"linked_to":"39662","reverse":true},{"package_id":0,"type":0,"name":"eyeris","operator":null,"version":null,"linked_to":"39672","reverse":true},{"package_id":0,"type":0,"name":"ez","operator":null,"version":null,"linked_to":"39696","reverse":true},{"package_id":0,"type":0,"name":"fPASS","operator":null,"version":null,"linked_to":"44460","reverse":true},{"package_id":0,"type":0,"name":"fabR","operator":null,"version":null,"linked_to":"39855","reverse":true},{"package_id":0,"type":0,"name":"fableCount","operator":null,"version":null,"linked_to":"39828","reverse":true},{"package_id":0,"type":0,"name":"fabricQueryR","operator":null,"version":null,"linked_to":"39874","reverse":true},{"package_id":0,"type":0,"name":"facerec","operator":null,"version":null,"linked_to":"39888","reverse":true},{"package_id":0,"type":0,"name":"factorEx","operator":null,"version":null,"linked_to":"39968","reverse":true},{"package_id":0,"type":0,"name":"faersquarterlydata","operator":null,"version":null,"linked_to":"40062","reverse":true},{"package_id":0,"type":0,"name":"farr","operator":null,"version":null,"linked_to":"40343","reverse":true},{"package_id":0,"type":0,"name":"fastDummies","operator":null,"version":null,"linked_to":"40505","reverse":true},{"package_id":0,"type":0,"name":"fastFMM","operator":null,"version":null,"linked_to":"40544","reverse":true},{"package_id":0,"type":0,"name":"fastLink","operator":null,"version":null,"linked_to":"40643","reverse":true},{"package_id":0,"type":0,"name":"fastRhockey","operator":null,"version":null,"linked_to":"40804","reverse":true},{"package_id":0,"type":0,"name":"fastdid","operator":null,"version":null,"linked_to":"40497","reverse":true},{"package_id":0,"type":0,"name":"fastml","operator":null,"version":null,"linked_to":"40711","reverse":true},{"package_id":0,"type":0,"name":"fastplyr","operator":null,"version":null,"linked_to":"40741","reverse":true},{"package_id":0,"type":0,"name":"fastreg","operator":null,"version":null,"linked_to":"40791","reverse":true},{"package_id":0,"type":0,"name":"fcaR","operator":null,"version":null,"linked_to":"41042","reverse":true},{"package_id":0,"type":0,"name":"fcall","operator":null,"version":null,"linked_to":"41040","reverse":true},{"package_id":0,"type":0,"name":"fctutils","operator":null,"version":null,"linked_to":"41140","reverse":true},{"package_id":0,"type":0,"name":"fdapaceShiny","operator":null,"version":null,"linked_to":"41240","reverse":true},{"package_id":0,"type":0,"name":"fedmatch","operator":null,"version":null,"linked_to":"41545","reverse":true},{"package_id":0,"type":0,"name":"feltr","operator":null,"version":null,"linked_to":"41600","reverse":true},{"package_id":0,"type":0,"name":"ferrn","operator":null,"version":null,"linked_to":"41632","reverse":true},{"package_id":0,"type":0,"name":"ffiec","operator":null,"version":null,"linked_to":"41699","reverse":true},{"package_id":0,"type":0,"name":"ffp","operator":null,"version":null,"linked_to":"41733","reverse":true},{"package_id":0,"type":0,"name":"ffscrapr","operator":null,"version":null,"linked_to":"41737","reverse":true},{"package_id":0,"type":0,"name":"fgeo.plot","operator":null,"version":null,"linked_to":"41820","reverse":true},{"package_id":0,"type":0,"name":"fhircrackr","operator":null,"version":null,"linked_to":"41871","reverse":true},{"package_id":0,"type":0,"name":"fibos","operator":null,"version":null,"linked_to":"41915","reverse":true},{"package_id":0,"type":0,"name":"filibustr","operator":null,"version":null,"linked_to":"42132","reverse":true},{"package_id":0,"type":0,"name":"finalfit","operator":null,"version":null,"linked_to":"42170","reverse":true},{"package_id":0,"type":0,"name":"findInFiles","operator":null,"version":null,"linked_to":"42255","reverse":true},{"package_id":0,"type":0,"name":"findInGit","operator":null,"version":null,"linked_to":"42262","reverse":true},{"package_id":0,"type":0,"name":"findR","operator":null,"version":null,"linked_to":"42282","reverse":true},{"package_id":0,"type":0,"name":"findSVI","operator":null,"version":null,"linked_to":"42285","reverse":true},{"package_id":0,"type":0,"name":"finnsurveytext","operator":null,"version":null,"linked_to":"42366","reverse":true},{"package_id":0,"type":0,"name":"finnts","operator":null,"version":null,"linked_to":"42370","reverse":true},{"package_id":0,"type":0,"name":"finto","operator":null,"version":null,"linked_to":"42387","reverse":true},{"package_id":0,"type":0,"name":"fishualize","operator":null,"version":null,"linked_to":"42530","reverse":true},{"package_id":0,"type":0,"name":"fitbitScraper","operator":null,"version":null,"linked_to":"42561","reverse":true},{"package_id":0,"type":0,"name":"fitzRoy","operator":null,"version":null,"linked_to":"42661","reverse":true},{"package_id":0,"type":0,"name":"flashier","operator":null,"version":null,"linked_to":"42834","reverse":true},{"package_id":0,"type":0,"name":"flattabler","operator":null,"version":null,"linked_to":"42870","reverse":true},{"package_id":0,"type":0,"name":"flexCountReg","operator":null,"version":null,"linked_to":"42900","reverse":true},{"package_id":0,"type":0,"name":"flipbookr","operator":null,"version":null,"linked_to":"43142","reverse":true},{"package_id":0,"type":0,"name":"flowTraceR","operator":null,"version":null,"linked_to":"43273","reverse":true},{"package_id":0,"type":0,"name":"flowchart","operator":null,"version":null,"linked_to":"43226","reverse":true},{"package_id":0,"type":0,"name":"fluxible","operator":null,"version":null,"linked_to":"43332","reverse":true},{"package_id":0,"type":0,"name":"fonctionr","operator":null,"version":null,"linked_to":"43646","reverse":true},{"package_id":0,"type":0,"name":"foodwebWrapper","operator":null,"version":null,"linked_to":"43673","reverse":true},{"package_id":0,"type":0,"name":"foodwebr","operator":null,"version":null,"linked_to":"43672","reverse":true},{"package_id":0,"type":0,"name":"foqat","operator":null,"version":null,"linked_to":"43688","reverse":true},{"package_id":0,"type":0,"name":"forceR","operator":null,"version":null,"linked_to":"43716","reverse":true},{"package_id":0,"type":0,"name":"forecasteR","operator":null,"version":null,"linked_to":"43769","reverse":true},{"package_id":0,"type":0,"name":"forestecology","operator":null,"version":null,"linked_to":"44118","reverse":true},{"package_id":0,"type":0,"name":"forestsearch","operator":null,"version":null,"linked_to":"44229","reverse":true},{"package_id":0,"type":0,"name":"formods","operator":null,"version":null,"linked_to":"44296","reverse":true},{"package_id":0,"type":0,"name":"fossilbrush","operator":null,"version":null,"linked_to":"44412","reverse":true},{"package_id":0,"type":0,"name":"fractalforest","operator":null,"version":null,"linked_to":"44616","reverse":true},{"package_id":0,"type":0,"name":"framecleaner","operator":null,"version":null,"linked_to":"44718","reverse":true},{"package_id":0,"type":0,"name":"frenchdata","operator":null,"version":null,"linked_to":"44846","reverse":true},{"package_id":0,"type":0,"name":"freqtables","operator":null,"version":null,"linked_to":"44866","reverse":true},{"package_id":0,"type":0,"name":"fsr","operator":null,"version":null,"linked_to":"45226","reverse":true},{"package_id":0,"type":0,"name":"fst4pg","operator":null,"version":null,"linked_to":"45255","reverse":true},{"package_id":0,"type":0,"name":"ftExtra","operator":null,"version":null,"linked_to":"45271","reverse":true},{"package_id":0,"type":0,"name":"funMoDisco","operator":null,"version":null,"linked_to":"45557","reverse":true},{"package_id":0,"type":0,"name":"funModeling","operator":null,"version":null,"linked_to":"45544","reverse":true},{"package_id":0,"type":0,"name":"funStatTest","operator":null,"version":null,"linked_to":"45597","reverse":true},{"package_id":0,"type":0,"name":"functiondepends","operator":null,"version":null,"linked_to":"45444","reverse":true},{"package_id":0,"type":0,"name":"funkycells","operator":null,"version":null,"linked_to":"45527","reverse":true},{"package_id":0,"type":0,"name":"funkyheatmap","operator":null,"version":null,"linked_to":"45528","reverse":true},{"package_id":0,"type":0,"name":"funspotr","operator":null,"version":null,"linked_to":"45594","reverse":true},{"package_id":0,"type":0,"name":"fuzzyjoin","operator":null,"version":null,"linked_to":"45860","reverse":true},{"package_id":0,"type":0,"name":"fuzzylink","operator":null,"version":null,"linked_to":"45868","reverse":true},{"package_id":0,"type":0,"name":"galah","operator":null,"version":null,"linked_to":"46161","reverse":true},{"package_id":0,"type":0,"name":"gastempt","operator":null,"version":null,"linked_to":"46686","reverse":true},{"package_id":0,"type":0,"name":"gatoRs","operator":null,"version":null,"linked_to":"46725","reverse":true},{"package_id":0,"type":0,"name":"gbfs","operator":null,"version":null,"linked_to":"46859","reverse":true},{"package_id":0,"type":0,"name":"gde","operator":null,"version":null,"linked_to":"47127","reverse":true},{"package_id":0,"type":0,"name":"gecko","operator":null,"version":null,"linked_to":"47345","reverse":true},{"package_id":0,"type":0,"name":"geeLite","operator":null,"version":null,"linked_to":"47398","reverse":true},{"package_id":0,"type":0,"name":"gen3sis","operator":null,"version":null,"linked_to":"47508","reverse":true},{"package_id":0,"type":0,"name":"geneHummus","operator":null,"version":null,"linked_to":"47666","reverse":true},{"package_id":0,"type":0,"name":"geneNR","operator":null,"version":null,"linked_to":"47701","reverse":true},{"package_id":0,"type":0,"name":"genekitr","operator":null,"version":null,"linked_to":"47668","reverse":true},{"package_id":0,"type":0,"name":"genemodel","operator":null,"version":null,"linked_to":"47688","reverse":true},{"package_id":0,"type":0,"name":"genepop","operator":null,"version":null,"linked_to":"47707","reverse":true},{"package_id":0,"type":0,"name":"geneset","operator":null,"version":null,"linked_to":"47795","reverse":true},{"package_id":0,"type":0,"name":"genetic.algo.optimizeR","operator":null,"version":null,"linked_to":"47838","reverse":true},{"package_id":0,"type":0,"name":"genieBPC","operator":null,"version":null,"linked_to":"47879","reverse":true},{"package_id":0,"type":0,"name":"geniusr","operator":null,"version":null,"linked_to":"47909","reverse":true},{"package_id":0,"type":0,"name":"genscore","operator":null,"version":null,"linked_to":"48051","reverse":true},{"package_id":0,"type":0,"name":"geoAr","operator":null,"version":null,"linked_to":"48098","reverse":true},{"package_id":0,"type":0,"name":"geocacheR","operator":null,"version":null,"linked_to":"48145","reverse":true},{"package_id":0,"type":0,"name":"geogenr","operator":null,"version":null,"linked_to":"48301","reverse":true},{"package_id":0,"type":0,"name":"geohabnet","operator":null,"version":null,"linked_to":"48313","reverse":true},{"package_id":0,"type":0,"name":"geomander","operator":null,"version":null,"linked_to":"48400","reverse":true},{"package_id":0,"type":0,"name":"geospatialsuite","operator":null,"version":null,"linked_to":"48728","reverse":true},{"package_id":0,"type":0,"name":"gesisdata","operator":null,"version":null,"linked_to":"48980","reverse":true},{"package_id":0,"type":0,"name":"gfoRmula","operator":null,"version":null,"linked_to":"49314","reverse":true},{"package_id":0,"type":0,"name":"gfoRmulaICE","operator":null,"version":null,"linked_to":"49325","reverse":true},{"package_id":0,"type":0,"name":"ggDNAvis","operator":null,"version":null,"linked_to":"49616","reverse":true},{"package_id":0,"type":0,"name":"ggHoriPlot","operator":null,"version":null,"linked_to":"49946","reverse":true},{"package_id":0,"type":0,"name":"ggInterval","operator":null,"version":null,"linked_to":"49994","reverse":true},{"package_id":0,"type":0,"name":"ggPMX","operator":null,"version":null,"linked_to":"50465","reverse":true},{"package_id":0,"type":0,"name":"ggRandomForests","operator":null,"version":null,"linked_to":"50602","reverse":true},{"package_id":0,"type":0,"name":"ggResidpanel","operator":null,"version":null,"linked_to":"50673","reverse":true},{"package_id":0,"type":0,"name":"ggRtsy","operator":null,"version":null,"linked_to":"50708","reverse":true},{"package_id":0,"type":0,"name":"ggauto","operator":null,"version":null,"linked_to":"49418","reverse":true},{"package_id":0,"type":0,"name":"ggblanket","operator":null,"version":null,"linked_to":"49428","reverse":true},{"package_id":0,"type":0,"name":"ggcleveland","operator":null,"version":null,"linked_to":"49504","reverse":true},{"package_id":0,"type":0,"name":"ggdag","operator":null,"version":null,"linked_to":"49534","reverse":true},{"package_id":0,"type":0,"name":"ggdiagram","operator":null,"version":null,"linked_to":"49576","reverse":true},{"package_id":0,"type":0,"name":"ggetho","operator":null,"version":null,"linked_to":"49724","reverse":true},{"package_id":0,"type":0,"name":"ggfacto","operator":null,"version":null,"linked_to":"49741","reverse":true},{"package_id":0,"type":0,"name":"ggformula","operator":null,"version":null,"linked_to":"49803","reverse":true},{"package_id":0,"type":0,"name":"ggfortify","operator":null,"version":null,"linked_to":"49820","reverse":true},{"package_id":0,"type":0,"name":"gggenomes","operator":null,"version":null,"linked_to":"49878","reverse":true},{"package_id":0,"type":0,"name":"gginnards","operator":null,"version":null,"linked_to":"49983","reverse":true},{"package_id":0,"type":0,"name":"ggiraphExtra","operator":null,"version":null,"linked_to":"50086","reverse":true},{"package_id":0,"type":0,"name":"ggmap","operator":null,"version":null,"linked_to":"50148","reverse":true},{"package_id":0,"type":0,"name":"ggmice","operator":null,"version":null,"linked_to":"50177","reverse":true},{"package_id":0,"type":0,"name":"ggpage","operator":null,"version":null,"linked_to":"50307","reverse":true},{"package_id":0,"type":0,"name":"ggpedigree","operator":null,"version":null,"linked_to":"50334","reverse":true},{"package_id":0,"type":0,"name":"ggplate","operator":null,"version":null,"linked_to":"50372","reverse":true},{"package_id":0,"type":0,"name":"ggplotAssist","operator":null,"version":null,"linked_to":"50414","reverse":true},{"package_id":0,"type":0,"name":"ggplotgui","operator":null,"version":null,"linked_to":"50416","reverse":true},{"package_id":0,"type":0,"name":"ggpp","operator":null,"version":null,"linked_to":"50514","reverse":true},{"package_id":0,"type":0,"name":"ggquickeda","operator":null,"version":null,"linked_to":"50569","reverse":true},{"package_id":0,"type":0,"name":"ggreveal","operator":null,"version":null,"linked_to":"50674","reverse":true},{"package_id":0,"type":0,"name":"ggsem","operator":null,"version":null,"linked_to":"50766","reverse":true},{"package_id":0,"type":0,"name":"ggstats","operator":null,"version":null,"linked_to":"50893","reverse":true},{"package_id":0,"type":0,"name":"ggsurveillance","operator":null,"version":null,"linked_to":"50968","reverse":true},{"package_id":0,"type":0,"name":"ggthemes","operator":null,"version":null,"linked_to":"51018","reverse":true},{"package_id":0,"type":0,"name":"ggtikz","operator":null,"version":null,"linked_to":"51034","reverse":true},{"package_id":0,"type":0,"name":"gie","operator":null,"version":null,"linked_to":"51232","reverse":true},{"package_id":0,"type":0,"name":"gimap","operator":null,"version":null,"linked_to":"51294","reverse":true},{"package_id":0,"type":0,"name":"gitear","operator":null,"version":null,"linked_to":"51462","reverse":true},{"package_id":0,"type":0,"name":"gitlabr","operator":null,"version":null,"linked_to":"51491","reverse":true},{"package_id":0,"type":0,"name":"glmmPen","operator":null,"version":null,"linked_to":"51917","reverse":true},{"package_id":0,"type":0,"name":"globaltrends","operator":null,"version":null,"linked_to":"52182","reverse":true},{"package_id":0,"type":0,"name":"glscalibrator","operator":null,"version":null,"linked_to":"52231","reverse":true},{"package_id":0,"type":0,"name":"glyparse","operator":null,"version":null,"linked_to":"52280","reverse":true},{"package_id":0,"type":0,"name":"glyrepr","operator":null,"version":null,"linked_to":"52286","reverse":true},{"package_id":0,"type":0,"name":"gmgm","operator":null,"version":null,"linked_to":"52396","reverse":true},{"package_id":0,"type":0,"name":"gmoTree","operator":null,"version":null,"linked_to":"52484","reverse":true},{"package_id":0,"type":0,"name":"gms","operator":null,"version":null,"linked_to":"52518","reverse":true},{"package_id":0,"type":0,"name":"godley","operator":null,"version":null,"linked_to":"52677","reverse":true},{"package_id":0,"type":0,"name":"gofcat","operator":null,"version":null,"linked_to":"52704","reverse":true},{"package_id":0,"type":0,"name":"gompertztrunc","operator":null,"version":null,"linked_to":"52809","reverse":true},{"package_id":0,"type":0,"name":"googletraffic","operator":null,"version":null,"linked_to":"52950","reverse":true},{"package_id":0,"type":0,"name":"govinfoR","operator":null,"version":null,"linked_to":"53031","reverse":true},{"package_id":0,"type":0,"name":"gptstudio","operator":null,"version":null,"linked_to":"53389","reverse":true},{"package_id":0,"type":0,"name":"graph4lg","operator":null,"version":null,"linked_to":"53567","reverse":true},{"package_id":0,"type":0,"name":"gratia","operator":null,"version":null,"linked_to":"53746","reverse":true},{"package_id":0,"type":0,"name":"gravitas","operator":null,"version":null,"linked_to":"53818","reverse":true},{"package_id":0,"type":0,"name":"greekLetters","operator":null,"version":null,"linked_to":"53910","reverse":true},{"package_id":0,"type":0,"name":"greenSD","operator":null,"version":null,"linked_to":"53962","reverse":true},{"package_id":0,"type":0,"name":"greenfeedr","operator":null,"version":null,"linked_to":"53949","reverse":true},{"package_id":0,"type":0,"name":"gridtext","operator":null,"version":null,"linked_to":"54196","reverse":true},{"package_id":0,"type":0,"name":"grobblR","operator":null,"version":null,"linked_to":"54261","reverse":true},{"package_id":0,"type":0,"name":"grouprar","operator":null,"version":null,"linked_to":"54384","reverse":true},{"package_id":0,"type":0,"name":"growthTrendR","operator":null,"version":null,"linked_to":"54471","reverse":true},{"package_id":0,"type":0,"name":"grwat","operator":null,"version":null,"linked_to":"54549","reverse":true},{"package_id":0,"type":0,"name":"gscaLCA","operator":null,"version":null,"linked_to":"54587","reverse":true},{"package_id":0,"type":0,"name":"gscramble","operator":null,"version":null,"linked_to":"54596","reverse":true},{"package_id":0,"type":0,"name":"gsheet","operator":null,"version":null,"linked_to":"54677","reverse":true},{"package_id":0,"type":0,"name":"gtakeout","operator":null,"version":null,"linked_to":"54872","reverse":true},{"package_id":0,"type":0,"name":"gtreg","operator":null,"version":null,"linked_to":"54974","reverse":true},{"package_id":0,"type":0,"name":"guideR","operator":null,"version":null,"linked_to":"55079","reverse":true},{"package_id":0,"type":0,"name":"gumboot","operator":null,"version":null,"linked_to":"55121","reverse":true},{"package_id":0,"type":0,"name":"gunit","operator":null,"version":null,"linked_to":"55134","reverse":true},{"package_id":0,"type":0,"name":"gutenbergr","operator":null,"version":null,"linked_to":"55145","reverse":true},{"package_id":0,"type":0,"name":"gwasrapidd","operator":null,"version":null,"linked_to":"55242","reverse":true},{"package_id":0,"type":0,"name":"hahmmr","operator":null,"version":null,"linked_to":"55570","reverse":true},{"package_id":0,"type":0,"name":"hal9001","operator":null,"version":null,"linked_to":"55579","reverse":true},{"package_id":0,"type":0,"name":"haldensify","operator":null,"version":null,"linked_to":"55587","reverse":true},{"package_id":0,"type":0,"name":"handwriter","operator":null,"version":null,"linked_to":"55622","reverse":true},{"package_id":0,"type":0,"name":"handwriterApp","operator":null,"version":null,"linked_to":"55633","reverse":true},{"package_id":0,"type":0,"name":"handwriterRF","operator":null,"version":null,"linked_to":"55635","reverse":true},{"package_id":0,"type":0,"name":"harbinger","operator":null,"version":null,"linked_to":"55760","reverse":true},{"package_id":0,"type":0,"name":"hbal","operator":null,"version":null,"linked_to":"55918","reverse":true},{"package_id":0,"type":0,"name":"hdar","operator":null,"version":null,"linked_to":"56051","reverse":true},{"package_id":0,"type":0,"name":"hdpGLM","operator":null,"version":null,"linked_to":"56256","reverse":true},{"package_id":0,"type":0,"name":"healthbR","operator":null,"version":null,"linked_to":"56336","reverse":true},{"package_id":0,"type":0,"name":"healthdb","operator":null,"version":null,"linked_to":"56358","reverse":true},{"package_id":0,"type":0,"name":"healthyR","operator":null,"version":null,"linked_to":"56383","reverse":true},{"package_id":0,"type":0,"name":"healthyR.data","operator":null,"version":null,"linked_to":"56413","reverse":true},{"package_id":0,"type":0,"name":"heartbeatr","operator":null,"version":null,"linked_to":"56457","reverse":true},{"package_id":0,"type":0,"name":"heiscore","operator":null,"version":null,"linked_to":"56564","reverse":true},{"package_id":0,"type":0,"name":"hereR","operator":null,"version":null,"linked_to":"56711","reverse":true},{"package_id":0,"type":0,"name":"heritable","operator":null,"version":null,"linked_to":"56760","reverse":true},{"package_id":0,"type":0,"name":"heterocop","operator":null,"version":null,"linked_to":"56807","reverse":true},{"package_id":0,"type":0,"name":"hgnc","operator":null,"version":null,"linked_to":"56957","reverse":true},{"package_id":0,"type":0,"name":"hgutils","operator":null,"version":null,"linked_to":"56970","reverse":true},{"package_id":0,"type":0,"name":"hibayes","operator":null,"version":null,"linked_to":"57051","reverse":true},{"package_id":0,"type":0,"name":"highcharter","operator":null,"version":null,"linked_to":"57182","reverse":true},{"package_id":0,"type":0,"name":"highlightr","operator":null,"version":null,"linked_to":"57230","reverse":true},{"package_id":0,"type":0,"name":"hipecR","operator":null,"version":null,"linked_to":"57338","reverse":true},{"package_id":0,"type":0,"name":"hlaR","operator":null,"version":null,"linked_to":"57468","reverse":true},{"package_id":0,"type":0,"name":"hlidacr","operator":null,"version":null,"linked_to":"57482","reverse":true},{"package_id":0,"type":0,"name":"hmer","operator":null,"version":null,"linked_to":"57539","reverse":true},{"package_id":0,"type":0,"name":"hmetad","operator":null,"version":null,"linked_to":"57548","reverse":true},{"package_id":0,"type":0,"name":"hmmTMB","operator":null,"version":null,"linked_to":"57652","reverse":true},{"package_id":0,"type":0,"name":"holideh","operator":null,"version":null,"linked_to":"57778","reverse":true},{"package_id":0,"type":0,"name":"hoopR","operator":null,"version":null,"linked_to":"57834","reverse":true},{"package_id":0,"type":0,"name":"horsey","operator":null,"version":null,"linked_to":"57868","reverse":true},{"package_id":0,"type":0,"name":"hospitals","operator":null,"version":null,"linked_to":"57872","reverse":true},{"package_id":0,"type":0,"name":"htetree","operator":null,"version":null,"linked_to":"58130","reverse":true},{"package_id":0,"type":0,"name":"htmlTable","operator":null,"version":null,"linked_to":"58186","reverse":true},{"package_id":0,"type":0,"name":"htsr","operator":null,"version":null,"linked_to":"58267","reverse":true},{"package_id":0,"type":0,"name":"hubUtils","operator":null,"version":null,"linked_to":"58445","reverse":true},{"package_id":0,"type":0,"name":"hurricaneexposure","operator":null,"version":null,"linked_to":"58529","reverse":true},{"package_id":0,"type":0,"name":"huxtable","operator":null,"version":null,"linked_to":"58569","reverse":true},{"package_id":0,"type":0,"name":"hybridModels","operator":null,"version":null,"linked_to":"58667","reverse":true},{"package_id":0,"type":0,"name":"hydrodownloadR","operator":null,"version":null,"linked_to":"58733","reverse":true},{"package_id":0,"type":0,"name":"hypercube","operator":null,"version":null,"linked_to":"58852","reverse":true},{"package_id":0,"type":0,"name":"iNZightPlots","operator":null,"version":null,"linked_to":"62186","reverse":true},{"package_id":0,"type":0,"name":"iNZightTS","operator":null,"version":null,"linked_to":"62215","reverse":true},{"package_id":0,"type":0,"name":"iNZightTools","operator":null,"version":null,"linked_to":"62201","reverse":true},{"package_id":0,"type":0,"name":"iRfcb","operator":null,"version":null,"linked_to":"62722","reverse":true},{"package_id":0,"type":0,"name":"iSTAY","operator":null,"version":null,"linked_to":"63350","reverse":true},{"package_id":0,"type":0,"name":"iai","operator":null,"version":null,"linked_to":"59041","reverse":true},{"package_id":0,"type":0,"name":"ibawds","operator":null,"version":null,"linked_to":"59120","reverse":true},{"package_id":0,"type":0,"name":"icdpicr","operator":null,"version":null,"linked_to":"59369","reverse":true},{"package_id":0,"type":0,"name":"icdpicr2","operator":null,"version":null,"linked_to":"59371","reverse":true},{"package_id":0,"type":0,"name":"idbr","operator":null,"version":null,"linked_to":"59731","reverse":true},{"package_id":0,"type":0,"name":"ideamdb","operator":null,"version":null,"linked_to":"59762","reverse":true},{"package_id":0,"type":0,"name":"ideanet","operator":null,"version":null,"linked_to":"59763","reverse":true},{"package_id":0,"type":0,"name":"idiolect","operator":null,"version":null,"linked_to":"59847","reverse":true},{"package_id":0,"type":0,"name":"idmc","operator":null,"version":null,"linked_to":"59859","reverse":true},{"package_id":0,"type":0,"name":"ieegio","operator":null,"version":null,"linked_to":"59994","reverse":true},{"package_id":0,"type":0,"name":"igate","operator":null,"version":null,"linked_to":"60137","reverse":true},{"package_id":0,"type":0,"name":"iheiddown","operator":null,"version":null,"linked_to":"60272","reverse":true},{"package_id":0,"type":0,"name":"iimi","operator":null,"version":null,"linked_to":"60294","reverse":true},{"package_id":0,"type":0,"name":"ijtiff","operator":null,"version":null,"linked_to":"60313","reverse":true},{"package_id":0,"type":0,"name":"il.cbs.muni","operator":null,"version":null,"linked_to":"60353","reverse":true},{"package_id":0,"type":0,"name":"imager","operator":null,"version":null,"linked_to":"60452","reverse":true},{"package_id":0,"type":0,"name":"imdbapi","operator":null,"version":null,"linked_to":"60537","reverse":true},{"package_id":0,"type":0,"name":"immunarch","operator":null,"version":null,"linked_to":"60642","reverse":true},{"package_id":0,"type":0,"name":"immunogenetr","operator":null,"version":null,"linked_to":"60664","reverse":true},{"package_id":0,"type":0,"name":"impactr","operator":null,"version":null,"linked_to":"60707","reverse":true},{"package_id":0,"type":0,"name":"imputeREE","operator":null,"version":null,"linked_to":"60805","reverse":true},{"package_id":0,"type":0,"name":"indexr","operator":null,"version":null,"linked_to":"61028","reverse":true},{"package_id":0,"type":0,"name":"indonesiaFootballScoutR","operator":null,"version":null,"linked_to":"61072","reverse":true},{"package_id":0,"type":0,"name":"ineAtlas","operator":null,"version":null,"linked_to":"61086","reverse":true},{"package_id":0,"type":0,"name":"inecolr","operator":null,"version":null,"linked_to":"61089","reverse":true},{"package_id":0,"type":0,"name":"infoelectoral","operator":null,"version":null,"linked_to":"61260","reverse":true},{"package_id":0,"type":0,"name":"injurytools","operator":null,"version":null,"linked_to":"61330","reverse":true},{"package_id":0,"type":0,"name":"insee","operator":null,"version":null,"linked_to":"61507","reverse":true},{"package_id":0,"type":0,"name":"inshiny","operator":null,"version":null,"linked_to":"61522","reverse":true},{"package_id":0,"type":0,"name":"installr","operator":null,"version":null,"linked_to":"61664","reverse":true},{"package_id":0,"type":0,"name":"insurancerating","operator":null,"version":null,"linked_to":"61682","reverse":true},{"package_id":0,"type":0,"name":"interactionRCS","operator":null,"version":null,"linked_to":"61818","reverse":true},{"package_id":0,"type":0,"name":"interfacer","operator":null,"version":null,"linked_to":"61856","reverse":true},{"package_id":0,"type":0,"name":"inti","operator":null,"version":null,"linked_to":"61996","reverse":true},{"package_id":0,"type":0,"name":"intmed","operator":null,"version":null,"linked_to":"62036","reverse":true},{"package_id":0,"type":0,"name":"io","operator":null,"version":null,"linked_to":"62223","reverse":true},{"package_id":0,"type":0,"name":"ipeadatar","operator":null,"version":null,"linked_to":"62418","reverse":true},{"package_id":0,"type":0,"name":"ipsecr","operator":null,"version":null,"linked_to":"62561","reverse":true},{"package_id":0,"type":0,"name":"ir","operator":null,"version":null,"linked_to":"62662","reverse":true},{"package_id":0,"type":0,"name":"irrCAC","operator":null,"version":null,"linked_to":"62814","reverse":true},{"package_id":0,"type":0,"name":"ismtchile","operator":null,"version":null,"linked_to":"63012","reverse":true},{"package_id":0,"type":0,"name":"isobxr","operator":null,"version":null,"linked_to":"63048","reverse":true},{"package_id":0,"type":0,"name":"istatR","operator":null,"version":null,"linked_to":"63341","reverse":true},{"package_id":0,"type":0,"name":"itol.toolkit","operator":null,"version":null,"linked_to":"63420","reverse":true},{"package_id":0,"type":0,"name":"itraxR","operator":null,"version":null,"linked_to":"63435","reverse":true},{"package_id":0,"type":0,"name":"itsdm","operator":null,"version":null,"linked_to":"63472","reverse":true},{"package_id":0,"type":0,"name":"iucnr","operator":null,"version":null,"linked_to":"63492","reverse":true},{"package_id":0,"type":0,"name":"ivgets","operator":null,"version":null,"linked_to":"63521","reverse":true},{"package_id":0,"type":0,"name":"ixplorer","operator":null,"version":null,"linked_to":"63599","reverse":true},{"package_id":0,"type":0,"name":"izmir","operator":null,"version":null,"linked_to":"63606","reverse":true},{"package_id":0,"type":0,"name":"janitor","operator":null,"version":null,"linked_to":"63751","reverse":true},{"package_id":0,"type":0,"name":"japanstat","operator":null,"version":null,"linked_to":"63775","reverse":true},{"package_id":0,"type":0,"name":"jcext","operator":null,"version":null,"linked_to":"63818","reverse":true},{"package_id":0,"type":0,"name":"jellyfisher","operator":null,"version":null,"linked_to":"63861","reverse":true},{"package_id":0,"type":0,"name":"jmastats","operator":null,"version":null,"linked_to":"64024","reverse":true},{"package_id":0,"type":0,"name":"joinpointR","operator":null,"version":null,"linked_to":"64262","reverse":true},{"package_id":0,"type":0,"name":"journalabbr","operator":null,"version":null,"linked_to":"64387","reverse":true},{"package_id":0,"type":0,"name":"jpcity","operator":null,"version":null,"linked_to":"64409","reverse":true},{"package_id":0,"type":0,"name":"jpgrid","operator":null,"version":null,"linked_to":"64420","reverse":true},{"package_id":0,"type":0,"name":"jpinfect","operator":null,"version":null,"linked_to":"64425","reverse":true},{"package_id":0,"type":0,"name":"jpstat","operator":null,"version":null,"linked_to":"64460","reverse":true},{"package_id":0,"type":0,"name":"jrc","operator":null,"version":null,"linked_to":"64491","reverse":true},{"package_id":0,"type":0,"name":"juicedown","operator":null,"version":null,"linked_to":"64846","reverse":true},{"package_id":0,"type":0,"name":"k5","operator":null,"version":null,"linked_to":"64964","reverse":true},{"package_id":0,"type":0,"name":"kableExtra","operator":null,"version":null,"linked_to":"64966","reverse":true},{"package_id":0,"type":0,"name":"kanjistat","operator":null,"version":null,"linked_to":"65014","reverse":true},{"package_id":0,"type":0,"name":"kayadata","operator":null,"version":null,"linked_to":"65088","reverse":true},{"package_id":0,"type":0,"name":"kehra","operator":null,"version":null,"linked_to":"65186","reverse":true},{"package_id":0,"type":0,"name":"kesernetwork","operator":null,"version":null,"linked_to":"65593","reverse":true},{"package_id":0,"type":0,"name":"keyATM","operator":null,"version":null,"linked_to":"65597","reverse":true},{"package_id":0,"type":0,"name":"keyringr","operator":null,"version":null,"linked_to":"65652","reverse":true},{"package_id":0,"type":0,"name":"kgschart","operator":null,"version":null,"linked_to":"65714","reverse":true},{"package_id":0,"type":0,"name":"kindisperse","operator":null,"version":null,"linked_to":"65788","reverse":true},{"package_id":0,"type":0,"name":"knfi","operator":null,"version":null,"linked_to":"66042","reverse":true},{"package_id":0,"type":0,"name":"knitxl","operator":null,"version":null,"linked_to":"66103","reverse":true},{"package_id":0,"type":0,"name":"kntnr","operator":null,"version":null,"linked_to":"66173","reverse":true},{"package_id":0,"type":0,"name":"kokudosuuchi","operator":null,"version":null,"linked_to":"66238","reverse":true},{"package_id":0,"type":0,"name":"kuzco","operator":null,"version":null,"linked_to":"66534","reverse":true},{"package_id":0,"type":0,"name":"labelled","operator":null,"version":null,"linked_to":"66673","reverse":true},{"package_id":0,"type":0,"name":"lacrmr","operator":null,"version":null,"linked_to":"66745","reverse":true},{"package_id":0,"type":0,"name":"lactater","operator":null,"version":null,"linked_to":"66748","reverse":true},{"package_id":0,"type":0,"name":"lambdaTS","operator":null,"version":null,"linked_to":"66878","reverse":true},{"package_id":0,"type":0,"name":"lapop","operator":null,"version":null,"linked_to":"67091","reverse":true},{"package_id":0,"type":0,"name":"lares","operator":null,"version":null,"linked_to":"67094","reverse":true},{"package_id":0,"type":0,"name":"latte","operator":null,"version":null,"linked_to":"67267","reverse":true},{"package_id":0,"type":0,"name":"lavDiag","operator":null,"version":null,"linked_to":"67627","reverse":true},{"package_id":0,"type":0,"name":"lavaanPlot","operator":null,"version":null,"linked_to":"67596","reverse":true},{"package_id":0,"type":0,"name":"lazytrade","operator":null,"version":null,"linked_to":"67690","reverse":true},{"package_id":0,"type":0,"name":"lcsm","operator":null,"version":null,"linked_to":"67860","reverse":true},{"package_id":0,"type":0,"name":"leaflet.extras","operator":null,"version":null,"linked_to":"68068","reverse":true},{"package_id":0,"type":0,"name":"leakr","operator":null,"version":null,"linked_to":"68123","reverse":true},{"package_id":0,"type":0,"name":"ledger","operator":null,"version":null,"linked_to":"68222","reverse":true},{"package_id":0,"type":0,"name":"lehdr","operator":null,"version":null,"linked_to":"68311","reverse":true},{"package_id":0,"type":0,"name":"lehuynh","operator":null,"version":null,"linked_to":"68319","reverse":true},{"package_id":0,"type":0,"name":"lessSEM","operator":null,"version":null,"linked_to":"68478","reverse":true},{"package_id":0,"type":0,"name":"letsHerp","operator":null,"version":null,"linked_to":"68488","reverse":true},{"package_id":0,"type":0,"name":"letsRept","operator":null,"version":null,"linked_to":"68498","reverse":true},{"package_id":0,"type":0,"name":"libbib","operator":null,"version":null,"linked_to":"68718","reverse":true},{"package_id":0,"type":0,"name":"licoread","operator":null,"version":null,"linked_to":"68836","reverse":true},{"package_id":0,"type":0,"name":"lifeR","operator":null,"version":null,"linked_to":"68948","reverse":true},{"package_id":0,"type":0,"name":"liftr","operator":null,"version":null,"linked_to":"68966","reverse":true},{"package_id":0,"type":0,"name":"lilikoi","operator":null,"version":null,"linked_to":"69072","reverse":true},{"package_id":0,"type":0,"name":"linguisticsdown","operator":null,"version":null,"linked_to":"69262","reverse":true},{"package_id":0,"type":0,"name":"link","operator":null,"version":null,"linked_to":"69265","reverse":true},{"package_id":0,"type":0,"name":"lipidomeR","operator":null,"version":null,"linked_to":"69383","reverse":true},{"package_id":0,"type":0,"name":"litteR","operator":null,"version":null,"linked_to":"69499","reverse":true},{"package_id":0,"type":0,"name":"llmcoder","operator":null,"version":null,"linked_to":"69623","reverse":true},{"package_id":0,"type":0,"name":"llmhelper","operator":null,"version":null,"linked_to":"69626","reverse":true},{"package_id":0,"type":0,"name":"lnmCluster","operator":null,"version":null,"linked_to":"70020","reverse":true},{"package_id":0,"type":0,"name":"lobbyR","operator":null,"version":null,"linked_to":"70061","reverse":true},{"package_id":0,"type":0,"name":"locateip","operator":null,"version":null,"linked_to":"70127","reverse":true},{"package_id":0,"type":0,"name":"login","operator":null,"version":null,"linked_to":"70318","reverse":true},{"package_id":0,"type":0,"name":"logolink","operator":null,"version":null,"linked_to":"70401","reverse":true},{"package_id":0,"type":0,"name":"logrx","operator":null,"version":null,"linked_to":"70434","reverse":true},{"package_id":0,"type":0,"name":"logrxaddin","operator":null,"version":null,"linked_to":"70443","reverse":true},{"package_id":0,"type":0,"name":"longreadvqs","operator":null,"version":null,"linked_to":"70569","reverse":true},{"package_id":0,"type":0,"name":"longsurr","operator":null,"version":null,"linked_to":"70577","reverse":true},{"package_id":0,"type":0,"name":"lovecraftr","operator":null,"version":null,"linked_to":"70744","reverse":true},{"package_id":0,"type":0,"name":"ltertools","operator":null,"version":null,"linked_to":"71266","reverse":true},{"package_id":0,"type":0,"name":"lulab.utils","operator":null,"version":null,"linked_to":"71394","reverse":true},{"package_id":0,"type":0,"name":"m2r","operator":null,"version":null,"linked_to":"71551","reverse":true},{"package_id":0,"type":0,"name":"mKBO","operator":null,"version":null,"linked_to":"78970","reverse":true},{"package_id":0,"type":0,"name":"mRpostman","operator":null,"version":null,"linked_to":"82393","reverse":true},{"package_id":0,"type":0,"name":"macleish","operator":null,"version":null,"linked_to":"71656","reverse":true},{"package_id":0,"type":0,"name":"macrosyntR","operator":null,"version":null,"linked_to":"71680","reverse":true},{"package_id":0,"type":0,"name":"madshapR","operator":null,"version":null,"linked_to":"71760","reverse":true},{"package_id":0,"type":0,"name":"maicplus","operator":null,"version":null,"linked_to":"71946","reverse":true},{"package_id":0,"type":0,"name":"mailR","operator":null,"version":null,"linked_to":"71964","reverse":true},{"package_id":0,"type":0,"name":"malariaAtlas","operator":null,"version":null,"linked_to":"72051","reverse":true},{"package_id":0,"type":0,"name":"malaytextr","operator":null,"version":null,"linked_to":"72066","reverse":true},{"package_id":0,"type":0,"name":"managelocalrepo","operator":null,"version":null,"linked_to":"72131","reverse":true},{"package_id":0,"type":0,"name":"manydata","operator":null,"version":null,"linked_to":"72224","reverse":true},{"package_id":0,"type":0,"name":"manymodelr","operator":null,"version":null,"linked_to":"72242","reverse":true},{"package_id":0,"type":0,"name":"mapbayr","operator":null,"version":null,"linked_to":"72336","reverse":true},{"package_id":0,"type":0,"name":"mapindiatools","operator":null,"version":null,"linked_to":"72421","reverse":true},{"package_id":0,"type":0,"name":"mapmixture","operator":null,"version":null,"linked_to":"72492","reverse":true},{"package_id":0,"type":0,"name":"margaret","operator":null,"version":null,"linked_to":"72753","reverse":true},{"package_id":0,"type":0,"name":"mastif","operator":null,"version":null,"linked_to":"73353","reverse":true},{"package_id":0,"type":0,"name":"matchpointR","operator":null,"version":null,"linked_to":"73470","reverse":true},{"package_id":0,"type":0,"name":"materialmodifier","operator":null,"version":null,"linked_to":"73491","reverse":true},{"package_id":0,"type":0,"name":"matlabr","operator":null,"version":null,"linked_to":"73544","reverse":true},{"package_id":0,"type":0,"name":"matrixset","operator":null,"version":null,"linked_to":"73974","reverse":true},{"package_id":0,"type":0,"name":"matriz","operator":null,"version":null,"linked_to":"74018","reverse":true},{"package_id":0,"type":0,"name":"mau","operator":null,"version":null,"linked_to":"74091","reverse":true},{"package_id":0,"type":0,"name":"mauricer","operator":null,"version":null,"linked_to":"74094","reverse":true},{"package_id":0,"type":0,"name":"mccca","operator":null,"version":null,"linked_to":"74543","reverse":true},{"package_id":0,"type":0,"name":"mccount","operator":null,"version":null,"linked_to":"74558","reverse":true},{"package_id":0,"type":0,"name":"mclink","operator":null,"version":null,"linked_to":"74634","reverse":true},{"package_id":0,"type":0,"name":"mclm","operator":null,"version":null,"linked_to":"74638","reverse":true},{"package_id":0,"type":0,"name":"mcmsector","operator":null,"version":null,"linked_to":"74831","reverse":true},{"package_id":0,"type":0,"name":"mcmsupply","operator":null,"version":null,"linked_to":"74834","reverse":true},{"package_id":0,"type":0,"name":"mcp","operator":null,"version":null,"linked_to":"74862","reverse":true},{"package_id":0,"type":0,"name":"md4r","operator":null,"version":null,"linked_to":"74970","reverse":true},{"package_id":0,"type":0,"name":"mddmaps","operator":null,"version":null,"linked_to":"75014","reverse":true},{"package_id":0,"type":0,"name":"mdsr","operator":null,"version":null,"linked_to":"75144","reverse":true},{"package_id":0,"type":0,"name":"meantables","operator":null,"version":null,"linked_to":"75191","reverse":true},{"package_id":0,"type":0,"name":"measureR","operator":null,"version":null,"linked_to":"75219","reverse":true},{"package_id":0,"type":0,"name":"medExtractR","operator":null,"version":null,"linked_to":"75276","reverse":true},{"package_id":0,"type":0,"name":"melidosData","operator":null,"version":null,"linked_to":"75469","reverse":true},{"package_id":0,"type":0,"name":"memapp","operator":null,"version":null,"linked_to":"75512","reverse":true},{"package_id":0,"type":0,"name":"mergenstudio","operator":null,"version":null,"linked_to":"75682","reverse":true},{"package_id":0,"type":0,"name":"mergingTools","operator":null,"version":null,"linked_to":"75684","reverse":true},{"package_id":0,"type":0,"name":"mermboost","operator":null,"version":null,"linked_to":"75689","reverse":true},{"package_id":0,"type":0,"name":"messaging","operator":null,"version":null,"linked_to":"75735","reverse":true},{"package_id":0,"type":0,"name":"messy","operator":null,"version":null,"linked_to":"75738","reverse":true},{"package_id":0,"type":0,"name":"messy.cats","operator":null,"version":null,"linked_to":"75739","reverse":true},{"package_id":0,"type":0,"name":"metR","operator":null,"version":null,"linked_to":"76519","reverse":true},{"package_id":0,"type":0,"name":"meta","operator":null,"version":null,"linked_to":"75756","reverse":true},{"package_id":0,"type":0,"name":"metaGE","operator":null,"version":null,"linked_to":"76012","reverse":true},{"package_id":0,"type":0,"name":"metaboData","operator":null,"version":null,"linked_to":"75826","reverse":true},{"package_id":0,"type":0,"name":"metabolic","operator":null,"version":null,"linked_to":"75843","reverse":true},{"package_id":0,"type":0,"name":"metacoder","operator":null,"version":null,"linked_to":"75897","reverse":true},{"package_id":0,"type":0,"name":"metaconfoundr","operator":null,"version":null,"linked_to":"75922","reverse":true},{"package_id":0,"type":0,"name":"metacor","operator":null,"version":null,"linked_to":"75929","reverse":true},{"package_id":0,"type":0,"name":"metacore","operator":null,"version":null,"linked_to":"75936","reverse":true},{"package_id":0,"type":0,"name":"metadeconfoundR","operator":null,"version":null,"linked_to":"75963","reverse":true},{"package_id":0,"type":0,"name":"metagear","operator":null,"version":null,"linked_to":"76021","reverse":true},{"package_id":0,"type":0,"name":"metalite.sl","operator":null,"version":null,"linked_to":"76080","reverse":true},{"package_id":0,"type":0,"name":"metaprotr","operator":null,"version":null,"linked_to":"76249","reverse":true},{"package_id":0,"type":0,"name":"metasplines","operator":null,"version":null,"linked_to":"76316","reverse":true},{"package_id":0,"type":0,"name":"metatools","operator":null,"version":null,"linked_to":"76351","reverse":true},{"package_id":0,"type":0,"name":"meteospain","operator":null,"version":null,"linked_to":"76449","reverse":true},{"package_id":0,"type":0,"name":"metools","operator":null,"version":null,"linked_to":"76516","reverse":true},{"package_id":0,"type":0,"name":"metricminer","operator":null,"version":null,"linked_to":"76557","reverse":true},{"package_id":0,"type":0,"name":"metrix","operator":null,"version":null,"linked_to":"76585","reverse":true},{"package_id":0,"type":0,"name":"metsyn","operator":null,"version":null,"linked_to":"76634","reverse":true},{"package_id":0,"type":0,"name":"mfrmr","operator":null,"version":null,"linked_to":"76799","reverse":true},{"package_id":0,"type":0,"name":"mgi.report.reader","operator":null,"version":null,"linked_to":"77136","reverse":true},{"package_id":0,"type":0,"name":"mgm","operator":null,"version":null,"linked_to":"77153","reverse":true},{"package_id":0,"type":0,"name":"mgwrsar","operator":null,"version":null,"linked_to":"77207","reverse":true},{"package_id":0,"type":0,"name":"mhcnuggetsr","operator":null,"version":null,"linked_to":"77222","reverse":true},{"package_id":0,"type":0,"name":"mi4p","operator":null,"version":null,"linked_to":"77293","reverse":true},{"package_id":0,"type":0,"name":"miceafter","operator":null,"version":null,"linked_to":"77373","reverse":true},{"package_id":0,"type":0,"name":"microdiluteR","operator":null,"version":null,"linked_to":"77501","reverse":true},{"package_id":0,"type":0,"name":"micromapST","operator":null,"version":null,"linked_to":"77567","reverse":true},{"package_id":0,"type":0,"name":"migest","operator":null,"version":null,"linked_to":"77758","reverse":true},{"package_id":0,"type":0,"name":"minorparties","operator":null,"version":null,"linked_to":"78084","reverse":true},{"package_id":0,"type":0,"name":"mipplot","operator":null,"version":null,"linked_to":"78132","reverse":true},{"package_id":0,"type":0,"name":"mitre","operator":null,"version":null,"linked_to":"78566","reverse":true},{"package_id":0,"type":0,"name":"mixl","operator":null,"version":null,"linked_to":"78755","reverse":true},{"package_id":0,"type":0,"name":"mixvlmc","operator":null,"version":null,"linked_to":"78935","reverse":true},{"package_id":0,"type":0,"name":"mlergm","operator":null,"version":null,"linked_to":"79179","reverse":true},{"package_id":0,"type":0,"name":"mlr3shiny","operator":null,"version":null,"linked_to":"79819","reverse":true},{"package_id":0,"type":0,"name":"mlstrOpalr","operator":null,"version":null,"linked_to":"80017","reverse":true},{"package_id":0,"type":0,"name":"mmaqshiny","operator":null,"version":null,"linked_to":"80217","reverse":true},{"package_id":0,"type":0,"name":"mmrm","operator":null,"version":null,"linked_to":"80338","reverse":true},{"package_id":0,"type":0,"name":"modeldiagramR","operator":null,"version":null,"linked_to":"80628","reverse":true},{"package_id":0,"type":0,"name":"modeltime","operator":null,"version":null,"linked_to":"80779","reverse":true},{"package_id":0,"type":0,"name":"modeltime.ensemble","operator":null,"version":null,"linked_to":"80812","reverse":true},{"package_id":0,"type":0,"name":"modeltime.resample","operator":null,"version":null,"linked_to":"80833","reverse":true},{"package_id":0,"type":0,"name":"moderndive","operator":null,"version":null,"linked_to":"80865","reverse":true},{"package_id":0,"type":0,"name":"modisfast","operator":null,"version":null,"linked_to":"80949","reverse":true},{"package_id":0,"type":0,"name":"modsem","operator":null,"version":null,"linked_to":"80996","reverse":true},{"package_id":0,"type":0,"name":"mojson","operator":null,"version":null,"linked_to":"81085","reverse":true},{"package_id":0,"type":0,"name":"mongolstats","operator":null,"version":null,"linked_to":"81283","reverse":true},{"package_id":0,"type":0,"name":"monoClust","operator":null,"version":null,"linked_to":"81314","reverse":true},{"package_id":0,"type":0,"name":"moodleR","operator":null,"version":null,"linked_to":"81421","reverse":true},{"package_id":0,"type":0,"name":"moonBook","operator":null,"version":null,"linked_to":"81425","reverse":true},{"package_id":0,"type":0,"name":"morphemepiece","operator":null,"version":null,"linked_to":"81486","reverse":true},{"package_id":0,"type":0,"name":"motherduck","operator":null,"version":null,"linked_to":"81717","reverse":true},{"package_id":0,"type":0,"name":"movedesign","operator":null,"version":null,"linked_to":"81823","reverse":true},{"package_id":0,"type":0,"name":"movegroup","operator":null,"version":null,"linked_to":"81828","reverse":true},{"package_id":0,"type":0,"name":"mpindex","operator":null,"version":null,"linked_to":"81970","reverse":true},{"package_id":0,"type":0,"name":"mpoly","operator":null,"version":null,"linked_to":"82039","reverse":true},{"package_id":0,"type":0,"name":"mpwR","operator":null,"version":null,"linked_to":"82115","reverse":true},{"package_id":0,"type":0,"name":"mrap","operator":null,"version":null,"linked_to":"82157","reverse":true},{"package_id":0,"type":0,"name":"msSPChelpR","operator":null,"version":null,"linked_to":"82813","reverse":true},{"package_id":0,"type":0,"name":"msig","operator":null,"version":null,"linked_to":"82696","reverse":true},{"package_id":0,"type":0,"name":"mtscr","operator":null,"version":null,"linked_to":"82968","reverse":true},{"package_id":0,"type":0,"name":"muir","operator":null,"version":null,"linked_to":"83043","reverse":true},{"package_id":0,"type":0,"name":"multibridge","operator":null,"version":null,"linked_to":"83210","reverse":true},{"package_id":0,"type":0,"name":"multifear","operator":null,"version":null,"linked_to":"83307","reverse":true},{"package_id":0,"type":0,"name":"multilink","operator":null,"version":null,"linked_to":"83422","reverse":true},{"package_id":0,"type":0,"name":"multimorbidity","operator":null,"version":null,"linked_to":"83452","reverse":true},{"package_id":0,"type":0,"name":"multinma","operator":null,"version":null,"linked_to":"83494","reverse":true},{"package_id":0,"type":0,"name":"multipleITScontrol","operator":null,"version":null,"linked_to":"83568","reverse":true},{"package_id":0,"type":0,"name":"multipleOutcomes","operator":null,"version":null,"linked_to":"83574","reverse":true},{"package_id":0,"type":0,"name":"multitool","operator":null,"version":null,"linked_to":"83696","reverse":true},{"package_id":0,"type":0,"name":"mverse","operator":null,"version":null,"linked_to":"84011","reverse":true},{"package_id":0,"type":0,"name":"mxnorm","operator":null,"version":null,"linked_to":"84389","reverse":true},{"package_id":0,"type":0,"name":"myClim","operator":null,"version":null,"linked_to":"84404","reverse":true},{"package_id":0,"type":0,"name":"name","operator":null,"version":null,"linked_to":"84613","reverse":true},{"package_id":0,"type":0,"name":"namedropR","operator":null,"version":null,"linked_to":"84622","reverse":true},{"package_id":0,"type":0,"name":"nandb","operator":null,"version":null,"linked_to":"84649","reverse":true},{"package_id":0,"type":0,"name":"narray","operator":null,"version":null,"linked_to":"84815","reverse":true},{"package_id":0,"type":0,"name":"naryn","operator":null,"version":null,"linked_to":"84823","reverse":true},{"package_id":0,"type":0,"name":"nascaR.data","operator":null,"version":null,"linked_to":"84870","reverse":true},{"package_id":0,"type":0,"name":"ncaavolleyballr","operator":null,"version":null,"linked_to":"85065","reverse":true},{"package_id":0,"type":0,"name":"ncdfCF","operator":null,"version":null,"linked_to":"85119","reverse":true},{"package_id":0,"type":0,"name":"ndi","operator":null,"version":null,"linked_to":"85216","reverse":true},{"package_id":0,"type":0,"name":"necountries","operator":null,"version":null,"linked_to":"85305","reverse":true},{"package_id":0,"type":0,"name":"neonPlantEcology","operator":null,"version":null,"linked_to":"85398","reverse":true},{"package_id":0,"type":0,"name":"neonSoilFlux","operator":null,"version":null,"linked_to":"85402","reverse":true},{"package_id":0,"type":0,"name":"neotoma2","operator":null,"version":null,"linked_to":"85459","reverse":true},{"package_id":0,"type":0,"name":"nestedLogit","operator":null,"version":null,"linked_to":"85521","reverse":true},{"package_id":0,"type":0,"name":"netSEM","operator":null,"version":null,"linked_to":"85826","reverse":true},{"package_id":0,"type":0,"name":"netmhc2pan","operator":null,"version":null,"linked_to":"85753","reverse":true},{"package_id":0,"type":0,"name":"networkscaleup","operator":null,"version":null,"linked_to":"85958","reverse":true},{"package_id":0,"type":0,"name":"neuroim2","operator":null,"version":null,"linked_to":"86080","reverse":true},{"package_id":0,"type":0,"name":"neuroimaGene","operator":null,"version":null,"linked_to":"86083","reverse":true},{"package_id":0,"type":0,"name":"nfl4th","operator":null,"version":null,"linked_to":"86204","reverse":true},{"package_id":0,"type":0,"name":"nflfastR","operator":null,"version":null,"linked_to":"86212","reverse":true},{"package_id":0,"type":0,"name":"ngramr","operator":null,"version":null,"linked_to":"86303","reverse":true},{"package_id":0,"type":0,"name":"nhanesA","operator":null,"version":null,"linked_to":"86331","reverse":true},{"package_id":0,"type":0,"name":"nhanesdata","operator":null,"version":null,"linked_to":"86350","reverse":true},{"package_id":0,"type":0,"name":"nhdR","operator":null,"version":null,"linked_to":"86390","reverse":true},{"package_id":0,"type":0,"name":"nichevol","operator":null,"version":null,"linked_to":"86501","reverse":true},{"package_id":0,"type":0,"name":"nlmixr2rpt","operator":null,"version":null,"linked_to":"87118","reverse":true},{"package_id":0,"type":0,"name":"nlopt","operator":null,"version":null,"linked_to":"87148","reverse":true},{"package_id":0,"type":0,"name":"nlpsem","operator":null,"version":null,"linked_to":"87176","reverse":true},{"package_id":0,"type":0,"name":"nlrx","operator":null,"version":null,"linked_to":"87216","reverse":true},{"package_id":0,"type":0,"name":"nlstac","operator":null,"version":null,"linked_to":"87266","reverse":true},{"package_id":0,"type":0,"name":"noah","operator":null,"version":null,"linked_to":"87937","reverse":true},{"package_id":0,"type":0,"name":"nodeSub","operator":null,"version":null,"linked_to":"88008","reverse":true},{"package_id":0,"type":0,"name":"noisemodel","operator":null,"version":null,"linked_to":"88045","reverse":true},{"package_id":0,"type":0,"name":"nolock","operator":null,"version":null,"linked_to":"88054","reverse":true},{"package_id":0,"type":0,"name":"nomesbr","operator":null,"version":null,"linked_to":"88072","reverse":true},{"package_id":0,"type":0,"name":"normfluodbf","operator":null,"version":null,"linked_to":"88352","reverse":true},{"package_id":0,"type":0,"name":"nparACT","operator":null,"version":null,"linked_to":"88490","reverse":true},{"package_id":0,"type":0,"name":"npi","operator":null,"version":null,"linked_to":"88591","reverse":true},{"package_id":0,"type":0,"name":"nrlR","operator":null,"version":null,"linked_to":"88769","reverse":true},{"package_id":0,"type":0,"name":"nser","operator":null,"version":null,"linked_to":"88819","reverse":true},{"package_id":0,"type":0,"name":"nucim","operator":null,"version":null,"linked_to":"88949","reverse":true},{"package_id":0,"type":0,"name":"nuggets","operator":null,"version":null,"linked_to":"88958","reverse":true},{"package_id":0,"type":0,"name":"numbat","operator":null,"version":null,"linked_to":"88979","reverse":true},{"package_id":0,"type":0,"name":"nysOpenData","operator":null,"version":null,"linked_to":"89134","reverse":true},{"package_id":0,"type":0,"name":"nzilbb.labbcat","operator":null,"version":null,"linked_to":"89141","reverse":true},{"package_id":0,"type":0,"name":"nzilbb.vowels","operator":null,"version":null,"linked_to":"89161","reverse":true},{"package_id":0,"type":0,"name":"oai","operator":null,"version":null,"linked_to":"89187","reverse":true},{"package_id":0,"type":0,"name":"obfuscatoR","operator":null,"version":null,"linked_to":"89235","reverse":true},{"package_id":0,"type":0,"name":"occupationMeasurement","operator":null,"version":null,"linked_to":"89357","reverse":true},{"package_id":0,"type":0,"name":"ocf","operator":null,"version":null,"linked_to":"89440","reverse":true},{"package_id":0,"type":0,"name":"ogrdbstats","operator":null,"version":null,"linked_to":"89768","reverse":true},{"package_id":0,"type":0,"name":"ohvbd","operator":null,"version":null,"linked_to":"89818","reverse":true},{"package_id":0,"type":0,"name":"omicsTools","operator":null,"version":null,"linked_to":"89941","reverse":true},{"package_id":0,"type":0,"name":"omopgenerics","operator":null,"version":null,"linked_to":"89981","reverse":true},{"package_id":0,"type":0,"name":"omu","operator":null,"version":null,"linked_to":"90053","reverse":true},{"package_id":0,"type":0,"name":"onbrand","operator":null,"version":null,"linked_to":"90072","reverse":true},{"package_id":0,"type":0,"name":"onemapsgapi","operator":null,"version":null,"linked_to":"90169","reverse":true},{"package_id":0,"type":0,"name":"ontoFAST","operator":null,"version":null,"linked_to":"90281","reverse":true},{"package_id":0,"type":0,"name":"openCR","operator":null,"version":null,"linked_to":"90571","reverse":true},{"package_id":0,"type":0,"name":"openairmaps","operator":null,"version":null,"linked_to":"90475","reverse":true},{"package_id":0,"type":0,"name":"openappr","operator":null,"version":null,"linked_to":"90509","reverse":true},{"package_id":0,"type":0,"name":"opencis","operator":null,"version":null,"linked_to":"90536","reverse":true},{"package_id":0,"type":0,"name":"openscoring","operator":null,"version":null,"linked_to":"90788","reverse":true},{"package_id":0,"type":0,"name":"opinAr","operator":null,"version":null,"linked_to":"91028","reverse":true},{"package_id":0,"type":0,"name":"optiSel","operator":null,"version":null,"linked_to":"91271","reverse":true},{"package_id":0,"type":0,"name":"optiSolve","operator":null,"version":null,"linked_to":"91289","reverse":true},{"package_id":0,"type":0,"name":"optim.functions","operator":null,"version":null,"linked_to":"91117","reverse":true},{"package_id":0,"type":0,"name":"ordbetareg","operator":null,"version":null,"linked_to":"91433","reverse":true},{"package_id":0,"type":0,"name":"orderanalyzer","operator":null,"version":null,"linked_to":"91458","reverse":true},{"package_id":0,"type":0,"name":"ordr","operator":null,"version":null,"linked_to":"91587","reverse":true},{"package_id":0,"type":0,"name":"organizr","operator":null,"version":null,"linked_to":"91621","reverse":true},{"package_id":0,"type":0,"name":"osrmr","operator":null,"version":null,"linked_to":"91915","reverse":true},{"package_id":0,"type":0,"name":"ottrpal","operator":null,"version":null,"linked_to":"92001","reverse":true},{"package_id":0,"type":0,"name":"outreg","operator":null,"version":null,"linked_to":"92103","reverse":true},{"package_id":0,"type":0,"name":"outstandR","operator":null,"version":null,"linked_to":"92117","reverse":true},{"package_id":0,"type":0,"name":"overshiny","operator":null,"version":null,"linked_to":"92161","reverse":true},{"package_id":0,"type":0,"name":"oxcAAR","operator":null,"version":null,"linked_to":"92247","reverse":true},{"package_id":0,"type":0,"name":"oysteR","operator":null,"version":null,"linked_to":"92263","reverse":true},{"package_id":0,"type":0,"name":"packagefinder","operator":null,"version":null,"linked_to":"92315","reverse":true},{"package_id":0,"type":0,"name":"panelr","operator":null,"version":null,"linked_to":"93046","reverse":true},{"package_id":0,"type":0,"name":"panelsummary","operator":null,"version":null,"linked_to":"93065","reverse":true},{"package_id":0,"type":0,"name":"pannotator","operator":null,"version":null,"linked_to":"93105","reverse":true},{"package_id":0,"type":0,"name":"parcats","operator":null,"version":null,"linked_to":"93388","reverse":true},{"package_id":0,"type":0,"name":"parseRPDR","operator":null,"version":null,"linked_to":"93534","reverse":true},{"package_id":0,"type":0,"name":"partition","operator":null,"version":null,"linked_to":"93630","reverse":true},{"package_id":0,"type":0,"name":"partycoloR","operator":null,"version":null,"linked_to":"93692","reverse":true},{"package_id":0,"type":0,"name":"pathviewr","operator":null,"version":null,"linked_to":"93889","reverse":true},{"package_id":0,"type":0,"name":"patientProfilesVis","operator":null,"version":null,"linked_to":"93945","reverse":true},{"package_id":0,"type":0,"name":"pdfetch","operator":null,"version":null,"linked_to":"94926","reverse":true},{"package_id":0,"type":0,"name":"pdi","operator":null,"version":null,"linked_to":"94971","reverse":true},{"package_id":0,"type":0,"name":"peacesciencer","operator":null,"version":null,"linked_to":"95055","reverse":true},{"package_id":0,"type":0,"name":"pepdiff","operator":null,"version":null,"linked_to":"95479","reverse":true},{"package_id":0,"type":0,"name":"pepr","operator":null,"version":null,"linked_to":"95496","reverse":true},{"package_id":0,"type":0,"name":"peptoolkit","operator":null,"version":null,"linked_to":"95515","reverse":true},{"package_id":0,"type":0,"name":"permRand","operator":null,"version":null,"linked_to":"95682","reverse":true},{"package_id":0,"type":0,"name":"peruflorads43","operator":null,"version":null,"linked_to":"95792","reverse":true},{"package_id":0,"type":0,"name":"perumammals","operator":null,"version":null,"linked_to":"95798","reverse":true},{"package_id":0,"type":0,"name":"petersenlab","operator":null,"version":null,"linked_to":"95828","reverse":true},{"package_id":0,"type":0,"name":"pewdata","operator":null,"version":null,"linked_to":"95852","reverse":true},{"package_id":0,"type":0,"name":"pguIMP","operator":null,"version":null,"linked_to":"95995","reverse":true},{"package_id":0,"type":0,"name":"pharmaRTF","operator":null,"version":null,"linked_to":"96048","reverse":true},{"package_id":0,"type":0,"name":"phenofit","operator":null,"version":null,"linked_to":"96210","reverse":true},{"package_id":0,"type":0,"name":"phenomap","operator":null,"version":null,"linked_to":"96241","reverse":true},{"package_id":0,"type":0,"name":"phenopix","operator":null,"version":null,"linked_to":"96245","reverse":true},{"package_id":0,"type":0,"name":"phonetisr","operator":null,"version":null,"linked_to":"96366","reverse":true},{"package_id":0,"type":0,"name":"photobiology","operator":null,"version":null,"linked_to":"96402","reverse":true},{"package_id":0,"type":0,"name":"photobiologyInOut","operator":null,"version":null,"linked_to":"96452","reverse":true},{"package_id":0,"type":0,"name":"photosynthesis","operator":null,"version":null,"linked_to":"96524","reverse":true},{"package_id":0,"type":0,"name":"phscs","operator":null,"version":null,"linked_to":"96556","reverse":true},{"package_id":0,"type":0,"name":"phsmethods","operator":null,"version":null,"linked_to":"96557","reverse":true},{"package_id":0,"type":0,"name":"picClip","operator":null,"version":null,"linked_to":"96835","reverse":true},{"package_id":0,"type":0,"name":"piecemaker","operator":null,"version":null,"linked_to":"96849","reverse":true},{"package_id":0,"type":0,"name":"piecepackr","operator":null,"version":null,"linked_to":"96857","reverse":true},{"package_id":0,"type":0,"name":"pikchr","operator":null,"version":null,"linked_to":"96931","reverse":true},{"package_id":0,"type":0,"name":"pingers","operator":null,"version":null,"linked_to":"96987","reverse":true},{"package_id":0,"type":0,"name":"pipefittr","operator":null,"version":null,"linked_to":"97073","reverse":true},{"package_id":0,"type":0,"name":"pipr","operator":null,"version":null,"linked_to":"97089","reverse":true},{"package_id":0,"type":0,"name":"piwikproR","operator":null,"version":null,"linked_to":"97155","reverse":true},{"package_id":0,"type":0,"name":"pixelpuzzle","operator":null,"version":null,"linked_to":"97164","reverse":true},{"package_id":0,"type":0,"name":"pizzarr","operator":null,"version":null,"linked_to":"97183","reverse":true},{"package_id":0,"type":0,"name":"pkggraph","operator":null,"version":null,"linked_to":"97319","reverse":true},{"package_id":0,"type":0,"name":"placematchr","operator":null,"version":null,"linked_to":"97513","reverse":true},{"package_id":0,"type":0,"name":"planscorer","operator":null,"version":null,"linked_to":"97587","reverse":true},{"package_id":0,"type":0,"name":"player","operator":null,"version":null,"linked_to":"97658","reverse":true},{"package_id":0,"type":0,"name":"plot3logit","operator":null,"version":null,"linked_to":"97859","reverse":true},{"package_id":0,"type":0,"name":"plotcli","operator":null,"version":null,"linked_to":"97883","reverse":true},{"package_id":0,"type":0,"name":"plotor","operator":null,"version":null,"linked_to":"97992","reverse":true},{"package_id":0,"type":0,"name":"plotthis","operator":null,"version":null,"linked_to":"98039","reverse":true},{"package_id":0,"type":0,"name":"plssem","operator":null,"version":null,"linked_to":"98178","reverse":true},{"package_id":0,"type":0,"name":"plume","operator":null,"version":null,"linked_to":"98231","reverse":true},{"package_id":0,"type":0,"name":"plutor","operator":null,"version":null,"linked_to":"98247","reverse":true},{"package_id":0,"type":0,"name":"pmartR","operator":null,"version":null,"linked_to":"98282","reverse":true},{"package_id":0,"type":0,"name":"pmetar","operator":null,"version":null,"linked_to":"98353","reverse":true},{"package_id":0,"type":0,"name":"pmml","operator":null,"version":null,"linked_to":"98396","reverse":true},{"package_id":0,"type":0,"name":"pmxTools","operator":null,"version":null,"linked_to":"98482","reverse":true},{"package_id":0,"type":0,"name":"pointr","operator":null,"version":null,"linked_to":"98669","reverse":true},{"package_id":0,"type":0,"name":"poldis","operator":null,"version":null,"linked_to":"98810","reverse":true},{"package_id":0,"type":0,"name":"polimetrics","operator":null,"version":null,"linked_to":"98832","reverse":true},{"package_id":0,"type":0,"name":"polished","operator":null,"version":null,"linked_to":"98839","reverse":true},{"package_id":0,"type":0,"name":"politeness","operator":null,"version":null,"linked_to":"98856","reverse":true},{"package_id":0,"type":0,"name":"pollster","operator":null,"version":null,"linked_to":"98912","reverse":true},{"package_id":0,"type":0,"name":"polyglotr","operator":null,"version":null,"linked_to":"99014","reverse":true},{"package_id":0,"type":0,"name":"polypharmacy","operator":null,"version":null,"linked_to":"99084","reverse":true},{"package_id":0,"type":0,"name":"polywog","operator":null,"version":null,"linked_to":"99135","reverse":true},{"package_id":0,"type":0,"name":"pomcheckr","operator":null,"version":null,"linked_to":"99143","reverse":true},{"package_id":0,"type":0,"name":"popstudy","operator":null,"version":null,"linked_to":"99447","reverse":true},{"package_id":0,"type":0,"name":"postcard","operator":null,"version":null,"linked_to":"99636","reverse":true},{"package_id":0,"type":0,"name":"postpack","operator":null,"version":null,"linked_to":"99697","reverse":true},{"package_id":0,"type":0,"name":"poth","operator":null,"version":null,"linked_to":"99708","reverse":true},{"package_id":0,"type":0,"name":"pould","operator":null,"version":null,"linked_to":"99723","reverse":true},{"package_id":0,"type":0,"name":"powerNLSEM","operator":null,"version":null,"linked_to":"99853","reverse":true},{"package_id":0,"type":0,"name":"powerbydesign","operator":null,"version":null,"linked_to":"99791","reverse":true},{"package_id":0,"type":0,"name":"ppendemic","operator":null,"version":null,"linked_to":"99942","reverse":true},{"package_id":0,"type":0,"name":"ppmf","operator":null,"version":null,"linked_to":"99993","reverse":true},{"package_id":0,"type":0,"name":"pre","operator":null,"version":null,"linked_to":"100219","reverse":true},{"package_id":0,"type":0,"name":"precmed","operator":null,"version":null,"linked_to":"100291","reverse":true},{"package_id":0,"type":0,"name":"predict3d","operator":null,"version":null,"linked_to":"100348","reverse":true},{"package_id":0,"type":0,"name":"presenter","operator":null,"version":null,"linked_to":"100546","reverse":true},{"package_id":0,"type":0,"name":"pressuRe","operator":null,"version":null,"linked_to":"100573","reverse":true},{"package_id":0,"type":0,"name":"pretestcad","operator":null,"version":null,"linked_to":"100582","reverse":true},{"package_id":0,"type":0,"name":"priceR","operator":null,"version":null,"linked_to":"100709","reverse":true},{"package_id":0,"type":0,"name":"prider","operator":null,"version":null,"linked_to":"100736","reverse":true},{"package_id":0,"type":0,"name":"primerTree","operator":null,"version":null,"linked_to":"100771","reverse":true},{"package_id":0,"type":0,"name":"prism","operator":null,"version":null,"linked_to":"100912","reverse":true},{"package_id":0,"type":0,"name":"proPubBills","operator":null,"version":null,"linked_to":"101590","reverse":true},{"package_id":0,"type":0,"name":"processcheckR","operator":null,"version":null,"linked_to":"101097","reverse":true},{"package_id":0,"type":0,"name":"processmapR","operator":null,"version":null,"linked_to":"101106","reverse":true},{"package_id":0,"type":0,"name":"processpredictR","operator":null,"version":null,"linked_to":"101124","reverse":true},{"package_id":0,"type":0,"name":"profr","operator":null,"version":null,"linked_to":"101308","reverse":true},{"package_id":0,"type":0,"name":"projectLSA","operator":null,"version":null,"linked_to":"101391","reverse":true},{"package_id":0,"type":0,"name":"projects","operator":null,"version":null,"linked_to":"101414","reverse":true},{"package_id":0,"type":0,"name":"projoint","operator":null,"version":null,"linked_to":"101442","reverse":true},{"package_id":0,"type":0,"name":"promote","operator":null,"version":null,"linked_to":"101511","reverse":true},{"package_id":0,"type":0,"name":"promotionImpact","operator":null,"version":null,"linked_to":"101516","reverse":true},{"package_id":0,"type":0,"name":"promptr","operator":null,"version":null,"linked_to":"101529","reverse":true},{"package_id":0,"type":0,"name":"proteus","operator":null,"version":null,"linked_to":"101657","reverse":true},{"package_id":0,"type":0,"name":"protti","operator":null,"version":null,"linked_to":"101716","reverse":true},{"package_id":0,"type":0,"name":"proustr","operator":null,"version":null,"linked_to":"101748","reverse":true},{"package_id":0,"type":0,"name":"provExplainR","operator":null,"version":null,"linked_to":"101772","reverse":true},{"package_id":0,"type":0,"name":"proverbs","operator":null,"version":null,"linked_to":"101768","reverse":true},{"package_id":0,"type":0,"name":"provolleyballr","operator":null,"version":null,"linked_to":"101777","reverse":true},{"package_id":0,"type":0,"name":"prozor","operator":null,"version":null,"linked_to":"101838","reverse":true},{"package_id":0,"type":0,"name":"psHarmonize","operator":null,"version":null,"linked_to":"102079","reverse":true},{"package_id":0,"type":0,"name":"pseudobibeR","operator":null,"version":null,"linked_to":"102023","reverse":true},{"package_id":0,"type":0,"name":"psfmi","operator":null,"version":null,"linked_to":"102042","reverse":true},{"package_id":0,"type":0,"name":"psidread","operator":null,"version":null,"linked_to":"102096","reverse":true},{"package_id":0,"type":0,"name":"psm3mkv","operator":null,"version":null,"linked_to":"102119","reverse":true},{"package_id":0,"type":0,"name":"pspatreg","operator":null,"version":null,"linked_to":"102133","reverse":true},{"package_id":0,"type":0,"name":"psycho","operator":null,"version":null,"linked_to":"102360","reverse":true},{"package_id":0,"type":0,"name":"pubchem.bio","operator":null,"version":null,"linked_to":"102638","reverse":true},{"package_id":0,"type":0,"name":"pubmedtk","operator":null,"version":null,"linked_to":"102739","reverse":true},{"package_id":0,"type":0,"name":"pureseqtmr","operator":null,"version":null,"linked_to":"102854","reverse":true},{"package_id":0,"type":0,"name":"pvda","operator":null,"version":null,"linked_to":"102943","reverse":true},{"package_id":0,"type":0,"name":"pwrFDR","operator":null,"version":null,"linked_to":"103034","reverse":true},{"package_id":0,"type":0,"name":"pxmake","operator":null,"version":null,"linked_to":"103071","reverse":true},{"package_id":0,"type":0,"name":"qMRI","operator":null,"version":null,"linked_to":"103574","reverse":true},{"package_id":0,"type":0,"name":"qbr","operator":null,"version":null,"linked_to":"103217","reverse":true},{"package_id":0,"type":0,"name":"qch","operator":null,"version":null,"linked_to":"103280","reverse":true},{"package_id":0,"type":0,"name":"qgisprocess","operator":null,"version":null,"linked_to":"103427","reverse":true},{"package_id":0,"type":0,"name":"qsub","operator":null,"version":null,"linked_to":"103903","reverse":true},{"package_id":0,"type":0,"name":"qtl2ggplot","operator":null,"version":null,"linked_to":"103976","reverse":true},{"package_id":0,"type":0,"name":"qtl2pattern","operator":null,"version":null,"linked_to":"103982","reverse":true},{"package_id":0,"type":0,"name":"quadVAR","operator":null,"version":null,"linked_to":"104130","reverse":true},{"package_id":0,"type":0,"name":"qualitycontrol","operator":null,"version":null,"linked_to":"104135","reverse":true},{"package_id":0,"type":0,"name":"qualtRics","operator":null,"version":null,"linked_to":"104153","reverse":true},{"package_id":0,"type":0,"name":"quickSentiment","operator":null,"version":null,"linked_to":"104646","reverse":true},{"package_id":0,"type":0,"name":"quid","operator":null,"version":null,"linked_to":"104656","reverse":true},{"package_id":0,"type":0,"name":"r2dictionary","operator":null,"version":null,"linked_to":"104899","reverse":true},{"package_id":0,"type":0,"name":"r2dii.plot","operator":null,"version":null,"linked_to":"104963","reverse":true},{"package_id":0,"type":0,"name":"r2mlm","operator":null,"version":null,"linked_to":"104997","reverse":true},{"package_id":0,"type":0,"name":"r2shortcode","operator":null,"version":null,"linked_to":"105089","reverse":true},{"package_id":0,"type":0,"name":"r4ss","operator":null,"version":null,"linked_to":"105182","reverse":true},{"package_id":0,"type":0,"name":"r4subtrace","operator":null,"version":null,"linked_to":"105192","reverse":true},{"package_id":0,"type":0,"name":"r6methods","operator":null,"version":null,"linked_to":"105246","reverse":true},{"package_id":0,"type":0,"name":"rADA","operator":null,"version":null,"linked_to":"105338","reverse":true},{"package_id":0,"type":0,"name":"rAmCharts4","operator":null,"version":null,"linked_to":"105745","reverse":true},{"package_id":0,"type":0,"name":"rCNV","operator":null,"version":null,"linked_to":"107895","reverse":true},{"package_id":0,"type":0,"name":"rFIA","operator":null,"version":null,"linked_to":"112198","reverse":true},{"package_id":0,"type":0,"name":"rKOMICS","operator":null,"version":null,"linked_to":"114093","reverse":true},{"package_id":0,"type":0,"name":"rKolada","operator":null,"version":null,"linked_to":"114083","reverse":true},{"package_id":0,"type":0,"name":"rPraat","operator":null,"version":null,"linked_to":"117589","reverse":true},{"package_id":0,"type":0,"name":"rPublic","operator":null,"version":null,"linked_to":"117711","reverse":true},{"package_id":0,"type":0,"name":"rSRD","operator":null,"version":null,"linked_to":"119008","reverse":true},{"package_id":0,"type":0,"name":"rUM","operator":null,"version":null,"linked_to":"120040","reverse":true},{"package_id":0,"type":0,"name":"racademyocean","operator":null,"version":null,"linked_to":"105275","reverse":true},{"package_id":0,"type":0,"name":"ractivecampaign","operator":null,"version":null,"linked_to":"105333","reverse":true},{"package_id":0,"type":0,"name":"radiant.model","operator":null,"version":null,"linked_to":"105427","reverse":true},{"package_id":0,"type":0,"name":"radlibs","operator":null,"version":null,"linked_to":"105489","reverse":true},{"package_id":0,"type":0,"name":"radsafer","operator":null,"version":null,"linked_to":"105505","reverse":true},{"package_id":0,"type":0,"name":"rainette","operator":null,"version":null,"linked_to":"105667","reverse":true},{"package_id":0,"type":0,"name":"ralger","operator":null,"version":null,"linked_to":"105690","reverse":true},{"package_id":0,"type":0,"name":"random.cdisc.data","operator":null,"version":null,"linked_to":"105838","reverse":true},{"package_id":0,"type":0,"name":"randomcoloR","operator":null,"version":null,"linked_to":"105846","reverse":true},{"package_id":0,"type":0,"name":"rapidcodeR","operator":null,"version":null,"linked_to":"106207","reverse":true},{"package_id":0,"type":0,"name":"rappleads","operator":null,"version":null,"linked_to":"106265","reverse":true},{"package_id":0,"type":0,"name":"rapport","operator":null,"version":null,"linked_to":"106266","reverse":true},{"package_id":0,"type":0,"name":"rappsflyer","operator":null,"version":null,"linked_to":"106272","reverse":true},{"package_id":0,"type":0,"name":"ratios","operator":null,"version":null,"linked_to":"106610","reverse":true},{"package_id":0,"type":0,"name":"rattle","operator":null,"version":null,"linked_to":"106632","reverse":true},{"package_id":0,"type":0,"name":"raws.profile","operator":null,"version":null,"linked_to":"106735","reverse":true},{"package_id":0,"type":0,"name":"rb3","operator":null,"version":null,"linked_to":"106802","reverse":true},{"package_id":0,"type":0,"name":"rbioacc","operator":null,"version":null,"linked_to":"107074","reverse":true},{"package_id":0,"type":0,"name":"rbmi","operator":null,"version":null,"linked_to":"107160","reverse":true},{"package_id":0,"type":0,"name":"rcatfish","operator":null,"version":null,"linked_to":"107340","reverse":true},{"package_id":0,"type":0,"name":"rcdf","operator":null,"version":null,"linked_to":"107394","reverse":true},{"package_id":0,"type":0,"name":"rcompendium","operator":null,"version":null,"linked_to":"107965","reverse":true},{"package_id":0,"type":0,"name":"rcprd","operator":null,"version":null,"linked_to":"108701","reverse":true},{"package_id":0,"type":0,"name":"rcrisp","operator":null,"version":null,"linked_to":"108723","reverse":true},{"package_id":0,"type":0,"name":"rcrossref","operator":null,"version":null,"linked_to":"108737","reverse":true},{"package_id":0,"type":0,"name":"rd2d","operator":null,"version":null,"linked_to":"108885","reverse":true},{"package_id":0,"type":0,"name":"rdi","operator":null,"version":null,"linked_to":"109092","reverse":true},{"package_id":0,"type":0,"name":"rdnb","operator":null,"version":null,"linked_to":"109192","reverse":true},{"package_id":0,"type":0,"name":"rdracor","operator":null,"version":null,"linked_to":"109270","reverse":true},{"package_id":0,"type":0,"name":"rdwplus","operator":null,"version":null,"linked_to":"109399","reverse":true},{"package_id":0,"type":0,"name":"read.abares","operator":null,"version":null,"linked_to":"109457","reverse":true},{"package_id":0,"type":0,"name":"readJDX","operator":null,"version":null,"linked_to":"109539","reverse":true},{"package_id":0,"type":0,"name":"readMDTable","operator":null,"version":null,"linked_to":"109548","reverse":true},{"package_id":0,"type":0,"name":"readapra","operator":null,"version":null,"linked_to":"109507","reverse":true},{"package_id":0,"type":0,"name":"readmit","operator":null,"version":null,"linked_to":"109559","reverse":true},{"package_id":0,"type":0,"name":"readrba","operator":null,"version":null,"linked_to":"109614","reverse":true},{"package_id":0,"type":0,"name":"readsdr","operator":null,"version":null,"linked_to":"109632","reverse":true},{"package_id":0,"type":0,"name":"readtextgrid","operator":null,"version":null,"linked_to":"109668","reverse":true},{"package_id":0,"type":0,"name":"ready4","operator":null,"version":null,"linked_to":"109698","reverse":true},{"package_id":0,"type":0,"name":"readyomics","operator":null,"version":null,"linked_to":"109703","reverse":true},{"package_id":0,"type":0,"name":"rebib","operator":null,"version":null,"linked_to":"109777","reverse":true},{"package_id":0,"type":0,"name":"recodeflow","operator":null,"version":null,"linked_to":"109913","reverse":true},{"package_id":0,"type":0,"name":"recurrentpseudo","operator":null,"version":null,"linked_to":"109995","reverse":true},{"package_id":0,"type":0,"name":"redatam","operator":null,"version":null,"linked_to":"110042","reverse":true},{"package_id":0,"type":0,"name":"redist","operator":null,"version":null,"linked_to":"110195","reverse":true},{"package_id":0,"type":0,"name":"refdb","operator":null,"version":null,"linked_to":"110320","reverse":true},{"package_id":0,"type":0,"name":"refitgaps","operator":null,"version":null,"linked_to":"110356","reverse":true},{"package_id":0,"type":0,"name":"reflectR","operator":null,"version":null,"linked_to":"110362","reverse":true},{"package_id":0,"type":0,"name":"refreg","operator":null,"version":null,"linked_to":"110383","reverse":true},{"package_id":0,"type":0,"name":"refreshr","operator":null,"version":null,"linked_to":"110385","reverse":true},{"package_id":0,"type":0,"name":"regextable","operator":null,"version":null,"linked_to":"110466","reverse":true},{"package_id":0,"type":0,"name":"regions","operator":null,"version":null,"linked_to":"110496","reverse":true},{"package_id":0,"type":0,"name":"regrrr","operator":null,"version":null,"linked_to":"110588","reverse":true},{"package_id":0,"type":0,"name":"relSim","operator":null,"version":null,"linked_to":"110809","reverse":true},{"package_id":0,"type":0,"name":"repfun","operator":null,"version":null,"linked_to":"111109","reverse":true},{"package_id":0,"type":0,"name":"reproducer","operator":null,"version":null,"linked_to":"111336","reverse":true},{"package_id":0,"type":0,"name":"reptiledb.data","operator":null,"version":null,"linked_to":"111408","reverse":true},{"package_id":0,"type":0,"name":"reshape2","operator":null,"version":null,"linked_to":"111580","reverse":true},{"package_id":0,"type":0,"name":"reslr","operator":null,"version":null,"linked_to":"111619","reverse":true},{"package_id":0,"type":0,"name":"respR","operator":null,"version":null,"linked_to":"111671","reverse":true},{"package_id":0,"type":0,"name":"retimer","operator":null,"version":null,"linked_to":"111882","reverse":true},{"package_id":0,"type":0,"name":"retrosheet","operator":null,"version":null,"linked_to":"111911","reverse":true},{"package_id":0,"type":0,"name":"revise","operator":null,"version":null,"linked_to":"111989","reverse":true},{"package_id":0,"type":0,"name":"rexer","operator":null,"version":null,"linked_to":"112026","reverse":true},{"package_id":0,"type":0,"name":"rfacebookstat","operator":null,"version":null,"linked_to":"112059","reverse":true},{"package_id":0,"type":0,"name":"rfars","operator":null,"version":null,"linked_to":"112095","reverse":true},{"package_id":0,"type":0,"name":"rfishbase","operator":null,"version":null,"linked_to":"112230","reverse":true},{"package_id":0,"type":0,"name":"rfriend","operator":null,"version":null,"linked_to":"112410","reverse":true},{"package_id":0,"type":0,"name":"rgenius","operator":null,"version":null,"linked_to":"112627","reverse":true},{"package_id":0,"type":0,"name":"rgeopat2","operator":null,"version":null,"linked_to":"112666","reverse":true},{"package_id":0,"type":0,"name":"rgoogleads","operator":null,"version":null,"linked_to":"112859","reverse":true},{"package_id":0,"type":0,"name":"rgoogleclassroom","operator":null,"version":null,"linked_to":"112881","reverse":true},{"package_id":0,"type":0,"name":"rheroicons","operator":null,"version":null,"linked_to":"113048","reverse":true},{"package_id":0,"type":0,"name":"riAFTBART","operator":null,"version":null,"linked_to":"113188","reverse":true},{"package_id":0,"type":0,"name":"rict","operator":null,"version":null,"linked_to":"113255","reverse":true},{"package_id":0,"type":0,"name":"rifttable","operator":null,"version":null,"linked_to":"113348","reverse":true},{"package_id":0,"type":0,"name":"ringostat","operator":null,"version":null,"linked_to":"113442","reverse":true},{"package_id":0,"type":0,"name":"ripc","operator":null,"version":null,"linked_to":"113537","reverse":true},{"package_id":0,"type":0,"name":"risk.assessr","operator":null,"version":null,"linked_to":"113574","reverse":true},{"package_id":0,"type":0,"name":"riskclustr","operator":null,"version":null,"linked_to":"113580","reverse":true},{"package_id":0,"type":0,"name":"riskdiff","operator":null,"version":null,"linked_to":"113589","reverse":true},{"package_id":0,"type":0,"name":"rjaf","operator":null,"version":null,"linked_to":"113793","reverse":true},{"package_id":0,"type":0,"name":"rjtools","operator":null,"version":null,"linked_to":"114001","reverse":true},{"package_id":0,"type":0,"name":"rlinkedinads","operator":null,"version":null,"linked_to":"114375","reverse":true},{"package_id":0,"type":0,"name":"rmdd","operator":null,"version":null,"linked_to":"114737","reverse":true},{"package_id":0,"type":0,"name":"rmlnomogram","operator":null,"version":null,"linked_to":"114906","reverse":true},{"package_id":0,"type":0,"name":"rmweather","operator":null,"version":null,"linked_to":"115172","reverse":true},{"package_id":0,"type":0,"name":"rmytarget","operator":null,"version":null,"linked_to":"115205","reverse":true},{"package_id":0,"type":0,"name":"rnmamod","operator":null,"version":null,"linked_to":"115485","reverse":true},{"package_id":0,"type":0,"name":"roadDB","operator":null,"version":null,"linked_to":"115608","reverse":true},{"package_id":0,"type":0,"name":"robcat","operator":null,"version":null,"linked_to":"115653","reverse":true},{"package_id":0,"type":0,"name":"robis","operator":null,"version":null,"linked_to":"115769","reverse":true},{"package_id":0,"type":0,"name":"robotstxt","operator":null,"version":null,"linked_to":"115882","reverse":true},{"package_id":0,"type":0,"name":"roclang","operator":null,"version":null,"linked_to":"116243","reverse":true},{"package_id":0,"type":0,"name":"rocnp","operator":null,"version":null,"linked_to":"116255","reverse":true},{"package_id":0,"type":0,"name":"romic","operator":null,"version":null,"linked_to":"116581","reverse":true},{"package_id":0,"type":0,"name":"ropenblas","operator":null,"version":null,"linked_to":"116636","reverse":true},{"package_id":0,"type":0,"name":"ropercenter","operator":null,"version":null,"linked_to":"116686","reverse":true},{"package_id":0,"type":0,"name":"roundwork","operator":null,"version":null,"linked_to":"116878","reverse":true},{"package_id":0,"type":0,"name":"roxy.shinylive","operator":null,"version":null,"linked_to":"116899","reverse":true},{"package_id":0,"type":0,"name":"rpgconn","operator":null,"version":null,"linked_to":"117380","reverse":true},{"package_id":0,"type":0,"name":"rplanes","operator":null,"version":null,"linked_to":"117432","reverse":true},{"package_id":0,"type":0,"name":"rplec","operator":null,"version":null,"linked_to":"117434","reverse":true},{"package_id":0,"type":0,"name":"rprime","operator":null,"version":null,"linked_to":"117633","reverse":true},{"package_id":0,"type":0,"name":"rqti","operator":null,"version":null,"linked_to":"117830","reverse":true},{"package_id":0,"type":0,"name":"rrtable","operator":null,"version":null,"linked_to":"118205","reverse":true},{"package_id":0,"type":0,"name":"rsinaica","operator":null,"version":null,"linked_to":"118657","reverse":true},{"package_id":0,"type":0,"name":"rslp","operator":null,"version":null,"linked_to":"118693","reverse":true},{"package_id":0,"type":0,"name":"rsocialwatcher","operator":null,"version":null,"linked_to":"118770","reverse":true},{"package_id":0,"type":0,"name":"rspacer","operator":null,"version":null,"linked_to":"118837","reverse":true},{"package_id":0,"type":0,"name":"rsppfp","operator":null,"version":null,"linked_to":"118920","reverse":true},{"package_id":0,"type":0,"name":"rsurvstat","operator":null,"version":null,"linked_to":"119292","reverse":true},{"package_id":0,"type":0,"name":"rt","operator":null,"version":null,"linked_to":"119401","reverse":true},{"package_id":0,"type":0,"name":"rtgstat","operator":null,"version":null,"linked_to":"119543","reverse":true},{"package_id":0,"type":0,"name":"rtiddlywiki","operator":null,"version":null,"linked_to":"119584","reverse":true},{"package_id":0,"type":0,"name":"rtiktokads","operator":null,"version":null,"linked_to":"119618","reverse":true},{"package_id":0,"type":0,"name":"rtlr","operator":null,"version":null,"linked_to":"119675","reverse":true},{"package_id":0,"type":0,"name":"rtmpt","operator":null,"version":null,"linked_to":"119706","reverse":true},{"package_id":0,"type":0,"name":"rtodoist","operator":null,"version":null,"linked_to":"119723","reverse":true},{"package_id":0,"type":0,"name":"rules","operator":null,"version":null,"linked_to":"120028","reverse":true},{"package_id":0,"type":0,"name":"ruminate","operator":null,"version":null,"linked_to":"120052","reverse":true},{"package_id":0,"type":0,"name":"rurality","operator":null,"version":null,"linked_to":"120146","reverse":true},{"package_id":0,"type":0,"name":"rvkstat","operator":null,"version":null,"linked_to":"120402","reverse":true},{"package_id":0,"type":0,"name":"rwarrior","operator":null,"version":null,"linked_to":"120465","reverse":true},{"package_id":0,"type":0,"name":"ryandexdirect","operator":null,"version":null,"linked_to":"120812","reverse":true},{"package_id":0,"type":0,"name":"rym","operator":null,"version":null,"linked_to":"120821","reverse":true},{"package_id":0,"type":0,"name":"rytstat","operator":null,"version":null,"linked_to":"120836","reverse":true},{"package_id":0,"type":0,"name":"saeHB","operator":null,"version":null,"linked_to":"121065","reverse":true},{"package_id":0,"type":0,"name":"saeHB.ME","operator":null,"version":null,"linked_to":"121078","reverse":true},{"package_id":0,"type":0,"name":"saeHB.ME.beta","operator":null,"version":null,"linked_to":"121080","reverse":true},{"package_id":0,"type":0,"name":"saeHB.TF.beta","operator":null,"version":null,"linked_to":"121093","reverse":true},{"package_id":0,"type":0,"name":"saeHB.ZIB","operator":null,"version":null,"linked_to":"121100","reverse":true},{"package_id":0,"type":0,"name":"saeHB.panel","operator":null,"version":null,"linked_to":"121083","reverse":true},{"package_id":0,"type":0,"name":"saeHB.panel.beta","operator":null,"version":null,"linked_to":"121085","reverse":true},{"package_id":0,"type":0,"name":"saeHB.spatial","operator":null,"version":null,"linked_to":"121090","reverse":true},{"package_id":0,"type":0,"name":"saeHB.twofold","operator":null,"version":null,"linked_to":"121095","reverse":true},{"package_id":0,"type":0,"name":"saeTrafo","operator":null,"version":null,"linked_to":"121149","reverse":true},{"package_id":0,"type":0,"name":"salty","operator":null,"version":null,"linked_to":"121289","reverse":true},{"package_id":0,"type":0,"name":"sanketphonetictranslator","operator":null,"version":null,"linked_to":"121548","reverse":true},{"package_id":0,"type":0,"name":"sapfluxnetr","operator":null,"version":null,"linked_to":"121594","reverse":true},{"package_id":0,"type":0,"name":"saqgetr","operator":null,"version":null,"linked_to":"121608","reverse":true},{"package_id":0,"type":0,"name":"sbm","operator":null,"version":null,"linked_to":"121924","reverse":true},{"package_id":0,"type":0,"name":"scCustomize","operator":null,"version":null,"linked_to":"122263","reverse":true},{"package_id":0,"type":0,"name":"scINSIGHT","operator":null,"version":null,"linked_to":"122495","reverse":true},{"package_id":0,"type":0,"name":"scPOEM","operator":null,"version":null,"linked_to":"122788","reverse":true},{"package_id":0,"type":0,"name":"scRNAstat","operator":null,"version":null,"linked_to":"122876","reverse":true},{"package_id":0,"type":0,"name":"scaledescr","operator":null,"version":null,"linked_to":"122032","reverse":true},{"package_id":0,"type":0,"name":"scaper","operator":null,"version":null,"linked_to":"122122","reverse":true},{"package_id":0,"type":0,"name":"scenfire","operator":null,"version":null,"linked_to":"122342","reverse":true},{"package_id":0,"type":0,"name":"schemr","operator":null,"version":null,"linked_to":"122382","reverse":true},{"package_id":0,"type":0,"name":"scholar","operator":null,"version":null,"linked_to":"122389","reverse":true},{"package_id":0,"type":0,"name":"scicomptools","operator":null,"version":null,"linked_to":"122467","reverse":true},{"package_id":0,"type":0,"name":"scientoText","operator":null,"version":null,"linked_to":"122482","reverse":true},{"package_id":0,"type":0,"name":"scimetr","operator":null,"version":null,"linked_to":"122485","reverse":true},{"package_id":0,"type":0,"name":"scipub","operator":null,"version":null,"linked_to":"122512","reverse":true},{"package_id":0,"type":0,"name":"scistreer","operator":null,"version":null,"linked_to":"122522","reverse":true},{"package_id":0,"type":0,"name":"scopr","operator":null,"version":null,"linked_to":"122599","reverse":true},{"package_id":0,"type":0,"name":"scorecardModelUtils","operator":null,"version":null,"linked_to":"122647","reverse":true},{"package_id":0,"type":0,"name":"scpi","operator":null,"version":null,"linked_to":"122754","reverse":true},{"package_id":0,"type":0,"name":"scrapeR","operator":null,"version":null,"linked_to":"122823","reverse":true},{"package_id":0,"type":0,"name":"screenshot","operator":null,"version":null,"linked_to":"122830","reverse":true},{"package_id":0,"type":0,"name":"scrutiny","operator":null,"version":null,"linked_to":"122900","reverse":true},{"package_id":0,"type":0,"name":"scrutr","operator":null,"version":null,"linked_to":"122908","reverse":true},{"package_id":0,"type":0,"name":"sdbuildR","operator":null,"version":null,"linked_to":"123010","reverse":true},{"package_id":0,"type":0,"name":"sdcTable","operator":null,"version":null,"linked_to":"123068","reverse":true},{"package_id":0,"type":0,"name":"sdtm.oak","operator":null,"version":null,"linked_to":"123286","reverse":true},{"package_id":0,"type":0,"name":"sdtmval","operator":null,"version":null,"linked_to":"123291","reverse":true},{"package_id":0,"type":0,"name":"season","operator":null,"version":null,"linked_to":"123380","reverse":true},{"package_id":0,"type":0,"name":"secr","operator":null,"version":null,"linked_to":"123440","reverse":true},{"package_id":0,"type":0,"name":"secrettext","operator":null,"version":null,"linked_to":"123524","reverse":true},{"package_id":0,"type":0,"name":"secuTrialR","operator":null,"version":null,"linked_to":"123556","reverse":true},{"package_id":0,"type":0,"name":"seecolor","operator":null,"version":null,"linked_to":"123600","reverse":true},{"package_id":0,"type":0,"name":"seekr","operator":null,"version":null,"linked_to":"123663","reverse":true},{"package_id":0,"type":0,"name":"seer","operator":null,"version":null,"linked_to":"123667","reverse":true},{"package_id":0,"type":0,"name":"selectr","operator":null,"version":null,"linked_to":"123884","reverse":true},{"package_id":0,"type":0,"name":"semgram","operator":null,"version":null,"linked_to":"123991","reverse":true},{"package_id":0,"type":0,"name":"senatebR","operator":null,"version":null,"linked_to":"124257","reverse":true},{"package_id":0,"type":0,"name":"sendigR","operator":null,"version":null,"linked_to":"124264","reverse":true},{"package_id":0,"type":0,"name":"sensobol","operator":null,"version":null,"linked_to":"124353","reverse":true},{"package_id":0,"type":0,"name":"sensortowerR","operator":null,"version":null,"linked_to":"124381","reverse":true},{"package_id":0,"type":0,"name":"sentryR","operator":null,"version":null,"linked_to":"124456","reverse":true},{"package_id":0,"type":0,"name":"seqimpute","operator":null,"version":null,"linked_to":"124565","reverse":true},{"package_id":0,"type":0,"name":"serocalculator","operator":null,"version":null,"linked_to":"124757","reverse":true},{"package_id":0,"type":0,"name":"serosv","operator":null,"version":null,"linked_to":"124775","reverse":true},{"package_id":0,"type":0,"name":"sevenbridges2","operator":null,"version":null,"linked_to":"124976","reverse":true},{"package_id":0,"type":0,"name":"sfcr","operator":null,"version":null,"linked_to":"125056","reverse":true},{"package_id":0,"type":0,"name":"sfhelper","operator":null,"version":null,"linked_to":"125100","reverse":true},{"package_id":0,"type":0,"name":"sfislands","operator":null,"version":null,"linked_to":"125111","reverse":true},{"package_id":0,"type":0,"name":"sgboost","operator":null,"version":null,"linked_to":"125207","reverse":true},{"package_id":0,"type":0,"name":"shadowVIMP","operator":null,"version":null,"linked_to":"125389","reverse":true},{"package_id":0,"type":0,"name":"sherlock","operator":null,"version":null,"linked_to":"125666","reverse":true},{"package_id":0,"type":0,"name":"shiny.i18n","operator":null,"version":null,"linked_to":"125734","reverse":true},{"package_id":0,"type":0,"name":"shiny.telemetry","operator":null,"version":null,"linked_to":"125772","reverse":true},{"package_id":0,"type":0,"name":"shinyChakraUI","operator":null,"version":null,"linked_to":"125838","reverse":true},{"package_id":0,"type":0,"name":"shinyGovstyle","operator":null,"version":null,"linked_to":"125947","reverse":true},{"package_id":0,"type":0,"name":"shinyHugePlot","operator":null,"version":null,"linked_to":"125963","reverse":true},{"package_id":0,"type":0,"name":"shinyInvoice","operator":null,"version":null,"linked_to":"125975","reverse":true},{"package_id":0,"type":0,"name":"shinyNotes","operator":null,"version":null,"linked_to":"126114","reverse":true},{"package_id":0,"type":0,"name":"shinySbm","operator":null,"version":null,"linked_to":"126160","reverse":true},{"package_id":0,"type":0,"name":"shinyTree","operator":null,"version":null,"linked_to":"126249","reverse":true},{"package_id":0,"type":0,"name":"shinyWGD","operator":null,"version":null,"linked_to":"126257","reverse":true},{"package_id":0,"type":0,"name":"shinyfa","operator":null,"version":null,"linked_to":"125912","reverse":true},{"package_id":0,"type":0,"name":"shinyfilter","operator":null,"version":null,"linked_to":"125930","reverse":true},{"package_id":0,"type":0,"name":"shinyloadtest","operator":null,"version":null,"linked_to":"126035","reverse":true},{"package_id":0,"type":0,"name":"shinymrp","operator":null,"version":null,"linked_to":"126109","reverse":true},{"package_id":0,"type":0,"name":"shinyobjects","operator":null,"version":null,"linked_to":"126123","reverse":true},{"package_id":0,"type":0,"name":"shinyproxyLogs","operator":null,"version":null,"linked_to":"126137","reverse":true},{"package_id":0,"type":0,"name":"shinyquiz","operator":null,"version":null,"linked_to":"126144","reverse":true},{"package_id":0,"type":0,"name":"shinyrecipes","operator":null,"version":null,"linked_to":"126155","reverse":true},{"package_id":0,"type":0,"name":"sidrar","operator":null,"version":null,"linked_to":"126547","reverse":true},{"package_id":0,"type":0,"name":"siera","operator":null,"version":null,"linked_to":"126556","reverse":true},{"package_id":0,"type":0,"name":"sigInt","operator":null,"version":null,"linked_to":"126597","reverse":true},{"package_id":0,"type":0,"name":"silp","operator":null,"version":null,"linked_to":"126807","reverse":true},{"package_id":0,"type":0,"name":"simET","operator":null,"version":null,"linked_to":"126980","reverse":true},{"package_id":0,"type":0,"name":"simPH","operator":null,"version":null,"linked_to":"127227","reverse":true},{"package_id":0,"type":0,"name":"simaerep","operator":null,"version":null,"linked_to":"126839","reverse":true},{"package_id":0,"type":0,"name":"simcausal","operator":null,"version":null,"linked_to":"126861","reverse":true},{"package_id":0,"type":0,"name":"simplecolors","operator":null,"version":null,"linked_to":"127265","reverse":true},{"package_id":0,"type":0,"name":"simr","operator":null,"version":null,"linked_to":"127392","reverse":true},{"package_id":0,"type":0,"name":"simulateDCE","operator":null,"version":null,"linked_to":"127583","reverse":true},{"package_id":0,"type":0,"name":"sistec","operator":null,"version":null,"linked_to":"127790","reverse":true},{"package_id":0,"type":0,"name":"sitepickR","operator":null,"version":null,"linked_to":"127811","reverse":true},{"package_id":0,"type":0,"name":"siteymlgen","operator":null,"version":null,"linked_to":"127814","reverse":true},{"package_id":0,"type":0,"name":"sketcher","operator":null,"version":null,"linked_to":"128066","reverse":true},{"package_id":0,"type":0,"name":"sketchy","operator":null,"version":null,"linked_to":"128070","reverse":true},{"package_id":0,"type":0,"name":"skiftiTools","operator":null,"version":null,"linked_to":"128104","reverse":true},{"package_id":0,"type":0,"name":"skimr","operator":null,"version":null,"linked_to":"128113","reverse":true},{"package_id":0,"type":0,"name":"smdi","operator":null,"version":null,"linked_to":"128693","reverse":true},{"package_id":0,"type":0,"name":"smetlite","operator":null,"version":null,"linked_to":"128735","reverse":true},{"package_id":0,"type":0,"name":"smoothic","operator":null,"version":null,"linked_to":"128923","reverse":true},{"package_id":0,"type":0,"name":"smoothy","operator":null,"version":null,"linked_to":"128968","reverse":true},{"package_id":0,"type":0,"name":"smsets","operator":null,"version":null,"linked_to":"129017","reverse":true},{"package_id":0,"type":0,"name":"snakecase","operator":null,"version":null,"linked_to":"129084","reverse":true},{"package_id":0,"type":0,"name":"snap","operator":null,"version":null,"linked_to":"129099","reverse":true},{"package_id":0,"type":0,"name":"socialrisk","operator":null,"version":null,"linked_to":"129350","reverse":true},{"package_id":0,"type":0,"name":"sociome","operator":null,"version":null,"linked_to":"129355","reverse":true},{"package_id":0,"type":0,"name":"soilFlux","operator":null,"version":null,"linked_to":"129493","reverse":true},{"package_id":0,"type":0,"name":"soilfoodwebs","operator":null,"version":null,"linked_to":"129494","reverse":true},{"package_id":0,"type":0,"name":"sourcoise","operator":null,"version":null,"linked_to":"129897","reverse":true},{"package_id":0,"type":0,"name":"spAddins","operator":null,"version":null,"linked_to":"130058","reverse":true},{"package_id":0,"type":0,"name":"spanishoddata","operator":null,"version":null,"linked_to":"130243","reverse":true},{"package_id":0,"type":0,"name":"spant","operator":null,"version":null,"linked_to":"130262","reverse":true},{"package_id":0,"type":0,"name":"sparqlr","operator":null,"version":null,"linked_to":"130442","reverse":true},{"package_id":0,"type":0,"name":"spatPomp","operator":null,"version":null,"linked_to":"131226","reverse":true},{"package_id":0,"type":0,"name":"spatialGE","operator":null,"version":null,"linked_to":"131028","reverse":true},{"package_id":0,"type":0,"name":"spatialTIME","operator":null,"version":null,"linked_to":"131156","reverse":true},{"package_id":0,"type":0,"name":"spatsurv","operator":null,"version":null,"linked_to":"131538","reverse":true},{"package_id":0,"type":0,"name":"speakr","operator":null,"version":null,"linked_to":"131769","reverse":true},{"package_id":0,"type":0,"name":"speccurvieR","operator":null,"version":null,"linked_to":"131795","reverse":true},{"package_id":0,"type":0,"name":"specr","operator":null,"version":null,"linked_to":"131841","reverse":true},{"package_id":0,"type":0,"name":"spectacles","operator":null,"version":null,"linked_to":"131850","reverse":true},{"package_id":0,"type":0,"name":"speech","operator":null,"version":null,"linked_to":"131957","reverse":true},{"package_id":0,"type":0,"name":"speechbr","operator":null,"version":null,"linked_to":"131961","reverse":true},{"package_id":0,"type":0,"name":"speedycode","operator":null,"version":null,"linked_to":"131973","reverse":true},{"package_id":0,"type":0,"name":"speedytax","operator":null,"version":null,"linked_to":"131976","reverse":true},{"package_id":0,"type":0,"name":"spell.replacer","operator":null,"version":null,"linked_to":"131988","reverse":true},{"package_id":0,"type":0,"name":"spellcheckr","operator":null,"version":null,"linked_to":"131989","reverse":true},{"package_id":0,"type":0,"name":"sperrorest","operator":null,"version":null,"linked_to":"132005","reverse":true},{"package_id":0,"type":0,"name":"sphet","operator":null,"version":null,"linked_to":"132099","reverse":true},{"package_id":0,"type":0,"name":"spicy","operator":null,"version":null,"linked_to":"132121","reverse":true},{"package_id":0,"type":0,"name":"spind","operator":null,"version":null,"linked_to":"132178","reverse":true},{"package_id":0,"type":0,"name":"splm","operator":null,"version":null,"linked_to":"132356","reverse":true},{"package_id":0,"type":0,"name":"spotifyr","operator":null,"version":null,"linked_to":"132644","reverse":true},{"package_id":0,"type":0,"name":"spray","operator":null,"version":null,"linked_to":"132715","reverse":true},{"package_id":0,"type":0,"name":"spsComps","operator":null,"version":null,"linked_to":"132798","reverse":true},{"package_id":0,"type":0,"name":"spsUtil","operator":null,"version":null,"linked_to":"132862","reverse":true},{"package_id":0,"type":0,"name":"sqlhelper","operator":null,"version":null,"linked_to":"132958","reverse":true},{"package_id":0,"type":0,"name":"sqliter","operator":null,"version":null,"linked_to":"132965","reverse":true},{"package_id":0,"type":0,"name":"sqlstrings","operator":null,"version":null,"linked_to":"133024","reverse":true},{"package_id":0,"type":0,"name":"sqltargets","operator":null,"version":null,"linked_to":"133025","reverse":true},{"package_id":0,"type":0,"name":"srppp","operator":null,"version":null,"linked_to":"133160","reverse":true},{"package_id":0,"type":0,"name":"ssdtools","operator":null,"version":null,"linked_to":"133327","reverse":true},{"package_id":0,"type":0,"name":"ssimparser","operator":null,"version":null,"linked_to":"133432","reverse":true},{"package_id":0,"type":0,"name":"sspm","operator":null,"version":null,"linked_to":"133521","reverse":true},{"package_id":0,"type":0,"name":"ssrn","operator":null,"version":null,"linked_to":"133551","reverse":true},{"package_id":0,"type":0,"name":"ssutil","operator":null,"version":null,"linked_to":"133580","reverse":true},{"package_id":0,"type":0,"name":"stCEG","operator":null,"version":null,"linked_to":"134403","reverse":true},{"package_id":0,"type":0,"name":"staRdom","operator":null,"version":null,"linked_to":"133815","reverse":true},{"package_id":0,"type":0,"name":"stabiliser","operator":null,"version":null,"linked_to":"133597","reverse":true},{"package_id":0,"type":0,"name":"staccuracy","operator":null,"version":null,"linked_to":"133657","reverse":true},{"package_id":0,"type":0,"name":"standardize","operator":null,"version":null,"linked_to":"133749","reverse":true},{"package_id":0,"type":0,"name":"staplr","operator":null,"version":null,"linked_to":"133802","reverse":true},{"package_id":0,"type":0,"name":"starling","operator":null,"version":null,"linked_to":"133846","reverse":true},{"package_id":0,"type":0,"name":"starry","operator":null,"version":null,"linked_to":"133859","reverse":true},{"package_id":0,"type":0,"name":"startR","operator":null,"version":null,"linked_to":"133927","reverse":true},{"package_id":0,"type":0,"name":"starvz","operator":null,"version":null,"linked_to":"133986","reverse":true},{"package_id":0,"type":0,"name":"statAfrikR","operator":null,"version":null,"linked_to":"134011","reverse":true},{"package_id":0,"type":0,"name":"statBasics","operator":null,"version":null,"linked_to":"134032","reverse":true},{"package_id":0,"type":0,"name":"statar","operator":null,"version":null,"linked_to":"134020","reverse":true},{"package_id":0,"type":0,"name":"statdecideR","operator":null,"version":null,"linked_to":"134079","reverse":true},{"package_id":0,"type":0,"name":"stationaRy","operator":null,"version":null,"linked_to":"134194","reverse":true},{"package_id":0,"type":0,"name":"statnipokladna","operator":null,"version":null,"linked_to":"134260","reverse":true},{"package_id":0,"type":0,"name":"statquotes","operator":null,"version":null,"linked_to":"134285","reverse":true},{"package_id":0,"type":0,"name":"statsearchanalyticsr","operator":null,"version":null,"linked_to":"134318","reverse":true},{"package_id":0,"type":0,"name":"steppedwedge","operator":null,"version":null,"linked_to":"134519","reverse":true},{"package_id":0,"type":0,"name":"stevemisc","operator":null,"version":null,"linked_to":"134622","reverse":true},{"package_id":0,"type":0,"name":"stgam","operator":null,"version":null,"linked_to":"134647","reverse":true},{"package_id":0,"type":0,"name":"stm","operator":null,"version":null,"linked_to":"134711","reverse":true},{"package_id":0,"type":0,"name":"stoichUtilities","operator":null,"version":null,"linked_to":"134846","reverse":true},{"package_id":0,"type":0,"name":"stortingscrape","operator":null,"version":null,"linked_to":"134909","reverse":true},{"package_id":0,"type":0,"name":"stppSim","operator":null,"version":null,"linked_to":"135004","reverse":true},{"package_id":0,"type":0,"name":"stranslate","operator":null,"version":null,"linked_to":"135037","reverse":true},{"package_id":0,"type":0,"name":"strata","operator":null,"version":null,"linked_to":"135049","reverse":true},{"package_id":0,"type":0,"name":"stringformattr","operator":null,"version":null,"linked_to":"135349","reverse":true},{"package_id":0,"type":0,"name":"striprtf","operator":null,"version":null,"linked_to":"135410","reverse":true},{"package_id":0,"type":0,"name":"subscreen","operator":null,"version":null,"linked_to":"135634","reverse":true},{"package_id":0,"type":0,"name":"sumer","operator":null,"version":null,"linked_to":"135775","reverse":true},{"package_id":0,"type":0,"name":"sumup","operator":null,"version":null,"linked_to":"135863","reverse":true},{"package_id":0,"type":0,"name":"superb","operator":null,"version":null,"linked_to":"135951","reverse":true},{"package_id":0,"type":0,"name":"supernova","operator":null,"version":null,"linked_to":"136024","reverse":true},{"package_id":0,"type":0,"name":"supportR","operator":null,"version":null,"linked_to":"136137","reverse":true},{"package_id":0,"type":0,"name":"surveyPrev","operator":null,"version":null,"linked_to":"136407","reverse":true},{"package_id":0,"type":0,"name":"surveybootstrap","operator":null,"version":null,"linked_to":"136357","reverse":true},{"package_id":0,"type":0,"name":"surveyexplorer","operator":null,"version":null,"linked_to":"136391","reverse":true},{"package_id":0,"type":0,"name":"survivoR","operator":null,"version":null,"linked_to":"136841","reverse":true},{"package_id":0,"type":0,"name":"susographql","operator":null,"version":null,"linked_to":"137015","reverse":true},{"package_id":0,"type":0,"name":"svgtools","operator":null,"version":null,"linked_to":"137129","reverse":true},{"package_id":0,"type":0,"name":"swatches","operator":null,"version":null,"linked_to":"137287","reverse":true},{"package_id":0,"type":0,"name":"sweidnumbr","operator":null,"version":null,"linked_to":"137331","reverse":true},{"package_id":0,"type":0,"name":"swirl","operator":null,"version":null,"linked_to":"137397","reverse":true},{"package_id":0,"type":0,"name":"swirlify","operator":null,"version":null,"linked_to":"137400","reverse":true},{"package_id":0,"type":0,"name":"swissparl","operator":null,"version":null,"linked_to":"137423","reverse":true},{"package_id":0,"type":0,"name":"syllabifyr","operator":null,"version":null,"linked_to":"137546","reverse":true},{"package_id":0,"type":0,"name":"symbolicr","operator":null,"version":null,"linked_to":"137584","reverse":true},{"package_id":0,"type":0,"name":"syntenyPlotteR","operator":null,"version":null,"linked_to":"137709","reverse":true},{"package_id":0,"type":0,"name":"synthesisr","operator":null,"version":null,"linked_to":"137743","reverse":true},{"package_id":0,"type":0,"name":"synthpop","operator":null,"version":null,"linked_to":"137760","reverse":true},{"package_id":0,"type":0,"name":"tReeTraits","operator":null,"version":null,"linked_to":"144034","reverse":true},{"package_id":0,"type":0,"name":"tab2xml","operator":null,"version":null,"linked_to":"137883","reverse":true},{"package_id":0,"type":0,"name":"tabbycat","operator":null,"version":null,"linked_to":"137890","reverse":true},{"package_id":0,"type":0,"name":"tabnet","operator":null,"version":null,"linked_to":"138027","reverse":true},{"package_id":0,"type":0,"name":"tabshiftr","operator":null,"version":null,"linked_to":"138068","reverse":true},{"package_id":0,"type":0,"name":"tabulator","operator":null,"version":null,"linked_to":"138112","reverse":true},{"package_id":0,"type":0,"name":"tabxplor","operator":null,"version":null,"linked_to":"138122","reverse":true},{"package_id":0,"type":0,"name":"tagtools","operator":null,"version":null,"linked_to":"138166","reverse":true},{"package_id":0,"type":0,"name":"talkr","operator":null,"version":null,"linked_to":"138201","reverse":true},{"package_id":0,"type":0,"name":"tall","operator":null,"version":null,"linked_to":"138202","reverse":true},{"package_id":0,"type":0,"name":"tame","operator":null,"version":null,"linked_to":"138232","reverse":true},{"package_id":0,"type":0,"name":"tangram","operator":null,"version":null,"linked_to":"138254","reverse":true},{"package_id":0,"type":0,"name":"tapLock","operator":null,"version":null,"linked_to":"138287","reverse":true},{"package_id":0,"type":0,"name":"tardis","operator":null,"version":null,"linked_to":"138333","reverse":true},{"package_id":0,"type":0,"name":"taskqueue","operator":null,"version":null,"linked_to":"138406","reverse":true},{"package_id":0,"type":0,"name":"taxa","operator":null,"version":null,"linked_to":"138460","reverse":true},{"package_id":0,"type":0,"name":"taxlist","operator":null,"version":null,"linked_to":"138522","reverse":true},{"package_id":0,"type":0,"name":"taxodist","operator":null,"version":null,"linked_to":"138538","reverse":true},{"package_id":0,"type":0,"name":"tcgaViz","operator":null,"version":null,"linked_to":"138685","reverse":true},{"package_id":0,"type":0,"name":"tcpl","operator":null,"version":null,"linked_to":"138765","reverse":true},{"package_id":0,"type":0,"name":"tcplfit2","operator":null,"version":null,"linked_to":"138780","reverse":true},{"package_id":0,"type":0,"name":"tdcmStan","operator":null,"version":null,"linked_to":"138883","reverse":true},{"package_id":0,"type":0,"name":"teal.modules.general","operator":null,"version":null,"linked_to":"138993","reverse":true},{"package_id":0,"type":0,"name":"tealeaves","operator":null,"version":null,"linked_to":"139021","reverse":true},{"package_id":0,"type":0,"name":"tehtuner","operator":null,"version":null,"linked_to":"139058","reverse":true},{"package_id":0,"type":0,"name":"templates","operator":null,"version":null,"linked_to":"139116","reverse":true},{"package_id":0,"type":0,"name":"tenispolaR","operator":null,"version":null,"linked_to":"139158","reverse":true},{"package_id":0,"type":0,"name":"tenm","operator":null,"version":null,"linked_to":"139159","reverse":true},{"package_id":0,"type":0,"name":"tesouror","operator":null,"version":null,"linked_to":"139446","reverse":true},{"package_id":0,"type":0,"name":"test.assessr","operator":null,"version":null,"linked_to":"139487","reverse":true},{"package_id":0,"type":0,"name":"testdat","operator":null,"version":null,"linked_to":"139527","reverse":true},{"package_id":0,"type":0,"name":"tetragon","operator":null,"version":null,"linked_to":"139688","reverse":true},{"package_id":0,"type":0,"name":"texor","operator":null,"version":null,"linked_to":"139720","reverse":true},{"package_id":0,"type":0,"name":"text2emotion","operator":null,"version":null,"linked_to":"139779","reverse":true},{"package_id":0,"type":0,"name":"text2sdg","operator":null,"version":null,"linked_to":"139792","reverse":true},{"package_id":0,"type":0,"name":"texter","operator":null,"version":null,"linked_to":"139855","reverse":true},{"package_id":0,"type":0,"name":"textmineR","operator":null,"version":null,"linked_to":"139879","reverse":true},{"package_id":0,"type":0,"name":"textpress","operator":null,"version":null,"linked_to":"139908","reverse":true},{"package_id":0,"type":0,"name":"textreuse","operator":null,"version":null,"linked_to":"139949","reverse":true},{"package_id":0,"type":0,"name":"tfrmt","operator":null,"version":null,"linked_to":"140097","reverse":true},{"package_id":0,"type":0,"name":"tfrmtbuilder","operator":null,"version":null,"linked_to":"140107","reverse":true},{"package_id":0,"type":0,"name":"thinkr","operator":null,"version":null,"linked_to":"140316","reverse":true},{"package_id":0,"type":0,"name":"threeBrain","operator":null,"version":null,"linked_to":"140396","reverse":true},{"package_id":0,"type":0,"name":"tidyCDISC","operator":null,"version":null,"linked_to":"140636","reverse":true},{"package_id":0,"type":0,"name":"tidyEmoji","operator":null,"version":null,"linked_to":"140792","reverse":true},{"package_id":0,"type":0,"name":"tidyGenR","operator":null,"version":null,"linked_to":"140883","reverse":true},{"package_id":0,"type":0,"name":"tidyMC","operator":null,"version":null,"linked_to":"141010","reverse":true},{"package_id":0,"type":0,"name":"tidyREDCap","operator":null,"version":null,"linked_to":"141176","reverse":true},{"package_id":0,"type":0,"name":"tidybins","operator":null,"version":null,"linked_to":"140626","reverse":true},{"package_id":0,"type":0,"name":"tidycat","operator":null,"version":null,"linked_to":"140633","reverse":true},{"package_id":0,"type":0,"name":"tidycensus","operator":null,"version":null,"linked_to":"140644","reverse":true},{"package_id":0,"type":0,"name":"tidychangepoint","operator":null,"version":null,"linked_to":"140691","reverse":true},{"package_id":0,"type":0,"name":"tidycharts","operator":null,"version":null,"linked_to":"140699","reverse":true},{"package_id":0,"type":0,"name":"tidycmprsk","operator":null,"version":null,"linked_to":"140709","reverse":true},{"package_id":0,"type":0,"name":"tidycomm","operator":null,"version":null,"linked_to":"140720","reverse":true},{"package_id":0,"type":0,"name":"tidycountries","operator":null,"version":null,"linked_to":"140731","reverse":true},{"package_id":0,"type":0,"name":"tidydice","operator":null,"version":null,"linked_to":"140774","reverse":true},{"package_id":0,"type":0,"name":"tidyfst","operator":null,"version":null,"linked_to":"140826","reverse":true},{"package_id":0,"type":0,"name":"tidyft","operator":null,"version":null,"linked_to":"140855","reverse":true},{"package_id":0,"type":0,"name":"tidygam","operator":null,"version":null,"linked_to":"140861","reverse":true},{"package_id":0,"type":0,"name":"tidygate","operator":null,"version":null,"linked_to":"140866","reverse":true},{"package_id":0,"type":0,"name":"tidygeoRSS","operator":null,"version":null,"linked_to":"140893","reverse":true},{"package_id":0,"type":0,"name":"tidyklips","operator":null,"version":null,"linked_to":"140959","reverse":true},{"package_id":0,"type":0,"name":"tidylda","operator":null,"version":null,"linked_to":"140963","reverse":true},{"package_id":0,"type":0,"name":"tidyllm","operator":null,"version":null,"linked_to":"140974","reverse":true},{"package_id":0,"type":0,"name":"tidynorm","operator":null,"version":null,"linked_to":"141063","reverse":true},{"package_id":0,"type":0,"name":"tidypaleo","operator":null,"version":null,"linked_to":"141067","reverse":true},{"package_id":0,"type":0,"name":"tidyplots","operator":null,"version":null,"linked_to":"141078","reverse":true},{"package_id":0,"type":0,"name":"tidyplus","operator":null,"version":null,"linked_to":"141084","reverse":true},{"package_id":0,"type":0,"name":"tidypmc","operator":null,"version":null,"linked_to":"141087","reverse":true},{"package_id":0,"type":0,"name":"tidyprompt","operator":null,"version":null,"linked_to":"141119","reverse":true},{"package_id":0,"type":0,"name":"tidyquant","operator":null,"version":null,"linked_to":"141124","reverse":true},{"package_id":0,"type":0,"name":"tidyquery","operator":null,"version":null,"linked_to":"141146","reverse":true},{"package_id":0,"type":0,"name":"tidyr","operator":null,"version":null,"linked_to":"141156","reverse":true},{"package_id":0,"type":0,"name":"tidyrgee","operator":null,"version":null,"linked_to":"141185","reverse":true},{"package_id":0,"type":0,"name":"tidyrstats","operator":null,"version":null,"linked_to":"141206","reverse":true},{"package_id":0,"type":0,"name":"tidyrules","operator":null,"version":null,"linked_to":"141207","reverse":true},{"package_id":0,"type":0,"name":"tidyseurat","operator":null,"version":null,"linked_to":"141249","reverse":true},{"package_id":0,"type":0,"name":"tidysummary","operator":null,"version":null,"linked_to":"141310","reverse":true},{"package_id":0,"type":0,"name":"tidysynthesis","operator":null,"version":null,"linked_to":"141316","reverse":true},{"package_id":0,"type":0,"name":"tidytext","operator":null,"version":null,"linked_to":"141380","reverse":true},{"package_id":0,"type":0,"name":"tidytlg","operator":null,"version":null,"linked_to":"141414","reverse":true},{"package_id":0,"type":0,"name":"tidyverse","operator":null,"version":null,"linked_to":"141523","reverse":true},{"package_id":0,"type":0,"name":"tidyweather","operator":null,"version":null,"linked_to":"141544","reverse":true},{"package_id":0,"type":0,"name":"tidywikidatar","operator":null,"version":null,"linked_to":"141546","reverse":true},{"package_id":0,"type":0,"name":"tigris","operator":null,"version":null,"linked_to":"141609","reverse":true},{"package_id":0,"type":0,"name":"tikatuwq","operator":null,"version":null,"linked_to":"141630","reverse":true},{"package_id":0,"type":0,"name":"timeplyr","operator":null,"version":null,"linked_to":"141800","reverse":true},{"package_id":0,"type":0,"name":"timetk","operator":null,"version":null,"linked_to":"141868","reverse":true},{"package_id":0,"type":0,"name":"tinyarray","operator":null,"version":null,"linked_to":"141973","reverse":true},{"package_id":0,"type":0,"name":"tinyscholar","operator":null,"version":null,"linked_to":"142028","reverse":true},{"package_id":0,"type":0,"name":"tipitaka","operator":null,"version":null,"linked_to":"142180","reverse":true},{"package_id":0,"type":0,"name":"tndata","operator":null,"version":null,"linked_to":"142608","reverse":true},{"package_id":0,"type":0,"name":"todor","operator":null,"version":null,"linked_to":"142647","reverse":true},{"package_id":0,"type":0,"name":"tongfen","operator":null,"version":null,"linked_to":"142697","reverse":true},{"package_id":0,"type":0,"name":"topics","operator":null,"version":null,"linked_to":"142752","reverse":true},{"package_id":0,"type":0,"name":"topr","operator":null,"version":null,"linked_to":"142784","reverse":true},{"package_id":0,"type":0,"name":"torchdatasets","operator":null,"version":null,"linked_to":"142856","reverse":true},{"package_id":0,"type":0,"name":"tosca","operator":null,"version":null,"linked_to":"142895","reverse":true},{"package_id":0,"type":0,"name":"tost.suite","operator":null,"version":null,"linked_to":"142925","reverse":true},{"package_id":0,"type":0,"name":"totalcensus","operator":null,"version":null,"linked_to":"142943","reverse":true},{"package_id":0,"type":0,"name":"tower","operator":null,"version":null,"linked_to":"142985","reverse":true},{"package_id":0,"type":0,"name":"toxSummary","operator":null,"version":null,"linked_to":"143026","reverse":true},{"package_id":0,"type":0,"name":"tradeoffaucdim","operator":null,"version":null,"linked_to":"143230","reverse":true},{"package_id":0,"type":0,"name":"trainR","operator":null,"version":null,"linked_to":"143296","reverse":true},{"package_id":0,"type":0,"name":"traineR","operator":null,"version":null,"linked_to":"143278","reverse":true},{"package_id":0,"type":0,"name":"traitstrap","operator":null,"version":null,"linked_to":"143337","reverse":true},{"package_id":0,"type":0,"name":"traumar","operator":null,"version":null,"linked_to":"143660","reverse":true},{"package_id":0,"type":0,"name":"trendyy","operator":null,"version":null,"linked_to":"144105","reverse":true},{"package_id":0,"type":0,"name":"trialr","operator":null,"version":null,"linked_to":"144140","reverse":true},{"package_id":0,"type":0,"name":"trud","operator":null,"version":null,"linked_to":"144361","reverse":true},{"package_id":0,"type":0,"name":"tsg","operator":null,"version":null,"linked_to":"144664","reverse":true},{"package_id":0,"type":0,"name":"tspmeta","operator":null,"version":null,"linked_to":"144823","reverse":true},{"package_id":0,"type":0,"name":"turkeyelections","operator":null,"version":null,"linked_to":"145154","reverse":true},{"package_id":0,"type":0,"name":"twbparser","operator":null,"version":null,"linked_to":"145295","reverse":true},{"package_id":0,"type":0,"name":"twn","operator":null,"version":null,"linked_to":"145353","reverse":true},{"package_id":0,"type":0,"name":"txshift","operator":null,"version":null,"linked_to":"145433","reverse":true},{"package_id":0,"type":0,"name":"typehint","operator":null,"version":null,"linked_to":"145456","reverse":true},{"package_id":0,"type":0,"name":"ubiquity","operator":null,"version":null,"linked_to":"145516","reverse":true},{"package_id":0,"type":0,"name":"ulex","operator":null,"version":null,"linked_to":"145876","reverse":true},{"package_id":0,"type":0,"name":"ultrapolaRplot","operator":null,"version":null,"linked_to":"145887","reverse":true},{"package_id":0,"type":0,"name":"umiAnalyzer","operator":null,"version":null,"linked_to":"145914","reverse":true},{"package_id":0,"type":0,"name":"unheadr","operator":null,"version":null,"linked_to":"146052","reverse":true},{"package_id":0,"type":0,"name":"unstruwwel","operator":null,"version":null,"linked_to":"146372","reverse":true},{"package_id":0,"type":0,"name":"upstartr","operator":null,"version":null,"linked_to":"146461","reverse":true},{"package_id":0,"type":0,"name":"uptasticsearch","operator":null,"version":null,"linked_to":"146468","reverse":true},{"package_id":0,"type":0,"name":"urlexplorer","operator":null,"version":null,"linked_to":"146498","reverse":true},{"package_id":0,"type":0,"name":"urlshorteneR","operator":null,"version":null,"linked_to":"146502","reverse":true},{"package_id":0,"type":0,"name":"uscongress","operator":null,"version":null,"linked_to":"146582","reverse":true},{"package_id":0,"type":0,"name":"usdoj","operator":null,"version":null,"linked_to":"146596","reverse":true},{"package_id":0,"type":0,"name":"usedthese","operator":null,"version":null,"linked_to":"146607","reverse":true},{"package_id":0,"type":0,"name":"ustfd","operator":null,"version":null,"linked_to":"146744","reverse":true},{"package_id":0,"type":0,"name":"utilsIPEA","operator":null,"version":null,"linked_to":"146820","reverse":true},{"package_id":0,"type":0,"name":"uxr","operator":null,"version":null,"linked_to":"146879","reverse":true},{"package_id":0,"type":0,"name":"vagalumeR","operator":null,"version":null,"linked_to":"146951","reverse":true},{"package_id":0,"type":0,"name":"vald.extractor","operator":null,"version":null,"linked_to":"146966","reverse":true},{"package_id":0,"type":0,"name":"valhallr","operator":null,"version":null,"linked_to":"146988","reverse":true},{"package_id":0,"type":0,"name":"validata","operator":null,"version":null,"linked_to":"146993","reverse":true},{"package_id":0,"type":0,"name":"valr","operator":null,"version":null,"linked_to":"147036","reverse":true},{"package_id":0,"type":0,"name":"vannstats","operator":null,"version":null,"linked_to":"147118","reverse":true},{"package_id":0,"type":0,"name":"vapour","operator":null,"version":null,"linked_to":"147139","reverse":true},{"package_id":0,"type":0,"name":"vardpoor","operator":null,"version":null,"linked_to":"147199","reverse":true},{"package_id":0,"type":0,"name":"varitas","operator":null,"version":null,"linked_to":"147265","reverse":true},{"package_id":0,"type":0,"name":"vcfR","operator":null,"version":null,"linked_to":"147494","reverse":true},{"package_id":0,"type":0,"name":"vectorsurvR","operator":null,"version":null,"linked_to":"147684","reverse":true},{"package_id":0,"type":0,"name":"veesa","operator":null,"version":null,"linked_to":"147712","reverse":true},{"package_id":0,"type":0,"name":"vembedr","operator":null,"version":null,"linked_to":"147830","reverse":true},{"package_id":0,"type":0,"name":"vennplot","operator":null,"version":null,"linked_to":"147865","reverse":true},{"package_id":0,"type":0,"name":"verbaliseR","operator":null,"version":null,"linked_to":"147867","reverse":true},{"package_id":0,"type":0,"name":"verdata","operator":null,"version":null,"linked_to":"147878","reverse":true},{"package_id":0,"type":0,"name":"verifyr2","operator":null,"version":null,"linked_to":"147886","reverse":true},{"package_id":0,"type":0,"name":"vhcub","operator":null,"version":null,"linked_to":"148038","reverse":true},{"package_id":0,"type":0,"name":"viafoundry","operator":null,"version":null,"linked_to":"148047","reverse":true},{"package_id":0,"type":0,"name":"vici","operator":null,"version":null,"linked_to":"148066","reverse":true},{"package_id":0,"type":0,"name":"vigicaen","operator":null,"version":null,"linked_to":"148118","reverse":true},{"package_id":0,"type":0,"name":"visOmopResults","operator":null,"version":null,"linked_to":"148401","reverse":true},{"package_id":0,"type":0,"name":"vivaglint","operator":null,"version":null,"linked_to":"148575","reverse":true},{"package_id":0,"type":0,"name":"vizdraws","operator":null,"version":null,"linked_to":"148616","reverse":true},{"package_id":0,"type":0,"name":"vmeasur","operator":null,"version":null,"linked_to":"148669","reverse":true},{"package_id":0,"type":0,"name":"voiceR","operator":null,"version":null,"linked_to":"148708","reverse":true},{"package_id":0,"type":0,"name":"volrisk","operator":null,"version":null,"linked_to":"148766","reverse":true},{"package_id":0,"type":0,"name":"voson.tcn","operator":null,"version":null,"linked_to":"148797","reverse":true},{"package_id":0,"type":0,"name":"vosonSML","operator":null,"version":null,"linked_to":"148806","reverse":true},{"package_id":0,"type":0,"name":"votesmart","operator":null,"version":null,"linked_to":"148839","reverse":true},{"package_id":0,"type":0,"name":"vpc","operator":null,"version":null,"linked_to":"148860","reverse":true},{"package_id":0,"type":0,"name":"vvauditor","operator":null,"version":null,"linked_to":"149047","reverse":true},{"package_id":0,"type":0,"name":"vvcanvas","operator":null,"version":null,"linked_to":"149052","reverse":true},{"package_id":0,"type":0,"name":"vvconverter","operator":null,"version":null,"linked_to":"149060","reverse":true},{"package_id":0,"type":0,"name":"vvtableau","operator":null,"version":null,"linked_to":"149073","reverse":true},{"package_id":0,"type":0,"name":"walmartAPI","operator":null,"version":null,"linked_to":"149236","reverse":true},{"package_id":0,"type":0,"name":"waou","operator":null,"version":null,"linked_to":"149249","reverse":true},{"package_id":0,"type":0,"name":"waves","operator":null,"version":null,"linked_to":"149452","reverse":true},{"package_id":0,"type":0,"name":"wbstats","operator":null,"version":null,"linked_to":"149534","reverse":true},{"package_id":0,"type":0,"name":"wcde","operator":null,"version":null,"linked_to":"149555","reverse":true},{"package_id":0,"type":0,"name":"wcvpmatch","operator":null,"version":null,"linked_to":"149592","reverse":true},{"package_id":0,"type":0,"name":"webchem","operator":null,"version":null,"linked_to":"149720","reverse":true},{"package_id":0,"type":0,"name":"webdav","operator":null,"version":null,"linked_to":"149732","reverse":true},{"package_id":0,"type":0,"name":"webr","operator":null,"version":null,"linked_to":"149831","reverse":true},{"package_id":0,"type":0,"name":"weed","operator":null,"version":null,"linked_to":"149899","reverse":true},{"package_id":0,"type":0,"name":"wehoop","operator":null,"version":null,"linked_to":"149905","reverse":true},{"package_id":0,"type":0,"name":"whapi","operator":null,"version":null,"linked_to":"150181","reverse":true},{"package_id":0,"type":0,"name":"whep","operator":null,"version":null,"linked_to":"150201","reverse":true},{"package_id":0,"type":0,"name":"whippr","operator":null,"version":null,"linked_to":"150212","reverse":true},{"package_id":0,"type":0,"name":"whirl","operator":null,"version":null,"linked_to":"150216","reverse":true},{"package_id":0,"type":0,"name":"whitewater","operator":null,"version":null,"linked_to":"150260","reverse":true},{"package_id":0,"type":0,"name":"whomds","operator":null,"version":null,"linked_to":"150275","reverse":true},{"package_id":0,"type":0,"name":"wig","operator":null,"version":null,"linked_to":"150334","reverse":true},{"package_id":0,"type":0,"name":"wikilake","operator":null,"version":null,"linked_to":"150353","reverse":true},{"package_id":0,"type":0,"name":"wikkitidy","operator":null,"version":null,"linked_to":"150394","reverse":true},{"package_id":0,"type":0,"name":"windows.pls","operator":null,"version":null,"linked_to":"150483","reverse":true},{"package_id":0,"type":0,"name":"wordPuzzleR","operator":null,"version":null,"linked_to":"150834","reverse":true},{"package_id":0,"type":0,"name":"workflowr","operator":null,"version":null,"linked_to":"150866","reverse":true},{"package_id":0,"type":0,"name":"worldfootballR","operator":null,"version":null,"linked_to":"150940","reverse":true},{"package_id":0,"type":0,"name":"worrrd","operator":null,"version":null,"linked_to":"150995","reverse":true},{"package_id":0,"type":0,"name":"wrappedtools","operator":null,"version":null,"linked_to":"151085","reverse":true},{"package_id":0,"type":0,"name":"wsjplot","operator":null,"version":null,"linked_to":"151360","reverse":true},{"package_id":0,"type":0,"name":"wyz.code.offensiveProgramming","operator":null,"version":null,"linked_to":"151485","reverse":true},{"package_id":0,"type":0,"name":"wyz.code.rdoc","operator":null,"version":null,"linked_to":"151497","reverse":true},{"package_id":0,"type":0,"name":"x12","operator":null,"version":null,"linked_to":"151510","reverse":true},{"package_id":0,"type":0,"name":"xadmix","operator":null,"version":null,"linked_to":"151540","reverse":true},{"package_id":0,"type":0,"name":"xesreadR","operator":null,"version":null,"linked_to":"151653","reverse":true},{"package_id":0,"type":0,"name":"xgxr","operator":null,"version":null,"linked_to":"151763","reverse":true},{"package_id":0,"type":0,"name":"xhaz","operator":null,"version":null,"linked_to":"151776","reverse":true},{"package_id":0,"type":0,"name":"xlsform2word","operator":null,"version":null,"linked_to":"151845","reverse":true},{"package_id":0,"type":0,"name":"xml2relational","operator":null,"version":null,"linked_to":"151943","reverse":true},{"package_id":0,"type":0,"name":"xmlconvert","operator":null,"version":null,"linked_to":"151945","reverse":true},{"package_id":0,"type":0,"name":"xportr","operator":null,"version":null,"linked_to":"152018","reverse":true},{"package_id":0,"type":0,"name":"xpose","operator":null,"version":null,"linked_to":"152029","reverse":true},{"package_id":0,"type":0,"name":"xpose.nlmixr2","operator":null,"version":null,"linked_to":"152059","reverse":true},{"package_id":0,"type":0,"name":"xpose.xtras","operator":null,"version":null,"linked_to":"152061","reverse":true},{"package_id":0,"type":0,"name":"yahoofinancer","operator":null,"version":null,"linked_to":"152279","reverse":true},{"package_id":0,"type":0,"name":"yatah","operator":null,"version":null,"linked_to":"152403","reverse":true},{"package_id":0,"type":0,"name":"yfR","operator":null,"version":null,"linked_to":"152435","reverse":true},{"package_id":0,"type":0,"name":"yfinancer","operator":null,"version":null,"linked_to":"152434","reverse":true},{"package_id":0,"type":0,"name":"ymlthis","operator":null,"version":null,"linked_to":"152472","reverse":true},{"package_id":0,"type":0,"name":"zctaCrosswalk","operator":null,"version":null,"linked_to":"152669","reverse":true},{"package_id":0,"type":0,"name":"zipcodeR","operator":null,"version":null,"linked_to":"152859","reverse":true},{"package_id":0,"type":0,"name":"zippeR","operator":null,"version":null,"linked_to":"152887","reverse":true},{"package_id":0,"type":0,"name":"zoomGroupStats","operator":null,"version":null,"linked_to":"152998","reverse":true},{"package_id":0,"type":0,"name":"ztable","operator":null,"version":null,"linked_to":"153026","reverse":true},{"package_id":0,"type":0,"name":"ztype","operator":null,"version":null,"linked_to":"153040","reverse":true},{"package_id":0,"type":1,"name":"EQUALSTATS","operator":null,"version":null,"linked_to":"37741","reverse":true},{"package_id":0,"type":1,"name":"EQUALencrypt","operator":null,"version":null,"linked_to":"37735","reverse":true},{"package_id":0,"type":1,"name":"EQUALrepeat","operator":null,"version":null,"linked_to":"37739","reverse":true},{"package_id":0,"type":1,"name":"FRESA.CAD","operator":null,"version":null,"linked_to":"44885","reverse":true},{"package_id":0,"type":1,"name":"Fgmutils","operator":null,"version":null,"linked_to":"41841","reverse":true},{"package_id":0,"type":1,"name":"LindenmayeR","operator":null,"version":null,"linked_to":"69150","reverse":true},{"package_id":0,"type":1,"name":"Maeswrap","operator":null,"version":null,"linked_to":"71785","reverse":true},{"package_id":0,"type":1,"name":"PersomicsArray","operator":null,"version":null,"linked_to":"95753","reverse":true},{"package_id":0,"type":1,"name":"PhysActBedRest","operator":null,"version":null,"linked_to":"96763","reverse":true},{"package_id":0,"type":1,"name":"QurvE","operator":null,"version":null,"linked_to":"104693","reverse":true},{"package_id":0,"type":1,"name":"RGENERATEPREC","operator":null,"version":null,"linked_to":"112618","reverse":true},{"package_id":0,"type":1,"name":"ReadDIM","operator":null,"version":null,"linked_to":"109522","reverse":true},{"package_id":0,"type":1,"name":"String2AdjMatrix","operator":null,"version":null,"linked_to":"135292","reverse":true},{"package_id":0,"type":1,"name":"TBFmultinomial","operator":null,"version":null,"linked_to":"138615","reverse":true},{"package_id":0,"type":1,"name":"babyTimeR","operator":null,"version":null,"linked_to":"6139","reverse":true},{"package_id":0,"type":1,"name":"cchsflow","operator":null,"version":null,"linked_to":"15959","reverse":true},{"package_id":0,"type":1,"name":"changeS","operator":null,"version":null,"linked_to":"17017","reverse":true},{"package_id":0,"type":1,"name":"curesurv","operator":null,"version":null,"linked_to":"25553","reverse":true},{"package_id":0,"type":1,"name":"easyPSID","operator":null,"version":null,"linked_to":"34227","reverse":true},{"package_id":0,"type":1,"name":"eyeTrackR","operator":null,"version":null,"linked_to":"39694","reverse":true},{"package_id":0,"type":1,"name":"filesstrings","operator":null,"version":null,"linked_to":"42101","reverse":true},{"package_id":0,"type":1,"name":"forstringr","operator":null,"version":null,"linked_to":"44367","reverse":true},{"package_id":0,"type":1,"name":"geotopbricks","operator":null,"version":null,"linked_to":"48829","reverse":true},{"package_id":0,"type":1,"name":"lmomPi","operator":null,"version":null,"linked_to":"69917","reverse":true},{"package_id":0,"type":1,"name":"micropan","operator":null,"version":null,"linked_to":"77587","reverse":true},{"package_id":0,"type":1,"name":"microseq","operator":null,"version":null,"linked_to":"77619","reverse":true},{"package_id":0,"type":1,"name":"morph","operator":null,"version":null,"linked_to":"81484","reverse":true},{"package_id":0,"type":1,"name":"muRL","operator":null,"version":null,"linked_to":"83847","reverse":true},{"package_id":0,"type":1,"name":"neuroim","operator":null,"version":null,"linked_to":"86079","reverse":true},{"package_id":0,"type":1,"name":"octopucs","operator":null,"version":null,"linked_to":"89482","reverse":true},{"package_id":0,"type":1,"name":"onmaRg","operator":null,"version":null,"linked_to":"90255","reverse":true},{"package_id":0,"type":1,"name":"orgR","operator":null,"version":null,"linked_to":"91629","reverse":true},{"package_id":0,"type":1,"name":"pafdR","operator":null,"version":null,"linked_to":"92522","reverse":true},{"package_id":0,"type":1,"name":"paleoDiv","operator":null,"version":null,"linked_to":"92779","reverse":true},{"package_id":0,"type":1,"name":"patchSynctex","operator":null,"version":null,"linked_to":"93792","reverse":true},{"package_id":0,"type":1,"name":"pii","operator":null,"version":null,"linked_to":"96922","reverse":true},{"package_id":0,"type":1,"name":"pxR","operator":null,"version":null,"linked_to":"103078","reverse":true},{"package_id":0,"type":1,"name":"recoder","operator":null,"version":null,"linked_to":"109914","reverse":true},{"package_id":0,"type":1,"name":"repello","operator":null,"version":null,"linked_to":"111104","reverse":true},{"package_id":0,"type":1,"name":"spdesign","operator":null,"version":null,"linked_to":"131731","reverse":true},{"package_id":0,"type":1,"name":"strex","operator":null,"version":null,"linked_to":"135263","reverse":true},{"package_id":0,"type":1,"name":"uscoauditlog","operator":null,"version":null,"linked_to":"146581","reverse":true},{"package_id":0,"type":1,"name":"weightQuant","operator":null,"version":null,"linked_to":"150033","reverse":true},{"package_id":0,"type":2,"name":"AiES","operator":null,"version":null,"linked_to":"1809","reverse":true},{"package_id":0,"type":2,"name":"Andromeda","operator":null,"version":null,"linked_to":"2798","reverse":true},{"package_id":0,"type":2,"name":"AquaBEHER","operator":null,"version":null,"linked_to":"3789","reverse":true},{"package_id":0,"type":2,"name":"AssociationExplorer2","operator":null,"version":null,"linked_to":"4970","reverse":true},{"package_id":0,"type":2,"name":"BrazilCrime","operator":null,"version":null,"linked_to":"12949","reverse":true},{"package_id":0,"type":2,"name":"CFtime","operator":null,"version":null,"linked_to":"16735","reverse":true},{"package_id":0,"type":2,"name":"CimpleG","operator":null,"version":null,"linked_to":"17809","reverse":true},{"package_id":0,"type":2,"name":"ClimClass","operator":null,"version":null,"linked_to":"18748","reverse":true},{"package_id":0,"type":2,"name":"CohortConstructor","operator":null,"version":null,"linked_to":"20829","reverse":true},{"package_id":0,"type":2,"name":"EEAaq","operator":null,"version":null,"linked_to":"35324","reverse":true},{"package_id":0,"type":2,"name":"GDINA","operator":null,"version":null,"linked_to":"47165","reverse":true},{"package_id":0,"type":2,"name":"GDPuc","operator":null,"version":null,"linked_to":"47236","reverse":true},{"package_id":0,"type":2,"name":"GapAnalysis","operator":null,"version":null,"linked_to":"46538","reverse":true},{"package_id":0,"type":2,"name":"HaDeX","operator":null,"version":null,"linked_to":"55542","reverse":true},{"package_id":0,"type":2,"name":"JSmediation","operator":null,"version":null,"linked_to":"64574","reverse":true},{"package_id":0,"type":2,"name":"LLMAgentR","operator":null,"version":null,"linked_to":"69618","reverse":true},{"package_id":0,"type":2,"name":"MetaNet","operator":null,"version":null,"linked_to":"76164","reverse":true},{"package_id":0,"type":2,"name":"MiscMetabar","operator":null,"version":null,"linked_to":"78324","reverse":true},{"package_id":0,"type":2,"name":"NBAloveR","operator":null,"version":null,"linked_to":"84966","reverse":true},{"package_id":0,"type":2,"name":"NMsim","operator":null,"version":null,"linked_to":"87465","reverse":true},{"package_id":0,"type":2,"name":"OmopConstructor","operator":null,"version":null,"linked_to":"89978","reverse":true},{"package_id":0,"type":2,"name":"OmopStudyBuilder","operator":null,"version":null,"linked_to":"90028","reverse":true},{"package_id":0,"type":2,"name":"One4All","operator":null,"version":null,"linked_to":"90132","reverse":true},{"package_id":0,"type":2,"name":"PhenotypeR","operator":null,"version":null,"linked_to":"96256","reverse":true},{"package_id":0,"type":2,"name":"ProjectTemplate","operator":null,"version":null,"linked_to":"101421","reverse":true},{"package_id":0,"type":2,"name":"RCLabels","operator":null,"version":null,"linked_to":"107547","reverse":true},{"package_id":0,"type":2,"name":"RScelestial","operator":null,"version":null,"linked_to":"118371","reverse":true},{"package_id":0,"type":2,"name":"RVerbalExpressions","operator":null,"version":null,"linked_to":"120285","reverse":true},{"package_id":0,"type":2,"name":"Racmacs","operator":null,"version":null,"linked_to":"105327","reverse":true},{"package_id":0,"type":2,"name":"RcmdrPlugin.WorldFlora","operator":null,"version":null,"linked_to":"107882","reverse":true},{"package_id":0,"type":2,"name":"Rpoet","operator":null,"version":null,"linked_to":"117484","reverse":true},{"package_id":0,"type":2,"name":"SCpubr","operator":null,"version":null,"linked_to":"122797","reverse":true},{"package_id":0,"type":2,"name":"ShinyItemAnalysis","operator":null,"version":null,"linked_to":"125981","reverse":true},{"package_id":0,"type":2,"name":"ShinyWizard","operator":null,"version":null,"linked_to":"126299","reverse":true},{"package_id":0,"type":2,"name":"SingleCaseES","operator":null,"version":null,"linked_to":"127631","reverse":true},{"package_id":0,"type":2,"name":"SmartMeterAnalytics","operator":null,"version":null,"linked_to":"128614","reverse":true},{"package_id":0,"type":2,"name":"SoundexBR","operator":null,"version":null,"linked_to":"129821","reverse":true},{"package_id":0,"type":2,"name":"SpatialInference","operator":null,"version":null,"linked_to":"131037","reverse":true},{"package_id":0,"type":2,"name":"StreamCatTools","operator":null,"version":null,"linked_to":"135201","reverse":true},{"package_id":0,"type":2,"name":"Surrogate","operator":null,"version":null,"linked_to":"136183","reverse":true},{"package_id":0,"type":2,"name":"TKCat","operator":null,"version":null,"linked_to":"142266","reverse":true},{"package_id":0,"type":2,"name":"VIM","operator":null,"version":null,"linked_to":"148136","reverse":true},{"package_id":0,"type":2,"name":"WorldFlora","operator":null,"version":null,"linked_to":"150920","reverse":true},{"package_id":0,"type":2,"name":"XYomics","operator":null,"version":null,"linked_to":"152267","reverse":true},{"package_id":0,"type":2,"name":"Xcertainty","operator":null,"version":null,"linked_to":"151587","reverse":true},{"package_id":0,"type":2,"name":"ZIprop","operator":null,"version":null,"linked_to":"152894","reverse":true},{"package_id":0,"type":2,"name":"admiralonco","operator":null,"version":null,"linked_to":"1097","reverse":true},{"package_id":0,"type":2,"name":"admiralpeds","operator":null,"version":null,"linked_to":"1115","reverse":true},{"package_id":0,"type":2,"name":"afcharts","operator":null,"version":null,"linked_to":"1384","reverse":true},{"package_id":0,"type":2,"name":"altair","operator":null,"version":null,"linked_to":"2386","reverse":true},{"package_id":0,"type":2,"name":"amadeus","operator":null,"version":null,"linked_to":"2435","reverse":true},{"package_id":0,"type":2,"name":"annotator","operator":null,"version":null,"linked_to":"2952","reverse":true},{"package_id":0,"type":2,"name":"anomalize","operator":null,"version":null,"linked_to":"2971","reverse":true},{"package_id":0,"type":2,"name":"apathe","operator":null,"version":null,"linked_to":"3388","reverse":true},{"package_id":0,"type":2,"name":"arcpullr","operator":null,"version":null,"linked_to":"4027","reverse":true},{"package_id":0,"type":2,"name":"arrow","operator":null,"version":null,"linked_to":"4388","reverse":true},{"package_id":0,"type":2,"name":"assemblykor","operator":null,"version":null,"linked_to":"4834","reverse":true},{"package_id":0,"type":2,"name":"autoTS","operator":null,"version":null,"linked_to":"5691","reverse":true},{"package_id":0,"type":2,"name":"baselinenowcast","operator":null,"version":null,"linked_to":"6805","reverse":true},{"package_id":0,"type":2,"name":"bdpar","operator":null,"version":null,"linked_to":"8503","reverse":true},{"package_id":0,"type":2,"name":"beadplexr","operator":null,"version":null,"linked_to":"8578","reverse":true},{"package_id":0,"type":2,"name":"bennu","operator":null,"version":null,"linked_to":"8856","reverse":true},{"package_id":0,"type":2,"name":"blogdown","operator":null,"version":null,"linked_to":"11473","reverse":true},{"package_id":0,"type":2,"name":"bmm","operator":null,"version":null,"linked_to":"11688","reverse":true},{"package_id":0,"type":2,"name":"bnRep","operator":null,"version":null,"linked_to":"11876","reverse":true},{"package_id":0,"type":2,"name":"box","operator":null,"version":null,"linked_to":"12644","reverse":true},{"package_id":0,"type":2,"name":"box.lsp","operator":null,"version":null,"linked_to":"12663","reverse":true},{"package_id":0,"type":2,"name":"brand.yml","operator":null,"version":null,"linked_to":"12914","reverse":true},{"package_id":0,"type":2,"name":"bscui","operator":null,"version":null,"linked_to":"13540","reverse":true},{"package_id":0,"type":2,"name":"campsis","operator":null,"version":null,"linked_to":"14582","reverse":true},{"package_id":0,"type":2,"name":"camtrapR","operator":null,"version":null,"linked_to":"14624","reverse":true},{"package_id":0,"type":2,"name":"canaper","operator":null,"version":null,"linked_to":"14653","reverse":true},{"package_id":0,"type":2,"name":"canvasXpress","operator":null,"version":null,"linked_to":"14762","reverse":true},{"package_id":0,"type":2,"name":"cppally","operator":null,"version":null,"linked_to":"24012","reverse":true},{"package_id":0,"type":2,"name":"crmPack","operator":null,"version":null,"linked_to":"24437","reverse":true},{"package_id":0,"type":2,"name":"csdata","operator":null,"version":null,"linked_to":"24917","reverse":true},{"package_id":0,"type":2,"name":"cxr","operator":null,"version":null,"linked_to":"25901","reverse":true},{"package_id":0,"type":2,"name":"cytominer","operator":null,"version":null,"linked_to":"26010","reverse":true},{"package_id":0,"type":2,"name":"datacommons","operator":null,"version":null,"linked_to":"26697","reverse":true},{"package_id":0,"type":2,"name":"datadiff","operator":null,"version":null,"linked_to":"26722","reverse":true},{"package_id":0,"type":2,"name":"datplot","operator":null,"version":null,"linked_to":"27322","reverse":true},{"package_id":0,"type":2,"name":"densityarea","operator":null,"version":null,"linked_to":"28611","reverse":true},{"package_id":0,"type":2,"name":"depCensoring","operator":null,"version":null,"linked_to":"28658","reverse":true},{"package_id":0,"type":2,"name":"descsuppR","operator":null,"version":null,"linked_to":"28857","reverse":true},{"package_id":0,"type":2,"name":"dfeR","operator":null,"version":null,"linked_to":"29321","reverse":true},{"package_id":0,"type":2,"name":"diffdf","operator":null,"version":null,"linked_to":"29906","reverse":true},{"package_id":0,"type":2,"name":"docknitr","operator":null,"version":null,"linked_to":"31715","reverse":true},{"package_id":0,"type":2,"name":"domir","operator":null,"version":null,"linked_to":"31934","reverse":true},{"package_id":0,"type":2,"name":"donutsk","operator":null,"version":null,"linked_to":"31955","reverse":true},{"package_id":0,"type":2,"name":"easyRef","operator":null,"version":null,"linked_to":"34254","reverse":true},{"package_id":0,"type":2,"name":"ecorisk","operator":null,"version":null,"linked_to":"34911","reverse":true},{"package_id":0,"type":2,"name":"edfinr","operator":null,"version":null,"linked_to":"35137","reverse":true},{"package_id":0,"type":2,"name":"eeptools","operator":null,"version":null,"linked_to":"35376","reverse":true},{"package_id":0,"type":2,"name":"ensModelVis","operator":null,"version":null,"linked_to":"36913","reverse":true},{"package_id":0,"type":2,"name":"envDocument","operator":null,"version":null,"linked_to":"36974","reverse":true},{"package_id":0,"type":2,"name":"epigraphdb","operator":null,"version":null,"linked_to":"37271","reverse":true},{"package_id":0,"type":2,"name":"epitraxr","operator":null,"version":null,"linked_to":"37526","reverse":true},{"package_id":0,"type":2,"name":"ethnobotanyR","operator":null,"version":null,"linked_to":"38351","reverse":true},{"package_id":0,"type":2,"name":"eudract","operator":null,"version":null,"linked_to":"38427","reverse":true},{"package_id":0,"type":2,"name":"exuber","operator":null,"version":null,"linked_to":"39633","reverse":true},{"package_id":0,"type":2,"name":"fec16","operator":null,"version":null,"linked_to":"41504","reverse":true},{"package_id":0,"type":2,"name":"fgeo.tool","operator":null,"version":null,"linked_to":"41825","reverse":true},{"package_id":0,"type":2,"name":"fivethirtyeight","operator":null,"version":null,"linked_to":"42674","reverse":true},{"package_id":0,"type":2,"name":"flexpolyline","operator":null,"version":null,"linked_to":"42968","reverse":true},{"package_id":0,"type":2,"name":"frequencyConnectedness","operator":null,"version":null,"linked_to":"44873","reverse":true},{"package_id":0,"type":2,"name":"fscache","operator":null,"version":null,"linked_to":"45140","reverse":true},{"package_id":0,"type":2,"name":"fuzzystring","operator":null,"version":null,"linked_to":"45965","reverse":true},{"package_id":0,"type":2,"name":"g6R","operator":null,"version":null,"linked_to":"46072","reverse":true},{"package_id":0,"type":2,"name":"galaxias","operator":null,"version":null,"linked_to":"46191","reverse":true},{"package_id":0,"type":2,"name":"ggenealogy","operator":null,"version":null,"linked_to":"49713","reverse":true},{"package_id":0,"type":2,"name":"ggfoundry","operator":null,"version":null,"linked_to":"49840","reverse":true},{"package_id":0,"type":2,"name":"ggmapinset","operator":null,"version":null,"linked_to":"50160","reverse":true},{"package_id":0,"type":2,"name":"ggmulti","operator":null,"version":null,"linked_to":"50249","reverse":true},{"package_id":0,"type":2,"name":"ggrepel","operator":null,"version":null,"linked_to":"50660","reverse":true},{"package_id":0,"type":2,"name":"ggsankeyfier","operator":null,"version":null,"linked_to":"50710","reverse":true},{"package_id":0,"type":2,"name":"ggscribe","operator":null,"version":null,"linked_to":"50740","reverse":true},{"package_id":0,"type":2,"name":"glossr","operator":null,"version":null,"linked_to":"52207","reverse":true},{"package_id":0,"type":2,"name":"gluedown","operator":null,"version":null,"linked_to":"52258","reverse":true},{"package_id":0,"type":2,"name":"gofigR","operator":null,"version":null,"linked_to":"52737","reverse":true},{"package_id":0,"type":2,"name":"golem","operator":null,"version":null,"linked_to":"52785","reverse":true},{"package_id":0,"type":2,"name":"gooseR","operator":null,"version":null,"linked_to":"52983","reverse":true},{"package_id":0,"type":2,"name":"granova","operator":null,"version":null,"linked_to":"53545","reverse":true},{"package_id":0,"type":2,"name":"gtExtras","operator":null,"version":null,"linked_to":"54891","reverse":true},{"package_id":0,"type":2,"name":"gtexr","operator":null,"version":null,"linked_to":"54888","reverse":true},{"package_id":0,"type":2,"name":"hatchR","operator":null,"version":null,"linked_to":"55884","reverse":true},{"package_id":0,"type":2,"name":"healthyR.ai","operator":null,"version":null,"linked_to":"56397","reverse":true},{"package_id":0,"type":2,"name":"healthyR.ts","operator":null,"version":null,"linked_to":"56420","reverse":true},{"package_id":0,"type":2,"name":"heatwaveR","operator":null,"version":null,"linked_to":"56491","reverse":true},{"package_id":0,"type":2,"name":"heemod","operator":null,"version":null,"linked_to":"56534","reverse":true},{"package_id":0,"type":2,"name":"hidecan","operator":null,"version":null,"linked_to":"57113","reverse":true},{"package_id":0,"type":2,"name":"himach","operator":null,"version":null,"linked_to":"57320","reverse":true},{"package_id":0,"type":2,"name":"httk","operator":null,"version":null,"linked_to":"58293","reverse":true},{"package_id":0,"type":2,"name":"httkexamples","operator":null,"version":null,"linked_to":"58322","reverse":true},{"package_id":0,"type":2,"name":"hyd1d","operator":null,"version":null,"linked_to":"58675","reverse":true},{"package_id":0,"type":2,"name":"hydflood","operator":null,"version":null,"linked_to":"58695","reverse":true},{"package_id":0,"type":2,"name":"imfapi","operator":null,"version":null,"linked_to":"60553","reverse":true},{"package_id":0,"type":2,"name":"implyr","operator":null,"version":null,"linked_to":"60740","reverse":true},{"package_id":0,"type":2,"name":"imuf","operator":null,"version":null,"linked_to":"60837","reverse":true},{"package_id":0,"type":2,"name":"industRial","operator":null,"version":null,"linked_to":"61084","reverse":true},{"package_id":0,"type":2,"name":"infer","operator":null,"version":null,"linked_to":"61142","reverse":true},{"package_id":0,"type":2,"name":"interp","operator":null,"version":null,"linked_to":"61886","reverse":true},{"package_id":0,"type":2,"name":"invitroTKstats","operator":null,"version":null,"linked_to":"62173","reverse":true},{"package_id":0,"type":2,"name":"invivoPKfit","operator":null,"version":null,"linked_to":"62175","reverse":true},{"package_id":0,"type":2,"name":"jab.adverse.reactions","operator":null,"version":null,"linked_to":"63618","reverse":true},{"package_id":0,"type":2,"name":"jointVIP","operator":null,"version":null,"linked_to":"64335","reverse":true},{"package_id":0,"type":2,"name":"kidsides","operator":null,"version":null,"linked_to":"65755","reverse":true},{"package_id":0,"type":2,"name":"landscapemetrics","operator":null,"version":null,"linked_to":"66958","reverse":true},{"package_id":0,"type":2,"name":"languageserver","operator":null,"version":null,"linked_to":"67045","reverse":true},{"package_id":0,"type":2,"name":"legislatoR","operator":null,"version":null,"linked_to":"68296","reverse":true},{"package_id":0,"type":2,"name":"lemon","operator":null,"version":null,"linked_to":"68381","reverse":true},{"package_id":0,"type":2,"name":"mFD","operator":null,"version":null,"linked_to":"76707","reverse":true},{"package_id":0,"type":2,"name":"mammalcol","operator":null,"version":null,"linked_to":"72115","reverse":true},{"package_id":0,"type":2,"name":"mappoly","operator":null,"version":null,"linked_to":"72538","reverse":true},{"package_id":0,"type":2,"name":"matchedcc","operator":null,"version":null,"linked_to":"73384","reverse":true},{"package_id":0,"type":2,"name":"mcbette","operator":null,"version":null,"linked_to":"74509","reverse":true},{"package_id":0,"type":2,"name":"metamorphr","operator":null,"version":null,"linked_to":"76139","reverse":true},{"package_id":0,"type":2,"name":"misc","operator":null,"version":null,"linked_to":"78295","reverse":true},{"package_id":0,"type":2,"name":"misha","operator":null,"version":null,"linked_to":"78350","reverse":true},{"package_id":0,"type":2,"name":"mitey","operator":null,"version":null,"linked_to":"78551","reverse":true},{"package_id":0,"type":2,"name":"mortar","operator":null,"version":null,"linked_to":"81605","reverse":true},{"package_id":0,"type":2,"name":"msdrought","operator":null,"version":null,"linked_to":"82608","reverse":true},{"package_id":0,"type":2,"name":"mtsta","operator":null,"version":null,"linked_to":"82978","reverse":true},{"package_id":0,"type":2,"name":"multiverse","operator":null,"version":null,"linked_to":"83751","reverse":true},{"package_id":0,"type":2,"name":"mvrsquared","operator":null,"version":null,"linked_to":"84210","reverse":true},{"package_id":0,"type":2,"name":"natstrat","operator":null,"version":null,"linked_to":"84934","reverse":true},{"package_id":0,"type":2,"name":"newsanchor","operator":null,"version":null,"linked_to":"86141","reverse":true},{"package_id":0,"type":2,"name":"nichetools","operator":null,"version":null,"linked_to":"86496","reverse":true},{"package_id":0,"type":2,"name":"nima","operator":null,"version":null,"linked_to":"86525","reverse":true},{"package_id":0,"type":2,"name":"nplyr","operator":null,"version":null,"linked_to":"88604","reverse":true},{"package_id":0,"type":2,"name":"nrba","operator":null,"version":null,"linked_to":"88758","reverse":true},{"package_id":0,"type":2,"name":"nswgeo","operator":null,"version":null,"linked_to":"88907","reverse":true},{"package_id":0,"type":2,"name":"nuts","operator":null,"version":null,"linked_to":"89080","reverse":true},{"package_id":0,"type":2,"name":"oddsapiR","operator":null,"version":null,"linked_to":"89545","reverse":true},{"package_id":0,"type":2,"name":"omock","operator":null,"version":null,"linked_to":"89968","reverse":true},{"package_id":0,"type":2,"name":"onemap","operator":null,"version":null,"linked_to":"90153","reverse":true},{"package_id":0,"type":2,"name":"ontophylo","operator":null,"version":null,"linked_to":"90307","reverse":true},{"package_id":0,"type":2,"name":"oolong","operator":null,"version":null,"linked_to":"90315","reverse":true},{"package_id":0,"type":2,"name":"openFDA","operator":null,"version":null,"linked_to":"90644","reverse":true},{"package_id":0,"type":2,"name":"openintro","operator":null,"version":null,"linked_to":"90676","reverse":true},{"package_id":0,"type":2,"name":"optparse","operator":null,"version":null,"linked_to":"91321","reverse":true},{"package_id":0,"type":2,"name":"origami","operator":null,"version":null,"linked_to":"91641","reverse":true},{"package_id":0,"type":2,"name":"osdc","operator":null,"version":null,"linked_to":"91779","reverse":true},{"package_id":0,"type":2,"name":"ottr","operator":null,"version":null,"linked_to":"91990","reverse":true},{"package_id":0,"type":2,"name":"outcomerate","operator":null,"version":null,"linked_to":"92039","reverse":true},{"package_id":0,"type":2,"name":"pairwiseLLM","operator":null,"version":null,"linked_to":"92680","reverse":true},{"package_id":0,"type":2,"name":"parcr","operator":null,"version":null,"linked_to":"93404","reverse":true},{"package_id":0,"type":2,"name":"parsermd","operator":null,"version":null,"linked_to":"93529","reverse":true},{"package_id":0,"type":2,"name":"pater","operator":null,"version":null,"linked_to":"93812","reverse":true},{"package_id":0,"type":2,"name":"patterncausality","operator":null,"version":null,"linked_to":"93966","reverse":true},{"package_id":0,"type":2,"name":"pctax","operator":null,"version":null,"linked_to":"94839","reverse":true},{"package_id":0,"type":2,"name":"pcutils","operator":null,"version":null,"linked_to":"94855","reverse":true},{"package_id":0,"type":2,"name":"pipetime","operator":null,"version":null,"linked_to":"97088","reverse":true},{"package_id":0,"type":2,"name":"plotROC","operator":null,"version":null,"linked_to":"98023","reverse":true},{"package_id":0,"type":2,"name":"polaroid","operator":null,"version":null,"linked_to":"98795","reverse":true},{"package_id":0,"type":2,"name":"ppitables","operator":null,"version":null,"linked_to":"99970","reverse":true},{"package_id":0,"type":2,"name":"prnsamplr","operator":null,"version":null,"linked_to":"100962","reverse":true},{"package_id":0,"type":2,"name":"public.ctn0094data","operator":null,"version":null,"linked_to":"102688","reverse":true},{"package_id":0,"type":2,"name":"public.ctn0094extra","operator":null,"version":null,"linked_to":"102690","reverse":true},{"package_id":0,"type":2,"name":"purgeR","operator":null,"version":null,"linked_to":"102857","reverse":true},{"package_id":0,"type":2,"name":"rTPC","operator":null,"version":null,"linked_to":"119752","reverse":true},{"package_id":0,"type":2,"name":"radEmu","operator":null,"version":null,"linked_to":"105352","reverse":true},{"package_id":0,"type":2,"name":"ragnar","operator":null,"version":null,"linked_to":"105609","reverse":true},{"package_id":0,"type":2,"name":"ragtop","operator":null,"version":null,"linked_to":"105631","reverse":true},{"package_id":0,"type":2,"name":"rar","operator":null,"version":null,"linked_to":"106315","reverse":true},{"package_id":0,"type":2,"name":"rasterList","operator":null,"version":null,"linked_to":"106465","reverse":true},{"package_id":0,"type":2,"name":"raw","operator":null,"version":null,"linked_to":"106717","reverse":true},{"package_id":0,"type":2,"name":"regclass","operator":null,"version":null,"linked_to":"110440","reverse":true},{"package_id":0,"type":2,"name":"regmedint","operator":null,"version":null,"linked_to":"110518","reverse":true},{"package_id":0,"type":2,"name":"regsem","operator":null,"version":null,"linked_to":"110602","reverse":true},{"package_id":0,"type":2,"name":"repr","operator":null,"version":null,"linked_to":"111296","reverse":true},{"package_id":0,"type":2,"name":"rex","operator":null,"version":null,"linked_to":"112021","reverse":true},{"package_id":0,"type":2,"name":"rfordummies","operator":null,"version":null,"linked_to":"112354","reverse":true},{"package_id":0,"type":2,"name":"rinat","operator":null,"version":null,"linked_to":"113415","reverse":true},{"package_id":0,"type":2,"name":"riskCommunicator","operator":null,"version":null,"linked_to":"113585","reverse":true},{"package_id":0,"type":2,"name":"rmdfiltr","operator":null,"version":null,"linked_to":"114738","reverse":true},{"package_id":0,"type":2,"name":"robservable","operator":null,"version":null,"linked_to":"115918","reverse":true},{"package_id":0,"type":2,"name":"rolap","operator":null,"version":null,"linked_to":"116477","reverse":true},{"package_id":0,"type":2,"name":"rticulate","operator":null,"version":null,"linked_to":"119577","reverse":true},{"package_id":0,"type":2,"name":"sarp.snowprofile","operator":null,"version":null,"linked_to":"121671","reverse":true},{"package_id":0,"type":2,"name":"scITD","operator":null,"version":null,"linked_to":"122536","reverse":true},{"package_id":0,"type":2,"name":"scenes","operator":null,"version":null,"linked_to":"122341","reverse":true},{"package_id":0,"type":2,"name":"sensitivity","operator":null,"version":null,"linked_to":"124294","reverse":true},{"package_id":0,"type":2,"name":"sentopics","operator":null,"version":null,"linked_to":"124446","reverse":true},{"package_id":0,"type":2,"name":"sfdep","operator":null,"version":null,"linked_to":"125070","reverse":true},{"package_id":0,"type":2,"name":"sgplot","operator":null,"version":null,"linked_to":"125302","reverse":true},{"package_id":0,"type":2,"name":"shinymeta","operator":null,"version":null,"linked_to":"126077","reverse":true},{"package_id":0,"type":2,"name":"simPop","operator":null,"version":null,"linked_to":"127359","reverse":true},{"package_id":0,"type":2,"name":"simstandard","operator":null,"version":null,"linked_to":"127463","reverse":true},{"package_id":0,"type":2,"name":"sitrep","operator":null,"version":null,"linked_to":"127847","reverse":true},{"package_id":0,"type":2,"name":"sits","operator":null,"version":null,"linked_to":"127851","reverse":true},{"package_id":0,"type":2,"name":"smcfcs","operator":null,"version":null,"linked_to":"128652","reverse":true},{"package_id":0,"type":2,"name":"spRingsteen","operator":null,"version":null,"linked_to":"132759","reverse":true},{"package_id":0,"type":2,"name":"spatialEco","operator":null,"version":null,"linked_to":"130965","reverse":true},{"package_id":0,"type":2,"name":"starter","operator":null,"version":null,"linked_to":"133912","reverse":true},{"package_id":0,"type":2,"name":"states","operator":null,"version":null,"linked_to":"134085","reverse":true},{"package_id":0,"type":2,"name":"stats19","operator":null,"version":null,"linked_to":"134292","reverse":true},{"package_id":0,"type":2,"name":"stbl","operator":null,"version":null,"linked_to":"134399","reverse":true},{"package_id":0,"type":2,"name":"summata","operator":null,"version":null,"linked_to":"135828","reverse":true},{"package_id":0,"type":2,"name":"survextrap","operator":null,"version":null,"linked_to":"136340","reverse":true},{"package_id":0,"type":2,"name":"sweep","operator":null,"version":null,"linked_to":"137321","reverse":true},{"package_id":0,"type":2,"name":"swfscDAS","operator":null,"version":null,"linked_to":"137349","reverse":true},{"package_id":0,"type":2,"name":"syuzhet","operator":null,"version":null,"linked_to":"137857","reverse":true},{"package_id":0,"type":2,"name":"tern","operator":null,"version":null,"linked_to":"139307","reverse":true},{"package_id":0,"type":2,"name":"tfdeploy","operator":null,"version":null,"linked_to":"140035","reverse":true},{"package_id":0,"type":2,"name":"thisplot","operator":null,"version":null,"linked_to":"140351","reverse":true},{"package_id":0,"type":2,"name":"tidier","operator":null,"version":null,"linked_to":"140568","reverse":true},{"package_id":0,"type":2,"name":"tidyAML","operator":null,"version":null,"linked_to":"140571","reverse":true},{"package_id":0,"type":2,"name":"tidySEM","operator":null,"version":null,"linked_to":"141230","reverse":true},{"package_id":0,"type":2,"name":"tidyfit","operator":null,"version":null,"linked_to":"140811","reverse":true},{"package_id":0,"type":2,"name":"tidylo","operator":null,"version":null,"linked_to":"140983","reverse":true},{"package_id":0,"type":2,"name":"tidyselect","operator":null,"version":null,"linked_to":"141219","reverse":true},{"package_id":0,"type":2,"name":"tidytuesdayR","operator":null,"version":null,"linked_to":"141493","reverse":true},{"package_id":0,"type":2,"name":"tikzDevice","operator":null,"version":null,"linked_to":"141639","reverse":true},{"package_id":0,"type":2,"name":"transplantr","operator":null,"version":null,"linked_to":"143599","reverse":true},{"package_id":0,"type":2,"name":"troopdata","operator":null,"version":null,"linked_to":"144283","reverse":true},{"package_id":0,"type":2,"name":"tsDyn","operator":null,"version":null,"linked_to":"144559","reverse":true},{"package_id":0,"type":2,"name":"uavRmp","operator":null,"version":null,"linked_to":"145489","reverse":true},{"package_id":0,"type":2,"name":"ulrb","operator":null,"version":null,"linked_to":"145882","reverse":true},{"package_id":0,"type":2,"name":"unpivotr","operator":null,"version":null,"linked_to":"146345","reverse":true},{"package_id":0,"type":2,"name":"unusualprofile","operator":null,"version":null,"linked_to":"146387","reverse":true},{"package_id":0,"type":2,"name":"ura","operator":null,"version":null,"linked_to":"146484","reverse":true},{"package_id":0,"type":2,"name":"valaddin","operator":null,"version":null,"linked_to":"146962","reverse":true},{"package_id":0,"type":2,"name":"vcdExtra","operator":null,"version":null,"linked_to":"147463","reverse":true},{"package_id":0,"type":2,"name":"vindecodr","operator":null,"version":null,"linked_to":"148175","reverse":true},{"package_id":0,"type":2,"name":"visdat","operator":null,"version":null,"linked_to":"148360","reverse":true},{"package_id":0,"type":2,"name":"vitae","operator":null,"version":null,"linked_to":"148550","reverse":true},{"package_id":0,"type":2,"name":"vkR","operator":null,"version":null,"linked_to":"148631","reverse":true},{"package_id":0,"type":2,"name":"wingen","operator":null,"version":null,"linked_to":"150500","reverse":true},{"package_id":0,"type":2,"name":"wsrf","operator":null,"version":null,"linked_to":"151366","reverse":true},{"package_id":0,"type":2,"name":"wxgenR","operator":null,"version":null,"linked_to":"151471","reverse":true},{"package_id":0,"type":2,"name":"xvm","operator":null,"version":null,"linked_to":"152243","reverse":true},{"package_id":0,"type":2,"name":"zmisc","operator":null,"version":null,"linked_to":"152907","reverse":true}],"archived":[{"id":0,"source_id":1,"version":"1.5.2","package_date":null,"date_publication":"2025-09-08T12:00:02Z","license":"MIT + file LICENSE","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"1.5.1","package_date":null,"date_publication":"2023-11-14T23:10:02Z","license":"MIT + file LICENSE","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"1.5.0","package_date":null,"date_publication":"2022-12-02T10:20:02Z","license":"MIT + file LICENSE","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"1.4.1","package_date":null,"date_publication":"2022-08-20T22:10:02Z","license":"GPL-2 | file LICENSE","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"1.4.0","package_date":null,"date_publication":"2019-02-10T03:40:03Z","license":"GPL-2 | file LICENSE","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"1.3.1","package_date":null,"date_publication":"2018-05-10T21:32:15Z","license":"GPL-2 | file LICENSE","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"1.3.0","package_date":null,"date_publication":"2018-02-19T19:47:14Z","license":"GPL-2 | file LICENSE","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"1.2.0","package_date":null,"date_publication":"2017-02-18T21:23:06Z","license":"GPL-2 | file LICENSE","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"1.1.0","package_date":null,"date_publication":"2016-08-19T21:02:58Z","license":"GPL-2","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"1.0.0","package_date":null,"date_publication":"2015-04-30T11:48:24Z","license":"GPL-2","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"0.6.2","package_date":null,"date_publication":"2012-12-06T08:39:59Z","license":"GPL-2","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"0.6.1","package_date":null,"date_publication":"2012-07-25T19:59:21Z","license":"GPL-2","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"0.6","package_date":null,"date_publication":"2011-12-08T19:01:59Z","license":"GPL-2","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"0.5","package_date":null,"date_publication":"2011-06-30T17:12:32Z","license":"GPL-2","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"0.4","package_date":null,"date_publication":"2010-08-24T14:33:39Z","license":"GPL-2","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"0.3","package_date":null,"date_publication":"2010-02-15T17:05:46Z","license":"GPL-2","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"0.2","package_date":null,"date_publication":"2009-11-16T19:25:24Z","license":"GPL-2","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]},{"id":0,"source_id":1,"version":"0.1.10","package_date":null,"date_publication":"2009-11-09T15:57:09Z","license":"GPL-2","name":"stringr","blocked":false,"blocking_rule":null,"vulns":[]}],"ash":"71b3267794df315a330eefeb3ea3d3458b2a8d7831a7d78ae44f74414bbd5c17","binary_record":{"id":0,"package_id":0,"checksum":"","r_version":"","distro":"","arch":"","ash":""},"blocked":false,"vulns":[]}' + headers: + Cache-Control: + - no-cache, no-store, must-revalidate + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 08 May 2026 06:11:51 GMT + Expires: + - "0" + Pragma: + - no-cache + Request-Id: + - 8e1923dd-419c-45d8-87cf-7b29eafcbcba + Server: + - Posit Package Manager v2026.04.2 + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Repository-Type: + - RSPM + status: 200 OK + code: 200 + duration: 1.110696036s diff --git a/go/internal/worker/pipeline/filterecosystem/filterecosystem.go b/go/internal/worker/pipeline/filterecosystem/filterecosystem.go new file mode 100644 index 00000000000..63f81800753 --- /dev/null +++ b/go/internal/worker/pipeline/filterecosystem/filterecosystem.go @@ -0,0 +1,60 @@ +// Package filterecosystem implements an enricher that filters out affected ecosystems that should not be there. +package filterecosystem + +import ( + "context" + "log/slog" + "strings" + + "github.com/google/osv.dev/go/internal/osvutil/schema" + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/google/osv.dev/go/logger" + "github.com/ossf/osv-schema/bindings/go/osvschema" + "google.golang.org/protobuf/proto" +) + +type Enricher struct{} + +var _ pipeline.Enricher = (*Enricher)(nil) + +func (*Enricher) Enrich(ctx context.Context, vuln *osvschema.Vulnerability, params *pipeline.EnrichParams) error { + newAffected := make([]*osvschema.Affected, 0, len(vuln.GetAffected())) + for _, affected := range vuln.GetAffected() { + pkg := affected.GetPackage() + ecosystem := pkg.GetEcosystem() + ecoBase, _, _ := strings.Cut(ecosystem, ":") + shouldRemove := false + if params.SourceRepo.Name == "echo" && ecoBase != "Echo" { + // TODO(michaelkedar): Have a list of allowed ecosystems in the SourceRepo #5285 + shouldRemove = true + } + if !schema.IsKnownEcosystem(ecoBase) { + shouldRemove = true + } + if !shouldRemove { + newAffected = append(newAffected, affected) + continue + } + logger.WarnContext(ctx, "filtered out affected ecosystem", + slog.String("vuln_id", vuln.GetId()), + slog.String("ecosystem", ecosystem), + slog.String("repo", params.SourceRepo.Name)) + + // check if there any GIT affected ranges that we might want to keep + gitRanges := make([]*osvschema.Range, 0, len(affected.GetRanges())) + for _, r := range affected.GetRanges() { + if r.GetType() == osvschema.Range_GIT { + gitRanges = append(gitRanges, r) + } + } + if len(gitRanges) > 0 { + aff := proto.Clone(affected).(*osvschema.Affected) + aff.Ranges = gitRanges + aff.Package = nil + newAffected = append(newAffected, aff) + } + } + vuln.Affected = newAffected + + return nil +} diff --git a/go/internal/worker/pipeline/filterecosystem/filterecosystem_test.go b/go/internal/worker/pipeline/filterecosystem/filterecosystem_test.go new file mode 100644 index 00000000000..c2649b9f805 --- /dev/null +++ b/go/internal/worker/pipeline/filterecosystem/filterecosystem_test.go @@ -0,0 +1,184 @@ +package filterecosystem + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/osv.dev/go/internal/models" + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/ossf/osv-schema/bindings/go/osvschema" + "google.golang.org/protobuf/testing/protocmp" +) + +func TestEnricher_Enrich(t *testing.T) { + enricher := &Enricher{} + ctx := context.Background() + + tests := []struct { + name string + repoName string + affected []*osvschema.Affected + expectedAffected []*osvschema.Affected + }{ + { + name: "Keep valid ecosystem", + repoName: "all-allowed", + affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "PyPI", + Name: "atomicwrites", + }, + }, + }, + expectedAffected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "PyPI", + Name: "atomicwrites", + }, + }, + }, + }, + { + name: "Filter out invalid ecosystem", + repoName: "all-allowed", + affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "InvalidEcosystem", + Name: "pkg", + }, + }, + }, + expectedAffected: []*osvschema.Affected{}, + }, + { + name: "Filter out non-Echo for Echo repo", + repoName: "echo", + affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "PyPI", + Name: "atomicwrites", + }, + }, + }, + expectedAffected: []*osvschema.Affected{}, + }, + { + name: "Keep Echo for Echo repo", + repoName: "echo", + affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "Echo", + Name: "pkg", + }, + }, + }, + expectedAffected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "Echo", + Name: "pkg", + }, + }, + }, + }, + { + name: "Preserve GIT ranges when filtering ecosystem", + repoName: "all-allowed", + affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "InvalidEcosystem", + Name: "pkg", + }, + Ranges: []*osvschema.Range{ + { + Type: osvschema.Range_GIT, + Repo: "https://github.com/example/repo", + Events: []*osvschema.Event{ + {Introduced: "0"}, + }, + }, + { + Type: osvschema.Range_ECOSYSTEM, + Events: []*osvschema.Event{ + {Introduced: "1.0.0"}, + }, + }, + }, + }, + }, + expectedAffected: []*osvschema.Affected{ + { + Ranges: []*osvschema.Range{ + { + Type: osvschema.Range_GIT, + Repo: "https://github.com/example/repo", + Events: []*osvschema.Event{ + {Introduced: "0"}, + }, + }, + }, + }, + }, + }, + { + name: "Mixed valid and invalid ecosystems", + repoName: "all-allowed", + affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "PyPI", + Name: "valid-pkg", + }, + }, + { + Package: &osvschema.Package{ + Ecosystem: "InvalidEcosystem", + Name: "invalid-pkg", + }, + }, + }, + expectedAffected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "PyPI", + Name: "valid-pkg", + }, + }, + }, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + vuln := &osvschema.Vulnerability{ + Id: "TEST-123", + Affected: tc.affected, + } + + params := &pipeline.EnrichParams{ + SourceRepo: &models.SourceRepository{ + Name: tc.repoName, + }, + } + + if err := enricher.Enrich(ctx, vuln, params); err != nil { + t.Fatalf("Enrich failed: %v", err) + } + + opts := []cmp.Option{ + protocmp.Transform(), + } + + if diff := cmp.Diff(tc.expectedAffected, vuln.GetAffected(), opts...); diff != "" { + t.Errorf("Affected mismatch (-want +got):\n%s", diff) + } + }) + } +} diff --git a/go/internal/worker/pipeline/makesemver/makesemver.go b/go/internal/worker/pipeline/makesemver/makesemver.go new file mode 100644 index 00000000000..84e1964547e --- /dev/null +++ b/go/internal/worker/pipeline/makesemver/makesemver.go @@ -0,0 +1,75 @@ +// Package makesemver implements an enricher that converts affected[].ranges[].type to SEMVER from ECOSYSTEM +// for SEMVER ecosystems. +package makesemver + +import ( + "context" + "log/slog" + "regexp" + + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/google/osv.dev/go/logger" + "github.com/google/osv.dev/go/osv/ecosystem" + "github.com/ossf/osv-schema/bindings/go/osvschema" +) + +type Enricher struct{} + +var _ pipeline.Enricher = (*Enricher)(nil) + +// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string +var strictSemverRegex = regexp.MustCompile(`^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?:[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$`) + +func (*Enricher) Enrich(ctx context.Context, vuln *osvschema.Vulnerability, params *pipeline.EnrichParams) error { + provider := params.EcosystemProvider + if provider == nil { + logger.WarnContext(ctx, "ecosystem provider is nil, using default", slog.String("vuln_id", vuln.GetId())) + provider = ecosystem.DefaultProvider + } + for _, affected := range vuln.GetAffected() { + pkg := affected.GetPackage() + ecosystemName := pkg.GetEcosystem() + if ecosystemName == "" { + continue + } + sys, ok := provider.Get(ecosystemName) + if !ok || !sys.IsSemver() { + continue + } + for _, r := range affected.GetRanges() { + if r.GetType() != osvschema.Range_ECOSYSTEM { + continue + } + // We only want to convert ECOSYSTEM ranges to SEMVER ranges if all events + // in the range use valid SEMVER strings. + // See: https://github.com/google/osv.dev/issues/5173 + isValidSemverRange := true + for _, e := range r.GetEvents() { + var eventValue string + switch { + case e.GetIntroduced() != "": + eventValue = e.GetIntroduced() + case e.GetFixed() != "": + eventValue = e.GetFixed() + case e.GetLastAffected() != "": + eventValue = e.GetLastAffected() + // skipping limit events because they don't make sense here + } + if eventValue != "0" && !strictSemverRegex.MatchString(eventValue) { + logger.WarnContext(ctx, "non-semver version found in semver ecosystem range", + slog.String("vuln_id", vuln.GetId()), + slog.String("ecosystem", ecosystemName), + slog.String("event_value", eventValue)) + isValidSemverRange = false + + break + } + } + if isValidSemverRange { + r.Type = osvschema.Range_SEMVER + } + } + } + + return nil +} diff --git a/go/internal/worker/pipeline/makesemver/makesemver_test.go b/go/internal/worker/pipeline/makesemver/makesemver_test.go new file mode 100644 index 00000000000..c651e117441 --- /dev/null +++ b/go/internal/worker/pipeline/makesemver/makesemver_test.go @@ -0,0 +1,96 @@ +package makesemver + +import ( + "context" + "testing" + + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/google/osv.dev/go/osv/ecosystem" + "github.com/ossf/osv-schema/bindings/go/osvschema" +) + +func TestEnricher_Enrich(t *testing.T) { + enricher := &Enricher{} + ctx := context.Background() + + tests := []struct { + name string + ecosystem string + rangeType osvschema.Range_Type + events []*osvschema.Event + expectedType osvschema.Range_Type + }{ + { + name: "Convert ECOSYSTEM to SEMVER for SemVer ecosystem with valid SemVer", + ecosystem: "npm", + rangeType: osvschema.Range_ECOSYSTEM, + events: []*osvschema.Event{ + {Introduced: "0"}, + {Fixed: "1.2.3"}, + }, + expectedType: osvschema.Range_SEMVER, + }, + { + name: "Do not convert for SemVer ecosystem with invalid SemVer events", + ecosystem: "npm", + rangeType: osvschema.Range_ECOSYSTEM, + events: []*osvschema.Event{ + {Introduced: "1.0"}, // Missing patch version + }, + expectedType: osvschema.Range_ECOSYSTEM, + }, + { + name: "Do not convert for non-SemVer ecosystem", + ecosystem: "PyPI", + rangeType: osvschema.Range_ECOSYSTEM, + events: []*osvschema.Event{ + {Introduced: "1.2.3"}, + }, + expectedType: osvschema.Range_ECOSYSTEM, + }, + { + name: "Do not convert other range types", + ecosystem: "npm", + rangeType: osvschema.Range_GIT, + events: []*osvschema.Event{ + {Introduced: "1.2.3"}, + }, + expectedType: osvschema.Range_GIT, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + vuln := &osvschema.Vulnerability{ + Id: "TEST-123", + Affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: tc.ecosystem, + Name: "test-pkg", + }, + Ranges: []*osvschema.Range{ + { + Type: tc.rangeType, + Events: tc.events, + }, + }, + }, + }, + } + + params := &pipeline.EnrichParams{ + EcosystemProvider: ecosystem.DefaultProvider, + } + + if err := enricher.Enrich(ctx, vuln, params); err != nil { + t.Fatalf("Enrich failed: %v", err) + } + + ranges := vuln.GetAffected()[0].GetRanges() + if ranges[0].GetType() != tc.expectedType { + t.Errorf("Expected range type %v, got %v", tc.expectedType, ranges[0].GetType()) + } + }) + } +} diff --git a/go/internal/worker/pipeline/namenormalize/namenormalize.go b/go/internal/worker/pipeline/namenormalize/namenormalize.go new file mode 100644 index 00000000000..3245c46a38a --- /dev/null +++ b/go/internal/worker/pipeline/namenormalize/namenormalize.go @@ -0,0 +1,39 @@ +// Package namenormalize implements an enricher that normalizes package names in a vulnerability. +package namenormalize + +import ( + "context" + "log/slog" + + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/google/osv.dev/go/logger" + "github.com/google/osv.dev/go/osv/ecosystem" + "github.com/ossf/osv-schema/bindings/go/osvschema" +) + +type Enricher struct{} + +var _ pipeline.Enricher = (*Enricher)(nil) + +func (*Enricher) Enrich(ctx context.Context, vuln *osvschema.Vulnerability, params *pipeline.EnrichParams) error { + provider := params.EcosystemProvider + if provider == nil { + logger.WarnContext(ctx, "ecosystem provider is nil, using default", slog.String("vuln_id", vuln.GetId())) + provider = ecosystem.DefaultProvider + } + for _, affected := range vuln.GetAffected() { + pkg := affected.GetPackage() + ecosystemName := pkg.GetEcosystem() + if ecosystemName == "" { + continue + } + sys, ok := provider.Get(ecosystemName) + if !ok { + // Ecosystem not found - other enrichers can log better warnings about this. + continue + } + pkg.Name = ecosystem.NormalizePackageName(sys, pkg.GetName()) + } + + return nil +} diff --git a/go/internal/worker/pipeline/namenormalize/namenormalize_test.go b/go/internal/worker/pipeline/namenormalize/namenormalize_test.go new file mode 100644 index 00000000000..de659d427ae --- /dev/null +++ b/go/internal/worker/pipeline/namenormalize/namenormalize_test.go @@ -0,0 +1,61 @@ +package namenormalize + +import ( + "context" + "testing" + + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/google/osv.dev/go/osv/ecosystem" + "github.com/ossf/osv-schema/bindings/go/osvschema" +) + +func TestEnricher_Enrich(t *testing.T) { + enricher := &Enricher{} + ctx := context.Background() + + vuln := &osvschema.Vulnerability{ + Id: "TEST-123", + Affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "PyPI", + Name: "Flask", + }, + }, + { + Package: &osvschema.Package{ + Ecosystem: "PyPI", + Name: "A_B-C.D", + }, + }, + { + Package: &osvschema.Package{ + Ecosystem: "npm", + Name: "Flask", + }, + }, + }, + } + + params := &pipeline.EnrichParams{ + EcosystemProvider: ecosystem.DefaultProvider, + } + + if err := enricher.Enrich(ctx, vuln, params); err != nil { + t.Fatalf("Enrich failed: %v", err) + } + + affected := vuln.GetAffected() + + if affected[0].GetPackage().GetName() != "flask" { + t.Errorf("Expected flask, got %s", affected[0].GetPackage().GetName()) + } + + if affected[1].GetPackage().GetName() != "a-b-c-d" { + t.Errorf("Expected a-b-c-d, got %s", affected[1].GetPackage().GetName()) + } + + if affected[2].GetPackage().GetName() != "Flask" { + t.Errorf("Expected Flask, got %s", affected[2].GetPackage().GetName()) + } +} diff --git a/go/internal/worker/pipeline/published/published.go b/go/internal/worker/pipeline/published/published.go new file mode 100644 index 00000000000..b4cbe1585bd --- /dev/null +++ b/go/internal/worker/pipeline/published/published.go @@ -0,0 +1,30 @@ +// Package published implements an enricher that sets the published date if missing from the vulnerability. +package published + +import ( + "context" + + "github.com/ossf/osv-schema/bindings/go/osvschema" + + "github.com/google/osv.dev/go/internal/worker/pipeline" +) + +type Enricher struct{} + +var _ pipeline.Enricher = (*Enricher)(nil) + +func (*Enricher) Enrich(_ context.Context, vuln *osvschema.Vulnerability, params *pipeline.EnrichParams) error { + // published is set, nothing to do + if vuln.GetPublished() != nil { + return nil + } + // we have an existing vuln with a published date, carry it forward + if params.ExistingVuln != nil && params.ExistingVuln.GetPublished() != nil { + vuln.Published = params.ExistingVuln.GetPublished() + return nil + } + // Otherwise, set it to the raw modified date + vuln.Published = vuln.GetModified() + + return nil +} diff --git a/go/internal/worker/pipeline/published/published_test.go b/go/internal/worker/pipeline/published/published_test.go new file mode 100644 index 00000000000..6c540715709 --- /dev/null +++ b/go/internal/worker/pipeline/published/published_test.go @@ -0,0 +1,81 @@ +package published + +import ( + "context" + "testing" + + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/ossf/osv-schema/bindings/go/osvschema" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" +) + +func TestEnricher_Enrich(t *testing.T) { + enricher := &Enricher{} + ctx := context.Background() + + published1 := timestamppb.Now() + // create a slightly different timestamp for the existing one + published2 := ×tamppb.Timestamp{Seconds: published1.GetSeconds() + 100} + modified1 := ×tamppb.Timestamp{Seconds: published1.GetSeconds() + 200} + + tests := []struct { + name string + initialPublished *timestamppb.Timestamp + existingPublished *timestamppb.Timestamp + modified *timestamppb.Timestamp + expectedPublished *timestamppb.Timestamp + }{ + { + name: "Preserve existing published", + initialPublished: published1, + existingPublished: published2, + modified: modified1, + expectedPublished: published1, + }, + { + name: "Carry forward published from existing vuln", + initialPublished: nil, + existingPublished: published2, + modified: modified1, + expectedPublished: published2, + }, + { + name: "Default to modified if missing everywhere", + initialPublished: nil, + existingPublished: nil, + modified: modified1, + expectedPublished: modified1, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + vuln := &osvschema.Vulnerability{ + Id: "TEST-123", + Published: tc.initialPublished, + Modified: tc.modified, + } + + var existing *osvschema.Vulnerability + if tc.existingPublished != nil { + existing = &osvschema.Vulnerability{ + Id: "TEST-123", + Published: tc.existingPublished, + } + } + + params := &pipeline.EnrichParams{ + ExistingVuln: existing, + } + + if err := enricher.Enrich(ctx, vuln, params); err != nil { + t.Fatalf("Enrich failed: %v", err) + } + + if !proto.Equal(vuln.GetPublished(), tc.expectedPublished) { + t.Errorf("Expected published %v, got %v", tc.expectedPublished, vuln.GetPublished()) + } + }) + } +} diff --git a/go/internal/worker/pipeline/purl/purl.go b/go/internal/worker/pipeline/purl/purl.go new file mode 100644 index 00000000000..8fc4bfcafde --- /dev/null +++ b/go/internal/worker/pipeline/purl/purl.go @@ -0,0 +1,70 @@ +// Package purl implements an enricher that adds missing PURLs to affected packages, and cleans up some invalid PURLs. +package purl + +import ( + "context" + "log/slog" + + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/google/osv.dev/go/logger" + "github.com/google/osv.dev/go/purl" + "github.com/ossf/osv-schema/bindings/go/osvschema" + packageurl "github.com/package-url/packageurl-go" +) + +type Enricher struct{} + +var _ pipeline.Enricher = (*Enricher)(nil) + +func (*Enricher) Enrich(ctx context.Context, vuln *osvschema.Vulnerability, _ *pipeline.EnrichParams) error { + for _, affected := range vuln.GetAffected() { + pkg := affected.GetPackage() + if purlStr := pkg.GetPurl(); purlStr != "" { + pkgPURL, err := packageurl.FromString(purlStr) + if err == nil { + if pkgPURL.Version != "" { + logger.WarnContext(ctx, "package has purl with version, stripping", + slog.String("purl", purlStr), + slog.String("vuln_id", vuln.GetId()), + slog.String("ecosystem", pkg.GetEcosystem()), + slog.String("name", pkg.GetName()), + ) + pkgPURL.Version = "" + pkg.Purl = pkgPURL.ToString() + } + // PURL is valid, nothing to do. + continue + } + + // PURL is invalid, discard it + logger.ErrorContext(ctx, "package has invalid purl, discarding", + slog.String("purl", purlStr), + slog.String("vuln_id", vuln.GetId()), + slog.String("ecosystem", pkg.GetEcosystem()), + slog.String("name", pkg.GetName()), + slog.Any("error", err), + ) + pkg.Purl = "" + } + + // We require an ecosystem and a name to form a PURL + if pkg.GetEcosystem() == "" || pkg.GetName() == "" { + continue + } + + purlStr, err := purl.Generate(pkg.GetEcosystem(), pkg.GetName()) + if err != nil { + logger.WarnContext(ctx, "failed to generate purl", + slog.String("vuln_id", vuln.GetId()), + slog.String("ecosystem", pkg.GetEcosystem()), + slog.String("name", pkg.GetName()), + slog.Any("error", err), + ) + + continue + } + pkg.Purl = purlStr + } + + return nil +} diff --git a/go/internal/worker/pipeline/purl/purl_test.go b/go/internal/worker/pipeline/purl/purl_test.go new file mode 100644 index 00000000000..df702ece86d --- /dev/null +++ b/go/internal/worker/pipeline/purl/purl_test.go @@ -0,0 +1,91 @@ +package purl + +import ( + "context" + "testing" + + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/ossf/osv-schema/bindings/go/osvschema" +) + +func TestEnricher_Enrich(t *testing.T) { + enricher := &Enricher{} + ctx := context.Background() + + tests := []struct { + name string + ecosystem string + pkgName string + initialPurl string + expectedPurl string + }{ + { + name: "Generate PURL when missing", + ecosystem: "PyPI", + pkgName: "atomicwrites", + initialPurl: "", + expectedPurl: "pkg:pypi/atomicwrites", + }, + { + name: "Strip version from valid PURL", + ecosystem: "PyPI", + pkgName: "atomicwrites", + initialPurl: "pkg:pypi/atomicwrites@1.4.1", + expectedPurl: "pkg:pypi/atomicwrites", + }, + { + name: "Discard invalid PURL and regenerate", + ecosystem: "PyPI", + pkgName: "atomicwrites", + initialPurl: "invalid::purl!!!", + expectedPurl: "pkg:pypi/atomicwrites", + }, + { + name: "Generate Go PURL with namespace", + ecosystem: "Go", + pkgName: "github.com/gorilla/mux", + initialPurl: "", + expectedPurl: "pkg:golang/github.com/gorilla/mux", + }, + { + name: "Generate Maven PURL with group and artifact", + ecosystem: "Maven", + pkgName: "org.apache.commons:commons-lang3", + initialPurl: "", + expectedPurl: "pkg:maven/org.apache.commons/commons-lang3", + }, + { + name: "Generate Debian PURL with distro qualifier", + ecosystem: "Debian:11", + pkgName: "curl", + initialPurl: "", + expectedPurl: "pkg:deb/debian/curl?arch=source&distro=bullseye", + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + vuln := &osvschema.Vulnerability{ + Id: "TEST-123", + Affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: tc.ecosystem, + Name: tc.pkgName, + Purl: tc.initialPurl, + }, + }, + }, + } + + if err := enricher.Enrich(ctx, vuln, &pipeline.EnrichParams{}); err != nil { + t.Fatalf("Enrich failed: %v", err) + } + + affected := vuln.GetAffected()[0] + if affected.GetPackage().GetPurl() != tc.expectedPurl { + t.Errorf("Expected PURL %q, got %q", tc.expectedPurl, affected.GetPackage().GetPurl()) + } + }) + } +} diff --git a/go/internal/worker/pipeline/registry/registry.go b/go/internal/worker/pipeline/registry/registry.go index e71043840aa..41cc815e482 100644 --- a/go/internal/worker/pipeline/registry/registry.go +++ b/go/internal/worker/pipeline/registry/registry.go @@ -3,10 +3,26 @@ package registry import ( "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/google/osv.dev/go/internal/worker/pipeline/enumerateversions" + "github.com/google/osv.dev/go/internal/worker/pipeline/filterecosystem" + "github.com/google/osv.dev/go/internal/worker/pipeline/makesemver" + "github.com/google/osv.dev/go/internal/worker/pipeline/namenormalize" + "github.com/google/osv.dev/go/internal/worker/pipeline/published" + "github.com/google/osv.dev/go/internal/worker/pipeline/purl" + "github.com/google/osv.dev/go/internal/worker/pipeline/relations" + "github.com/google/osv.dev/go/internal/worker/pipeline/schemaversion" "github.com/google/osv.dev/go/internal/worker/pipeline/sourcelink" ) // List is the list of all enrichers used in the worker pipeline. var List = []pipeline.Enricher{ + &namenormalize.Enricher{}, + &filterecosystem.Enricher{}, + &makesemver.Enricher{}, + &enumerateversions.Enricher{}, + &schemaversion.Enricher{}, + &purl.Enricher{}, &sourcelink.Enricher{}, + &published.Enricher{}, + &relations.Enricher{}, } diff --git a/go/internal/worker/pipeline/relations/relations.go b/go/internal/worker/pipeline/relations/relations.go new file mode 100644 index 00000000000..9fb6dc998dd --- /dev/null +++ b/go/internal/worker/pipeline/relations/relations.go @@ -0,0 +1,57 @@ +// Package relations implements an enricher that populates computed alisases, related, and upstream ids. +package relations + +import ( + "context" + "errors" + "fmt" + + "github.com/ossf/osv-schema/bindings/go/osvschema" + "google.golang.org/protobuf/types/known/timestamppb" + + "github.com/google/osv.dev/go/internal/models" + "github.com/google/osv.dev/go/internal/worker/pipeline" +) + +type Enricher struct{} + +var _ pipeline.Enricher = (*Enricher)(nil) + +func (*Enricher) Enrich(ctx context.Context, vuln *osvschema.Vulnerability, params *pipeline.EnrichParams) error { + rs := params.RelationsStore + if rs == nil { + return errors.New("relations store not provided") + } + + aliases, err := rs.GetAliases(ctx, vuln.GetId()) + if err != nil && !errors.Is(err, models.ErrNotFound) { + return fmt.Errorf("failed getting aliases: %w", err) + } else if err == nil { + vuln.Aliases = aliases.Aliases + if vuln.GetModified().AsTime().Before(aliases.Modified) { + vuln.Modified = timestamppb.New(aliases.Modified) + } + } + + related, err := rs.GetRelated(ctx, vuln.GetId()) + if err != nil && !errors.Is(err, models.ErrNotFound) { + return fmt.Errorf("failed getting related: %w", err) + } else if err == nil { + vuln.Related = related.Related + if vuln.GetModified().AsTime().Before(related.Modified) { + vuln.Modified = timestamppb.New(related.Modified) + } + } + + upstream, err := rs.GetUpstream(ctx, vuln.GetId()) + if err != nil && !errors.Is(err, models.ErrNotFound) { + return fmt.Errorf("failed getting upstream: %w", err) + } else if err == nil { + vuln.Upstream = upstream.Upstream + if vuln.GetModified().AsTime().Before(upstream.Modified) { + vuln.Modified = timestamppb.New(upstream.Modified) + } + } + + return nil +} diff --git a/go/internal/worker/pipeline/relations/relations_test.go b/go/internal/worker/pipeline/relations/relations_test.go new file mode 100644 index 00000000000..d6e3bf371e2 --- /dev/null +++ b/go/internal/worker/pipeline/relations/relations_test.go @@ -0,0 +1,162 @@ +package relations + +import ( + "context" + "errors" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/osv.dev/go/internal/models" + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/ossf/osv-schema/bindings/go/osvschema" + "google.golang.org/protobuf/testing/protocmp" + "google.golang.org/protobuf/types/known/timestamppb" +) + +type mockRelationsStore struct { + aliases *models.GetAliasResult + related *models.GetRelatedResult + upstream *models.GetUpstreamResult + err error +} + +func (m *mockRelationsStore) GetAliases(_ context.Context, _ string) (*models.GetAliasResult, error) { + if m.err != nil { + return nil, m.err + } + if m.aliases == nil { + return nil, models.ErrNotFound + } + + return m.aliases, nil +} + +func (m *mockRelationsStore) GetRelated(_ context.Context, _ string) (*models.GetRelatedResult, error) { + if m.err != nil { + return nil, m.err + } + if m.related == nil { + return nil, models.ErrNotFound + } + + return m.related, nil +} + +func (m *mockRelationsStore) GetUpstream(_ context.Context, _ string) (*models.GetUpstreamResult, error) { + if m.err != nil { + return nil, m.err + } + if m.upstream == nil { + return nil, models.ErrNotFound + } + + return m.upstream, nil +} + +func TestEnricher_Enrich(t *testing.T) { + enricher := &Enricher{} + ctx := context.Background() + + now := time.Now().Truncate(time.Second) + earlier := now.Add(-1 * time.Hour) + later := now.Add(1 * time.Hour) + + tests := []struct { + name string + initialVuln *osvschema.Vulnerability + mockStore *mockRelationsStore + expectedVuln *osvschema.Vulnerability + expectedErr bool + }{ + { + name: "Populate all relations and update modified", + initialVuln: &osvschema.Vulnerability{ + Id: "TEST-123", + Modified: timestamppb.New(now), + }, + mockStore: &mockRelationsStore{ + aliases: &models.GetAliasResult{ + Aliases: []string{"ALIAS-1"}, + Modified: later, + }, + related: &models.GetRelatedResult{ + Related: []string{"RELATED-1"}, + Modified: now, // same, should not update modified + }, + upstream: &models.GetUpstreamResult{ + Upstream: []string{"UPSTREAM-1"}, + Modified: earlier, // earlier, should not update modified + }, + }, + expectedVuln: &osvschema.Vulnerability{ + Id: "TEST-123", + Aliases: []string{"ALIAS-1"}, + Related: []string{"RELATED-1"}, + Upstream: []string{"UPSTREAM-1"}, + Modified: timestamppb.New(later), + }, + expectedErr: false, + }, + { + name: "Relations not found (silent ignore)", + initialVuln: &osvschema.Vulnerability{ + Id: "TEST-123", + Modified: timestamppb.New(now), + }, + mockStore: &mockRelationsStore{}, // returns ErrNotFound for all + expectedVuln: &osvschema.Vulnerability{ + Id: "TEST-123", + Modified: timestamppb.New(now), + }, + expectedErr: false, + }, + { + name: "Store error propagates", + initialVuln: &osvschema.Vulnerability{ + Id: "TEST-123", + }, + mockStore: &mockRelationsStore{ + err: errors.New("DB error"), + }, + expectedVuln: &osvschema.Vulnerability{ + Id: "TEST-123", + }, + expectedErr: true, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + params := &pipeline.EnrichParams{ + RelationsStore: tc.mockStore, + } + + vuln := tc.initialVuln // in-place modification + + err := enricher.Enrich(ctx, vuln, params) + if (err != nil) != tc.expectedErr { + t.Fatalf("Enrich() error = %v, wantErr %v", err, tc.expectedErr) + } + + if tc.expectedErr { + return + } + + if diff := cmp.Diff(tc.expectedVuln, vuln, protocmp.Transform()); diff != "" { + t.Errorf("Vulnerability mismatch (-want +got):\n%s", diff) + } + }) + } +} + +func TestEnricher_Enrich_NilStore(t *testing.T) { + enricher := &Enricher{} + ctx := context.Background() + vuln := &osvschema.Vulnerability{Id: "TEST-123"} + + err := enricher.Enrich(ctx, vuln, &pipeline.EnrichParams{RelationsStore: nil}) + if err == nil || err.Error() != "relations store not provided" { + t.Errorf("Expected 'relations store not provided' error, got %v", err) + } +} diff --git a/go/internal/worker/pipeline/schemaversion/schemaversion.go b/go/internal/worker/pipeline/schemaversion/schemaversion.go new file mode 100644 index 00000000000..d56f1e92a56 --- /dev/null +++ b/go/internal/worker/pipeline/schemaversion/schemaversion.go @@ -0,0 +1,22 @@ +// Package schemaversion implements an enricher that sets the schema_version to the latest for the vulnerability. +package schemaversion + +import ( + "context" + + "github.com/ossf/osv-schema/bindings/go/osvconstants" + "github.com/ossf/osv-schema/bindings/go/osvschema" + + "github.com/google/osv.dev/go/internal/worker/pipeline" +) + +type Enricher struct{} + +var _ pipeline.Enricher = (*Enricher)(nil) + +func (*Enricher) Enrich(_ context.Context, vuln *osvschema.Vulnerability, _ *pipeline.EnrichParams) error { + // TODO(michaelkedar): we've had problems with this not staying up-to-date in the past + vuln.SchemaVersion = osvconstants.SchemaVersion + + return nil +} diff --git a/go/internal/worker/pipeline/schemaversion/schemaversion_test.go b/go/internal/worker/pipeline/schemaversion/schemaversion_test.go new file mode 100644 index 00000000000..4278a556ba9 --- /dev/null +++ b/go/internal/worker/pipeline/schemaversion/schemaversion_test.go @@ -0,0 +1,28 @@ +package schemaversion + +import ( + "context" + "testing" + + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/ossf/osv-schema/bindings/go/osvconstants" + "github.com/ossf/osv-schema/bindings/go/osvschema" +) + +func TestEnricher_Enrich(t *testing.T) { + enricher := &Enricher{} + ctx := context.Background() + + vuln := &osvschema.Vulnerability{ + Id: "TEST-123", + SchemaVersion: "1.0.0", + } + + if err := enricher.Enrich(ctx, vuln, &pipeline.EnrichParams{}); err != nil { + t.Fatalf("Enrich failed: %v", err) + } + + if vuln.GetSchemaVersion() != osvconstants.SchemaVersion { + t.Errorf("Expected schema_version %s, got %s", osvconstants.SchemaVersion, vuln.GetSchemaVersion()) + } +} diff --git a/go/internal/worker/pipeline/sourcelink/sourcelink_test.go b/go/internal/worker/pipeline/sourcelink/sourcelink_test.go new file mode 100644 index 00000000000..bf872c66a23 --- /dev/null +++ b/go/internal/worker/pipeline/sourcelink/sourcelink_test.go @@ -0,0 +1,85 @@ +package sourcelink + +import ( + "context" + "testing" + + "github.com/google/osv.dev/go/internal/models" + "github.com/google/osv.dev/go/internal/worker/pipeline" + "github.com/ossf/osv-schema/bindings/go/osvschema" +) + +func TestEnricher_Enrich(t *testing.T) { + enricher := &Enricher{} + ctx := context.Background() + + vuln := &osvschema.Vulnerability{ + Id: "TEST-123", + Affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "PyPI", + Name: "flask", + }, + }, + }, + } + + params := &pipeline.EnrichParams{ + PathInSource: "/vulns/TEST-123.json", + SourceRepo: &models.SourceRepository{ + Link: "https://github.com/example/repo", + }, + } + + if err := enricher.Enrich(ctx, vuln, params); err != nil { + t.Fatalf("Enrich failed: %v", err) + } + + affected := vuln.GetAffected() + dbSpecific := affected[0].GetDatabaseSpecific() + if dbSpecific == nil { + t.Fatalf("Expected DatabaseSpecific to be populated, got nil") + } + + sourceVal, ok := dbSpecific.GetFields()["source"] + if !ok { + t.Fatalf("Expected 'source' field in DatabaseSpecific, but not found") + } + + expectedLink := "https://github.com/example/repo/vulns/TEST-123.json" + if sourceVal.GetStringValue() != expectedLink { + t.Errorf("Expected source %q, got %q", expectedLink, sourceVal.GetStringValue()) + } +} + +func TestEnricher_Enrich_NoSourceRepo(t *testing.T) { + enricher := &Enricher{} + ctx := context.Background() + + vuln := &osvschema.Vulnerability{ + Id: "TEST-123", + Affected: []*osvschema.Affected{ + { + Package: &osvschema.Package{ + Ecosystem: "PyPI", + Name: "flask", + }, + }, + }, + } + + params := &pipeline.EnrichParams{ + PathInSource: "/vulns/TEST-123.json", + SourceRepo: nil, + } + + if err := enricher.Enrich(ctx, vuln, params); err != nil { + t.Fatalf("Enrich failed: %v", err) + } + + affected := vuln.GetAffected() + if affected[0].GetDatabaseSpecific() != nil { + t.Errorf("Expected DatabaseSpecific to be nil, got %v", affected[0].GetDatabaseSpecific()) + } +} diff --git a/go/internal/worker/testdata/OSV-123.yaml b/go/internal/worker/testdata/OSV-123.yaml new file mode 100644 index 00000000000..0d93ff864ce --- /dev/null +++ b/go/internal/worker/testdata/OSV-123.yaml @@ -0,0 +1,30 @@ +id: OSV-123 +summary: A vulnerability +details: | + Blah blah blah + Blah +severity: +- type: CVSS_V3 + score: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L +credits: +- name: Foo bar + contact: + - mailto:foo@bar.com +references: +- type: WEB + url: https://ref.com/ref +affected: +- package: + name: blah.com/package + ecosystem: Go + ranges: + - type: GIT + repo: https://osv-test/repo/url + events: + - introduced: eefe8ec3f1f90d0e684890e810f3f21e8500a4cd + - fixed: 8d8242f545e9cec3e6d0d2e3f5bde8be1c659735 + versions: + - branch-v0.1.1 +database_specific: + specific: 1337 +modified: '2020-01-01T00:00:00Z' \ No newline at end of file diff --git a/go/internal/worker/worker.go b/go/internal/worker/worker.go index f109d80c6ab..068c3e4e08f 100644 --- a/go/internal/worker/worker.go +++ b/go/internal/worker/worker.go @@ -33,5 +33,6 @@ type Task struct { type Stores struct { SourceRepo models.SourceRepositoryStore Vulnerability models.VulnerabilityStore + Relations models.RelationsStore PyPIPublisher clients.Publisher } diff --git a/go/osv/ecosystem/echo.go b/go/osv/ecosystem/echo.go index 644357e356c..49187529482 100644 --- a/go/osv/ecosystem/echo.go +++ b/go/osv/ecosystem/echo.go @@ -34,3 +34,14 @@ func echoFactory(p *Provider, suffix string) Ecosystem { return echoEcosystem{Ecosystem: dpkgEcosystem{}} } + +func (e echoEcosystem) NormalizePackageName(name string) string { + // We want to apply the normalization of the inner ecosystem. + if norm, ok := e.Ecosystem.(PackageNameNormalizer); ok { + return norm.NormalizePackageName(name) + } + + return name +} + +var _ PackageNameNormalizer = echoEcosystem{} diff --git a/go/osv/ecosystem/ecosystem.go b/go/osv/ecosystem/ecosystem.go index 5046f66d273..76b22abe57f 100644 --- a/go/osv/ecosystem/ecosystem.go +++ b/go/osv/ecosystem/ecosystem.go @@ -145,3 +145,25 @@ type Enumerable interface { // The versions should be sorted in ascending order. GetVersions(_ string) ([]string, error) } + +// PackageNameNormalizer is an ecosystem that can normalize its package names. +type PackageNameNormalizer interface { + NormalizePackageName(_ string) string +} + +// NormalizePackageName normalizes the package name for the given ecosystem. +func NormalizePackageName(ecosystem Ecosystem, name string) string { + inner := ecosystem + switch w := ecosystem.(type) { + case *ecosystemWrapper: + inner = w.Ecosystem + case *enumerableWrapper: + inner = w.Enumerable + } + + if normalizer, ok := inner.(PackageNameNormalizer); ok { + return normalizer.NormalizePackageName(name) + } + + return name +} diff --git a/go/osv/ecosystem/pypi.go b/go/osv/ecosystem/pypi.go index 54014cea3cb..46188e74a93 100644 --- a/go/osv/ecosystem/pypi.go +++ b/go/osv/ecosystem/pypi.go @@ -92,3 +92,11 @@ func (e pypiEcosystem) GetVersions(pkg string) ([]string, error) { return sortVersions(e, versions) } + +var pypiNormalizeRegex = regexp.MustCompile(`[-_.]+`) + +func (e pypiEcosystem) NormalizePackageName(name string) string { + return strings.ToLower(pypiNormalizeRegex.ReplaceAllString(name, "-")) +} + +var _ PackageNameNormalizer = pypiEcosystem{} diff --git a/go/osv/ecosystem/wrapper_test.go b/go/osv/ecosystem/wrapper_test.go index 03f6f2de36f..6a4bd88103d 100644 --- a/go/osv/ecosystem/wrapper_test.go +++ b/go/osv/ecosystem/wrapper_test.go @@ -53,3 +53,30 @@ func TestZeroVersion(t *testing.T) { } } } + +func TestNormalizePackageName(t *testing.T) { + tests := []struct { + ecosystem string + name string + expected string + }{ + {"PyPI", "Flask", "flask"}, + {"PyPI", "flask", "flask"}, + {"PyPI", "A_B-C.D", "a-b-c-d"}, + {"PyPI", "A_._B", "a-b"}, + {"npm", "Flask", "Flask"}, // No normalization + } + + p := NewProvider(nil) + for _, test := range tests { + e, ok := p.Get(test.ecosystem) + if !ok { + t.Fatalf("%s ecosystem not found", test.ecosystem) + } + + actual := NormalizePackageName(e, test.name) + if actual != test.expected { + t.Errorf("NormalizePackageName(%s, %q) = %q, expected %q", test.ecosystem, test.name, actual, test.expected) + } + } +}