├── go.mod ├── .golangci.yml ├── .github └── workflows │ ├── codecov.yml │ ├── golangci-lint.yml │ ├── test.yml │ └── codeql.yml ├── example_test.go ├── LICENSE ├── uuid.go ├── README.md ├── uuid_test.go └── go.sum /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/citilinkru/uuid-msgpack 2 | 3 | go 1.13 4 | 5 | require ( 6 | github.com/golang/protobuf v1.5.2 // indirect 7 | github.com/google/uuid v1.3.0 8 | github.com/stretchr/testify v1.7.0 9 | golang.org/x/net v0.7.0 // indirect 10 | google.golang.org/appengine v1.6.7 // indirect 11 | google.golang.org/protobuf v1.28.1 // indirect 12 | gopkg.in/vmihailenco/msgpack.v2 v2.9.2 13 | ) 14 | -------------------------------------------------------------------------------- /.golangci.yml: -------------------------------------------------------------------------------- 1 | run: 2 | timeout: 5m 3 | modules-download-mode: vendor 4 | skip-files: 5 | - '.*_test.go' 6 | 7 | linters: 8 | enable: 9 | - prealloc 10 | - dogsled 11 | - exportloopref 12 | - unconvert 13 | - unparam 14 | - whitespace 15 | - bodyclose 16 | - gosec 17 | - asciicheck 18 | - depguard 19 | - errorlint 20 | - goconst 21 | - gocritic 22 | -------------------------------------------------------------------------------- /.github/workflows/codecov.yml: -------------------------------------------------------------------------------- 1 | name: Test and coverage 2 | on: [push, pull_request] 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - uses: actions/checkout@v2 8 | with: 9 | fetch-depth: 2 10 | - uses: actions/setup-go@v2 11 | with: 12 | go-version: '1.13' 13 | - name: Run coverage 14 | run: go test -race -coverprofile=coverage.txt -covermode=atomic 15 | - name: Upload coverage to Codecov 16 | run: bash <(curl -s https://codecov.io/bash) -------------------------------------------------------------------------------- /.github/workflows/golangci-lint.yml: -------------------------------------------------------------------------------- 1 | name: golangci-lint 2 | on: 3 | push: 4 | pull_request: 5 | workflow_dispatch: 6 | jobs: 7 | golangci: 8 | strategy: 9 | matrix: 10 | go-version: [1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19] 11 | name: lint 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v2 15 | - uses: actions/setup-go@v2 16 | with: 17 | go-version: ${{ matrix.go-version }} 18 | - run: go mod vendor 19 | - name: golangci-lint 20 | uses: golangci/golangci-lint-action@v2 21 | with: 22 | version: v1.50.1 23 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | on: 3 | push: 4 | pull_request: 5 | workflow_dispatch: 6 | jobs: 7 | test: 8 | strategy: 9 | matrix: 10 | go-version: [1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19] 11 | name: test 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: checkout 15 | uses: actions/checkout@v2 16 | - uses: actions/setup-go@v2 17 | with: 18 | go-version: ${{ matrix.go-version }} 19 | - name: run tests 20 | run: go test -json ./... > test.json 21 | - name: Annotate tests 22 | if: always() 23 | uses: guyarb/golang-test-annotations@v0.3.0 24 | with: 25 | test-results: test.json -------------------------------------------------------------------------------- /example_test.go: -------------------------------------------------------------------------------- 1 | package uuidmsgpack 2 | 3 | import ( 4 | "bytes" 5 | "fmt" 6 | "github.com/google/uuid" 7 | "gopkg.in/vmihailenco/msgpack.v2" 8 | "os" 9 | ) 10 | 11 | func ExampleInit() { 12 | id := uuid.New() 13 | buf := bytes.NewBuffer(nil) 14 | encoder := msgpack.NewEncoder(buf) 15 | err := encoder.Encode(id) 16 | if err != nil { 17 | fmt.Printf("can't encode uuid: %s", err) 18 | os.Exit(1) 19 | } 20 | reader := bytes.NewReader(buf.Bytes()) 21 | decoder := msgpack.NewDecoder(reader) 22 | var decodedId uuid.UUID 23 | err = decoder.Decode(&decodedId) 24 | if err != nil { 25 | fmt.Printf("can't decode uuid: %s", err) 26 | os.Exit(1) 27 | } 28 | 29 | fmt.Printf("original id is equal to decoded: %t", id.String() == decodedId.String()) 30 | 31 | // Output: original id is equal to decoded: true 32 | } 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Citilink LLC 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /uuid.go: -------------------------------------------------------------------------------- 1 | // Package uuidmsgpack register msgpack encoder/decoder for uuid lib 2 | // 3 | // Just import that package in your main and you can encode/decode like any struct 4 | package uuidmsgpack 5 | 6 | import ( 7 | "fmt" 8 | "github.com/google/uuid" 9 | "gopkg.in/vmihailenco/msgpack.v2" 10 | "gopkg.in/vmihailenco/msgpack.v2/codes" 11 | "reflect" 12 | ) 13 | 14 | // extension id 15 | const extId = 2 16 | 17 | // bytes count to read to start decode 18 | const decodeBytesCount = 18 19 | 20 | func init() { 21 | msgpack.Register(reflect.TypeOf((*uuid.UUID)(nil)).Elem(), 22 | func(e *msgpack.Encoder, v reflect.Value) error { 23 | id := v.Interface().(uuid.UUID) 24 | bytes, err := id.MarshalBinary() 25 | if err != nil { 26 | return fmt.Errorf("can't marshal binary uuid: %w", err) 27 | } 28 | _, err = e.Writer().Write(bytes) 29 | if err != nil { 30 | return fmt.Errorf("can't write bytes to writer: %w", err) 31 | } 32 | 33 | return nil 34 | }, 35 | func(d *msgpack.Decoder, v reflect.Value) error { 36 | bytes := make([]byte, decodeBytesCount) 37 | n, err := d.Buffered().Read(bytes) 38 | if err != nil { 39 | return fmt.Errorf("can't read bytes: %w", err) 40 | } 41 | if n < decodeBytesCount { 42 | return fmt.Errorf("invalid bytes count %d instead of %d", n, decodeBytesCount) 43 | } 44 | 45 | if bytes[0] != codes.FixExt16 { 46 | return fmt.Errorf("wrong ext len '%d'", bytes[0]) 47 | } 48 | 49 | if bytes[1] != extId { 50 | return fmt.Errorf("wrong ext id '%d'", bytes[1]) 51 | } 52 | 53 | id, err := uuid.FromBytes(bytes[2:18]) 54 | if err != nil { 55 | return fmt.Errorf("can't create uuid from bytes: %w", err) 56 | } 57 | 58 | v.Set(reflect.ValueOf(id)) 59 | return nil 60 | }, 61 | ) 62 | msgpack.RegisterExt(extId, (*uuid.UUID)(nil)) 63 | } 64 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # UUID msgpack 2 | 3 | ![Lint](https://github.com/citilinkru/uuid-msgpack/actions/workflows/golangci-lint.yml/badge.svg?branch=master) 4 | ![Tests](https://github.com/citilinkru/uuid-msgpack/actions/workflows/test.yml/badge.svg?branch=master) 5 | [![codecov](https://codecov.io/gh/citilinkru/uuid-msgpack/branch/master/graph/badge.svg)](https://codecov.io/gh/citilinkru/uuid-msgpack) 6 | [![Go Report Card](https://goreportcard.com/badge/github.com/citilinkru/uuid-msgpack)](https://goreportcard.com/report/github.com/citilinkru/uuid-msgpack) 7 | [![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/citilinkru/uuid-msgpack/blob/master/LICENSE) 8 | [![GoDoc](https://godoc.org/github.com/citilinkru/uuid-msgpack?status.svg)](https://godoc.org/github.com/citilinkru/uuid-msgpack) 9 | [![Release](https://img.shields.io/github/release/citilinkru/uuid-msgpack.svg?style=flat-square)](https://github.com/citilinkru/uuid-msgpack/releases/latest) 10 | 11 | Library to integrate github.com/google/uuid with gopkg.in/vmihailenco/msgpack 12 | 13 | 14 | Installation 15 | ------------ 16 | go get github.com/citilinkru/uuid-msgpack 17 | 18 | Example 19 | ------- 20 | ```go 21 | package main 22 | 23 | import ( 24 | _ "github.com/citilinkru/uuid-msgpack" // This blank import is required to register encoder/decoder! 25 | "github.com/google/uuid" 26 | "log" 27 | "bytes" 28 | "gopkg.in/vmihailenco/msgpack.v2" 29 | ) 30 | 31 | func main() { 32 | id := uuid.New() 33 | buf := bytes.NewBuffer(nil) 34 | encoder := msgpack.NewEncoder(buf) 35 | err := encoder.Encode(id) 36 | if err != nil { 37 | log.Fatalf("can't encode uuid: %s", err) 38 | } 39 | reader := bytes.NewReader(buf.Bytes()) 40 | decoder := msgpack.NewDecoder(reader) 41 | var decodedId uuid.UUID 42 | err = decoder.Decode(&decodedId) 43 | if err != nil { 44 | log.Fatalf("can't decode uuid: %s", err) 45 | } 46 | 47 | if id.String() == decodedId.String() { 48 | log.Printf("original id is equal to decoded '%s'\n", id) 49 | } else { 50 | log.Printf("decoded id '%s' is not equal to origin '%s'\n", id, decodedId) 51 | } 52 | 53 | log.Println("done") 54 | } 55 | ``` 56 | 57 | Testing 58 | ----------- 59 | Unit-tests: 60 | ```bash 61 | go test -v -race ./... 62 | ``` 63 | 64 | Run linter: 65 | ```bash 66 | go mod vendor \ 67 | && docker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:v1.40 golangci-lint run -v \ 68 | && rm -R vendor 69 | ``` 70 | 71 | CONTRIBUTE 72 | ----------- 73 | * write code 74 | * run `go fmt ./...` 75 | * run all linters and tests (see above) 76 | * create a PR describing the changes 77 | 78 | LICENSE 79 | ----------- 80 | MIT 81 | 82 | AUTHOR 83 | ----------- 84 | Nikita Sapogov -------------------------------------------------------------------------------- /uuid_test.go: -------------------------------------------------------------------------------- 1 | package uuidmsgpack 2 | 3 | import ( 4 | "bytes" 5 | "github.com/google/uuid" 6 | "github.com/stretchr/testify/assert" 7 | "gopkg.in/vmihailenco/msgpack.v2" 8 | "gopkg.in/vmihailenco/msgpack.v2/codes" 9 | "testing" 10 | ) 11 | 12 | func TestEncodeDecode(t *testing.T) { 13 | id := uuid.New() 14 | buf := bytes.NewBuffer(nil) 15 | encoder := msgpack.NewEncoder(buf) 16 | err := encoder.Encode(id) 17 | if err != nil { 18 | assert.NoError(t, err) 19 | } 20 | reader := bytes.NewReader(buf.Bytes()) 21 | decoder := msgpack.NewDecoder(reader) 22 | var decodedId uuid.UUID 23 | err = decoder.Decode(&decodedId) 24 | assert.NoError(t, err) 25 | assert.Equal(t, id.String(), decodedId.String()) 26 | } 27 | 28 | type customStruct struct { 29 | a int 30 | Uuid uuid.UUID 31 | b string 32 | } 33 | 34 | func TestEncodeDecodeCustomStruct(t *testing.T) { 35 | obj := customStruct{Uuid: uuid.New(), a: 1, b: "adsa"} 36 | buf := bytes.NewBuffer(nil) 37 | encoder := msgpack.NewEncoder(buf) 38 | err := encoder.Encode(obj) 39 | if err != nil { 40 | assert.NoError(t, err) 41 | } 42 | reader := bytes.NewReader(buf.Bytes()) 43 | decoder := msgpack.NewDecoder(reader) 44 | var decodedObj customStruct 45 | err = decoder.Decode(&decodedObj) 46 | assert.NoError(t, err) 47 | assert.Equal(t, obj.Uuid.String(), decodedObj.Uuid.String()) 48 | } 49 | 50 | func TestErrorCantReadBytes(t *testing.T) { 51 | buf := bytes.NewBuffer([]byte{}) 52 | 53 | reader := bytes.NewReader(buf.Bytes()) 54 | decoder := msgpack.NewDecoder(reader) 55 | var decodedId uuid.UUID 56 | err := decoder.Decode(&decodedId) 57 | 58 | assert.EqualError(t, err, "can't read bytes: EOF") 59 | } 60 | 61 | func TestErrorInvalidBytesCount(t *testing.T) { 62 | buf := bytes.NewBuffer([]byte{0x7d}) 63 | 64 | reader := bytes.NewReader(buf.Bytes()) 65 | decoder := msgpack.NewDecoder(reader) 66 | var decodedId uuid.UUID 67 | err := decoder.Decode(&decodedId) 68 | 69 | assert.EqualError(t, err, "invalid bytes count 1 instead of 18") 70 | } 71 | 72 | func TestErrorWrongExtLen(t *testing.T) { 73 | buf := bytes.NewBuffer([]byte{ 74 | 0x7d, 0x44, 0x48, 0x40, 75 | 0x9d, 0xc0, 76 | 0x11, 0xd1, 77 | 0xb2, 0x45, 78 | 0x5f, 0xfd, 0xce, 0x74, 0xfa, 0xd2, 79 | 0xd3, 0xd4, 80 | }) 81 | 82 | reader := bytes.NewReader(buf.Bytes()) 83 | decoder := msgpack.NewDecoder(reader) 84 | var decodedId uuid.UUID 85 | err := decoder.Decode(&decodedId) 86 | 87 | assert.EqualError(t, err, "wrong ext len '125'") 88 | } 89 | 90 | func TestErrorWrongExtId(t *testing.T) { 91 | buf := bytes.NewBuffer([]byte{ 92 | codes.FixExt16, 0x44, 0x48, 0x40, 93 | 0x9d, 0xc0, 94 | 0x11, 0xd1, 95 | 0xb2, 0x45, 96 | 0x5f, 0xfd, 0xce, 0x74, 0xfa, 0xd2, 97 | 0xd3, 0xd4, 98 | }) 99 | 100 | reader := bytes.NewReader(buf.Bytes()) 101 | decoder := msgpack.NewDecoder(reader) 102 | var decodedId uuid.UUID 103 | err := decoder.Decode(&decodedId) 104 | 105 | assert.EqualError(t, err, "wrong ext id '68'") 106 | } 107 | -------------------------------------------------------------------------------- /.github/workflows/codeql.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ "master" ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ "master" ] 20 | schedule: 21 | - cron: '44 14 * * 4' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'go' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] 37 | # Use only 'java' to analyze code written in Java, Kotlin or both 38 | # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both 39 | # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support 40 | 41 | steps: 42 | - name: Checkout repository 43 | uses: actions/checkout@v3 44 | 45 | # Initializes the CodeQL tools for scanning. 46 | - name: Initialize CodeQL 47 | uses: github/codeql-action/init@v2 48 | with: 49 | languages: ${{ matrix.language }} 50 | # If you wish to specify custom queries, you can do so here or in a config file. 51 | # By default, queries listed here will override any specified in a config file. 52 | # Prefix the list here with "+" to use these queries and those in the config file. 53 | 54 | # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs 55 | # queries: security-extended,security-and-quality 56 | 57 | 58 | # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). 59 | # If this step fails, then you should remove it and run the build manually (see below) 60 | - name: Autobuild 61 | uses: github/codeql-action/autobuild@v2 62 | 63 | # ℹ️ Command-line programs to run using the OS shell. 64 | # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun 65 | 66 | # If the Autobuild fails above, remove it and uncomment the following three lines. 67 | # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. 68 | 69 | # - run: | 70 | # echo "Run, Build Application using script" 71 | # ./location_of_script_within_repo/buildscript.sh 72 | 73 | - name: Perform CodeQL Analysis 74 | uses: github/codeql-action/analyze@v2 75 | with: 76 | category: "/language:${{matrix.language}}" 77 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 2 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 3 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 4 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 5 | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= 6 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 7 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 8 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 9 | github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= 10 | github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 11 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 12 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 13 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 14 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 15 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 16 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 17 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 18 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 19 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 20 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 21 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 22 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 23 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 24 | golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= 25 | golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 26 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 27 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 28 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 29 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 30 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 31 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 32 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 33 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 34 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 35 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 36 | golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 37 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 38 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 39 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 40 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 41 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 42 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 43 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 44 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 45 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 46 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 47 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 48 | google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= 49 | google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 50 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 51 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 52 | google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= 53 | google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 54 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 55 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 56 | gopkg.in/vmihailenco/msgpack.v2 v2.9.2 h1:gjPqo9orRVlSAH/065qw3MsFCDpH7fa1KpiizXyllY4= 57 | gopkg.in/vmihailenco/msgpack.v2 v2.9.2/go.mod h1:/3Dn1Npt9+MYyLpYYXjInO/5jvMLamn+AEGwNEOatn8= 58 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= 59 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 60 | --------------------------------------------------------------------------------