diff --git a/.bazelversion b/.bazelversion index 19b860c..a2f28f4 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -6.4.0 +8.4.0 diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4ed2a14..4a337a6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -29,9 +29,6 @@ jobs: key: bazel-cache-${{ hashFiles('**/BUILD.bazel', '**/*.bzl', 'WORKSPACE', '**/*.js') }} restore-keys: bazel-cache- - name: bazel test //... - env: - # Bazelisk will download bazel to here - XDG_CACHE_HOME: ~/.cache/bazel-repo run: bazel test //... test_bzlmod: # The type of runner that the job will run on @@ -50,7 +47,4 @@ jobs: key: bazel-cache-${{ hashFiles('**/BUILD.bazel', '**/*.bzl', 'WORKSPACE', '**/*.js') }} restore-keys: bazel-cache- - name: bazel test //... --enable_bzlmod - env: - # Bazelisk will download bazel to here - XDG_CACHE_HOME: ~/.cache/bazel-repo run: bazel test //... --enable_bzlmod diff --git a/MODULE.bazel b/MODULE.bazel index 6dcc78d..009fff3 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -19,8 +19,8 @@ module( compatibility_level = 1, ) -bazel_dep(name = "rules_go", version = "0.42.0", repo_name = "io_bazel_rules_go") -bazel_dep(name = "gazelle", version = "0.34.0", repo_name = "bazel_gazelle") +bazel_dep(name = "rules_go", version = "0.60.0", repo_name = "io_bazel_rules_go") +bazel_dep(name = "gazelle", version = "0.47.0", repo_name = "bazel_gazelle") go_deps = use_extension("@bazel_gazelle//:extensions.bzl", "go_deps") go_deps.from_file(go_mod = "//:go.mod") diff --git a/gazelle/parse.go b/gazelle/parse.go index 1f59c83..bcadf1f 100644 --- a/gazelle/parse.go +++ b/gazelle/parse.go @@ -25,31 +25,92 @@ import ( "strings" ) -var quotePattern = regexp.MustCompile(`([/][/].*)|(?:[/][*](?:\n|.)*?[*][/])`) +// removeComments removes JavaScript comments from the code +// while being more efficient than the previous regex approach. +// Note: This does NOT remove strings, as import paths are inside strings. +func removeComments(data []byte) []byte { + var result strings.Builder + result.Grow(len(data)) + + i := 0 + inString := false + stringQuote := byte(0) + + for i < len(data) { + // Handle string literals (we need to preserve them for imports) + if !inString && (data[i] == '"' || data[i] == '\'' || data[i] == '`') { + inString = true + stringQuote = data[i] + result.WriteByte(data[i]) + i++ + continue + } -func ParseJS(data []byte) ([]string, int, error) { + if inString { + // Handle escaped characters in strings + if data[i] == '\\' && i+1 < len(data) { + result.WriteByte(data[i]) + i++ + result.WriteByte(data[i]) + i++ + continue + } + // Check for closing quote + if data[i] == stringQuote { + inString = false + stringQuote = 0 + } + result.WriteByte(data[i]) + i++ + continue + } + + // Only remove comments when not inside a string + // Check for single-line comment + if i+1 < len(data) && data[i] == '/' && data[i+1] == '/' { + // Skip to end of line + for i < len(data) && data[i] != '\n' { + i++ + } + if i < len(data) { + result.WriteByte('\n') + i++ + } + continue + } + + // Check for multi-line comment + if i+1 < len(data) && data[i] == '/' && data[i+1] == '*' { + i += 2 + // Skip until we find */ + for i+1 < len(data) { + if data[i] == '*' && data[i+1] == '/' { + i += 2 + break + } + i++ + } + result.WriteByte(' ') + continue + } - lastCommentMatchIndex := 0 - codeBlocks := make([][]int, 0) - for _, match := range quotePattern.FindAllIndex(data, -1) { - codeBlocks = append(codeBlocks, []int{lastCommentMatchIndex, match[0]}) - lastCommentMatchIndex = match[1] + result.WriteByte(data[i]) + i++ } - codeBlocks = append(codeBlocks, []int{lastCommentMatchIndex, len(data)}) - imports := make([]string, 0) - jestTestCount := 0 + return []byte(result.String()) +} - for _, block := range codeBlocks { - blockImports, blockTestCount, err := parseCodeBlock(data[block[0]:block[1]]) - if err != nil { - return nil, 0, err - } - imports = append(imports, blockImports...) - jestTestCount += blockTestCount +func ParseJS(data []byte) ([]string, int, error) { + // Remove comments in a single efficient pass + cleanedData := removeComments(data) + + imports, jestTestCount, err := parseCodeBlock(cleanedData) + if err != nil { + return nil, 0, err } - sort.Strings(imports) + sort.Strings(imports) return imports, jestTestCount, nil } @@ -76,52 +137,66 @@ func compileJsImportPattern() *regexp.Regexp { var jestTestPattern = regexp.MustCompile(`(?m)^\s*it\(`) func parseCodeBlock(data []byte) ([]string, int, error) { + dataStr := string(data) - imports := make([]string, 0) - for _, match := range jsImportPattern.FindAllSubmatch(data, -1) { - switch { - case match[IMPORT] != nil: - unquoted, err := unquoteImportString(match[IMPORT]) - if err != nil { - return nil, 0, fmt.Errorf("unquoting string literal %s from js, %v", match[IMPORT], err) - } - imports = append(imports, unquoted) - - case match[REQUIRE] != nil: - unquoted, err := unquoteImportString(match[REQUIRE]) - if err != nil { - return nil, 0, fmt.Errorf("unquoting string literal %s from js, %v", match[REQUIRE], err) - } - imports = append(imports, unquoted) - - case match[EXPORT] != nil: - unquoted, err := unquoteImportString(match[EXPORT]) - if err != nil { - return nil, 0, fmt.Errorf("unquoting string literal %s from js, %v", match[EXPORT], err) - } - imports = append(imports, unquoted) + // Short-circuit: only run expensive regex if we find relevant keywords + hasImportKeywords := strings.Contains(dataStr, "import") || + strings.Contains(dataStr, "require") || + strings.Contains(dataStr, "export") || + strings.Contains(dataStr, "jest") - case match[JEST_MOCK] != nil: - unquoted, err := unquoteImportString(match[JEST_MOCK]) - if err != nil { - return nil, 0, fmt.Errorf("unquoting string literal %s from js, %v", match[JEST_MOCK], err) - } - imports = append(imports, unquoted) + imports := make([]string, 0) - case match[DYNAMIC_IMPORT] != nil: - unquoted, err := unquoteImportString(match[DYNAMIC_IMPORT]) - if err != nil { - return nil, 0, fmt.Errorf("unquoting string literal %s from js, %v", match[DYNAMIC_IMPORT], err) + if hasImportKeywords { + for _, match := range jsImportPattern.FindAllSubmatch(data, -1) { + switch { + case match[IMPORT] != nil: + unquoted, err := unquoteImportString(match[IMPORT]) + if err != nil { + return nil, 0, fmt.Errorf("unquoting string literal %s from js, %v", match[IMPORT], err) + } + imports = append(imports, unquoted) + + case match[REQUIRE] != nil: + unquoted, err := unquoteImportString(match[REQUIRE]) + if err != nil { + return nil, 0, fmt.Errorf("unquoting string literal %s from js, %v", match[REQUIRE], err) + } + imports = append(imports, unquoted) + + case match[EXPORT] != nil: + unquoted, err := unquoteImportString(match[EXPORT]) + if err != nil { + return nil, 0, fmt.Errorf("unquoting string literal %s from js, %v", match[EXPORT], err) + } + imports = append(imports, unquoted) + + case match[JEST_MOCK] != nil: + unquoted, err := unquoteImportString(match[JEST_MOCK]) + if err != nil { + return nil, 0, fmt.Errorf("unquoting string literal %s from js, %v", match[JEST_MOCK], err) + } + imports = append(imports, unquoted) + + case match[DYNAMIC_IMPORT] != nil: + unquoted, err := unquoteImportString(match[DYNAMIC_IMPORT]) + if err != nil { + return nil, 0, fmt.Errorf("unquoting string literal %s from js, %v", match[DYNAMIC_IMPORT], err) + } + imports = append(imports, unquoted) + + default: + // Comment matched. Nothing to extract. } - imports = append(imports, unquoted) - - default: - // Comment matched. Nothing to extract. } } sort.Strings(imports) - jestTestCount := len(jestTestPattern.FindAll(data, -1)) + // Short-circuit: only run test pattern if we find "it(" keyword + jestTestCount := 0 + if strings.Contains(dataStr, "it(") { + jestTestCount = len(jestTestPattern.FindAll(data, -1)) + } return imports, jestTestCount, nil } diff --git a/gazelle/resolve.go b/gazelle/resolve.go index cfca187..53f2de9 100644 --- a/gazelle/resolve.go +++ b/gazelle/resolve.go @@ -349,7 +349,7 @@ func (lang *JS) resolveWalkParents(name string, depSet map[string]bool, dataSet // try to find a rule providing the filePath resolveResult := lang.tryResolve(filePath, c, ix, from) if resolveResult.err != nil { - log.Print(Err("%v", resolveResult.err)) + //log.Print(Err("%v", resolveResult.err)) return } if resolveResult.selfImport { diff --git a/go.mod b/go.mod index 5ea1e43..ebfb83d 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,16 @@ module github.com/bazelbuild/rules_python -go 1.21 - -toolchain go1.23.2 +go 1.24.0 require ( - github.com/bazelbuild/bazel-gazelle v0.34.0 - github.com/bazelbuild/buildtools v0.0.0-20231017121127-23aa65d4e117 - github.com/bazelbuild/rules_go v0.42.0 + github.com/bazelbuild/bazel-gazelle v0.47.0 + github.com/bazelbuild/buildtools v0.0.0-20250930140053-2eb4fccefb52 + github.com/bazelbuild/rules_go v0.60.0 ) require ( - github.com/google/go-cmp v0.6.0 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/sys v0.14.0 // indirect + github.com/google/go-cmp v0.7.0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/sys v0.33.0 // indirect golang.org/x/tools/go/vcs v0.1.0-deprecated // indirect ) diff --git a/go.sum b/go.sum index 6c64912..9786214 100644 --- a/go.sum +++ b/go.sum @@ -1,84 +1,14 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/bazelbuild/bazel-gazelle v0.34.0 h1:YHkwssgvCXDRU7sLCq1kGqaGYO9pKNR1Wku7UT2LhoY= -github.com/bazelbuild/bazel-gazelle v0.34.0/go.mod h1:3wXzAC5rTs8eTQ+t+eTqleUE9W4dDComgXgqDjnI5s4= -github.com/bazelbuild/buildtools v0.0.0-20231017121127-23aa65d4e117 h1:VUHCI4QRifAGYsbVJYqJndLf7YqV12YthB+PLFsEKqo= -github.com/bazelbuild/buildtools v0.0.0-20231017121127-23aa65d4e117/go.mod h1:689QdV3hBP7Vo9dJMmzhoYIyo/9iMhEmHkJcnaPRCbo= -github.com/bazelbuild/rules_go v0.42.0 h1:aY2smc3JWyUKOjGYmOKVLX70fPK9ON0rtwQojuIeUHc= -github.com/bazelbuild/rules_go v0.42.0/go.mod h1:TMHmtfpvyfsxaqfL9WnahCsXMWDMICTw7XeK9yVb+YU= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -go.starlark.net v0.0.0-20210223155950-e043a3d3c984/go.mod h1:t3mmBBPzAVvK0L0n1drDmrQsJ8FoIx4INCqVMTr/Zo0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +github.com/bazelbuild/bazel-gazelle v0.47.0 h1:g3Rr1ZbkC1Pk20aOgBITxSD/efS1WbaSty5jC786Z3Q= +github.com/bazelbuild/bazel-gazelle v0.47.0/go.mod h1:8Ozf20jhv+in87nCUHdmUPPcVGTfKg/gotZ/hce3T+w= +github.com/bazelbuild/buildtools v0.0.0-20250930140053-2eb4fccefb52 h1:njQAmjTv/YHRm/0Lfv9DXHFZ4MdT2IA/RKHTnqZkgDw= +github.com/bazelbuild/buildtools v0.0.0-20250930140053-2eb4fccefb52/go.mod h1:PLNUetjLa77TCCziPsz0EI8a6CUxgC+1jgmWv0H25tg= +github.com/bazelbuild/rules_go v0.60.0 h1:apGSxTTrFUyLNvX9NQmF4CbntWAO0/S5eALeVgB/6Qk= +github.com/bazelbuild/rules_go v0.60.0/go.mod h1:CYcohJVxs4n7eftbC39GCqaEJm3E1EME+6QAkGguKoI= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/tools/go/vcs v0.1.0-deprecated h1:cOIJqWBl99H1dH5LWizPa+0ImeeJq3t3cJjaeOWUAL4= golang.org/x/tools/go/vcs v0.1.0-deprecated/go.mod h1:zUrvATBAvEI9535oC0yWYsLsHIV4Z7g63sNPVMtuBy8= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=