diff --git a/.github/workflows/maintest.yml b/.github/workflows/maintest.yml
index 42492a6b..2ac8eae9 100644
--- a/.github/workflows/maintest.yml
+++ b/.github/workflows/maintest.yml
@@ -15,16 +15,16 @@ jobs:
test:
strategy:
matrix:
- go-version: [1.19.x, 1.20.x]
+ go-version: [1.25.x]
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Install Go
- uses: actions/setup-go@v2
+ uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go-version }}
- name: Checkout code
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
- name: ApiTest
run: make test-api
- name: MainTest
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 6fe1a5dd..896cf3ee 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -13,18 +13,18 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Go
- uses: actions/setup-go@v3
+ uses: actions/setup-go@v5
with:
- go-version: ">=1.19.0"
+ go-version: "1.25.x"
- name: Run GoReleaser
- uses: goreleaser/goreleaser-action@v4
+ uses: goreleaser/goreleaser-action@v6
with:
distribution: goreleaser
- version: latest
+ version: v2.17.0-d9421c5f-nightly
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/swag.yml b/.github/workflows/swag.yml
index fac3488f..0479e4dc 100644
--- a/.github/workflows/swag.yml
+++ b/.github/workflows/swag.yml
@@ -5,16 +5,16 @@ jobs:
doc:
strategy:
matrix:
- go-version: [1.19.x, 1.20.x]
+ go-version: [1.25.x]
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Install Go
- uses: actions/setup-go@v2
+ uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go-version }}
- - name: Checkout code
- uses: actions/checkout@v2
+ - name: Checkout code
+ uses: actions/checkout@v4
- name: Swag
run: |
make gen-doc
diff --git a/.github/workflows/update.api.page.yml b/.github/workflows/update.api.page.yml
index fcce218c..ce3ac969 100644
--- a/.github/workflows/update.api.page.yml
+++ b/.github/workflows/update.api.page.yml
@@ -7,20 +7,19 @@ on:
jobs:
update:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
steps:
- name: Install Go
- uses: actions/setup-go@v2
- with:
- go-version: ">=1.19.0"
+ uses: actions/setup-go@v5
+ with:
+ go-version: "1.25.x"
- name: Checkout quorum repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- - name: Swag Init
- run: |
- go install github.com/swaggo/swag/cmd/swag@v1.7.0
- make gen-doc
+ - name: Swag Init
+ run: |
+ make gen-doc
- name: Check swagger.json generated
id: check_files
@@ -35,19 +34,19 @@ jobs:
exit 1
- name: Upload swagger.json to artifact
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: quorum-artifact
path: docs/swagger.json
- name: Checkout quorum-api repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
repository: rumsystem/quorum-api
ssh-key: ${{ secrets.QUORUM_API_ACCESS_KEY }}
- name: Download swagger.json from artifact
- uses: actions/download-artifact@v3
+ uses: actions/download-artifact@v4
with:
name: quorum-artifact
path: docs
diff --git a/.goreleaser.yaml b/.goreleaser.yaml
index a41f13bf..971072ea 100644
--- a/.goreleaser.yaml
+++ b/.goreleaser.yaml
@@ -1,4 +1,5 @@
# Make sure to check the documentation at https://goreleaser.com
+version: 2
builds:
- id: quorum
env:
@@ -14,33 +15,30 @@ builds:
-w
-X main.GitCommit={{.ShortCommit}}
hooks:
- # Ignores failures, this is just best effort.
- post: find dist -name 'quorum*' -type f -print0 | xargs -n 1 -0 upx
+ post: sh -c 'command -v upx >/dev/null && find dist -name "quorum*" -type f -print0 | xargs -n 1 -0 upx || true'
-dockers:
- - image_templates:
- ["ghcr.io/rumsystem/{{ .ProjectName }}:{{ .Version }}-amd64"]
- goarch: amd64
- goos: linux
+dockers_v2:
+ - id: quorum
+ ids:
+ - quorum
+ images:
+ - ghcr.io/rumsystem/{{ .ProjectName }}
+ tags:
+ - "{{ .Version }}"
+ - latest
dockerfile: Dockerfile-goreleaser
- build_flag_templates:
- - --platform=linux/amd64
- - --label=org.opencontainers.image.title={{ .ProjectName }}
- - --label=org.opencontainers.image.url=https://github.com/rumsystem/{{ .ProjectName }}
- - --label=org.opencontainers.image.version={{ .Version }}
- - --label=org.opencontainers.image.created={{ time "2006-01-02T15:04:05Z07:00" }}
- - --label=org.opencontainers.image.revision={{ .FullCommit }}
-
-docker_manifests:
- - name_template: ghcr.io/rumsystem/{{ .ProjectName }}:{{ .Version }}
- image_templates:
- - ghcr.io/rumsystem/{{ .ProjectName }}:{{ .Version }}-amd64
- - name_template: ghcr.io/rumsystem/{{ .ProjectName }}:latest
- image_templates:
- - ghcr.io/caarlos0/{{ .ProjectName }}:{{ .Version }}-amd64
+ platforms:
+ - linux/amd64
+ labels:
+ org.opencontainers.image.title: "{{ .ProjectName }}"
+ org.opencontainers.image.url: "https://github.com/rumsystem/{{ .ProjectName }}"
+ org.opencontainers.image.version: "{{ .Version }}"
+ org.opencontainers.image.created: '{{ time "2006-01-02T15:04:05Z07:00" }}'
+ org.opencontainers.image.revision: "{{ .FullCommit }}"
archives:
- - format: tar.gz
+ - formats:
+ - tar.gz
# this name template makes the OS and Arch compatible with the results of uname.
name_template: >-
{{ .ProjectName }}_
@@ -52,11 +50,12 @@ archives:
# use zip for windows archives
format_overrides:
- goos: windows
- format: zip
+ formats:
+ - zip
checksum:
name_template: "checksums.txt"
snapshot:
- name_template: "{{ incpatch .Version }}-next"
+ version_template: "{{ incpatch .Version }}-next"
release:
github:
owner: rumsystem
diff --git a/Dockerfile b/Dockerfile
index 0046298f..281230e7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,14 +1,15 @@
-FROM golang:1.20-alpine AS build
+FROM golang:1.25-alpine AS build
RUN addgroup -S quorum && adduser -S -G quorum quorum
-RUN apk add build-base
-RUN apk add git
+RUN apk add --no-cache git
WORKDIR /src
COPY . .
RUN make linux
FROM scratch
WORKDIR /
-COPY --from=build /src/dist/quorum_linux_amd64_v1/quorum /quorum
+COPY --from=build /etc/passwd /etc/passwd
+COPY --from=build /etc/group /etc/group
+COPY --from=build /src/dist/quorum_linux_amd64/quorum /quorum
EXPOSE 8000
EXPOSE 8001
EXPOSE 8002
diff --git a/Dockerfile-goreleaser b/Dockerfile-goreleaser
index 56a7fd42..77360600 100644
--- a/Dockerfile-goreleaser
+++ b/Dockerfile-goreleaser
@@ -1,6 +1,7 @@
FROM scratch
WORKDIR /
-COPY quorum /quorum
+ARG TARGETPLATFORM
+COPY $TARGETPLATFORM/quorum /quorum
EXPOSE 8000
EXPOSE 8001
EXPOSE 8002
diff --git a/README.md b/README.md
index 6e974034..67b8a66d 100644
--- a/README.md
+++ b/README.md
@@ -72,7 +72,9 @@ A peer-to-peer system must provide economic incentive to minimize the Free-rider
-Build the quorum binary by running the command: `make linux` or `make buildall`. You can find the binary file in the `dist` dir.
+Build the quorum binary by running the command: `make linux` for Linux amd64 or `make buildall` for all supported amd64 targets. You can find the binary file in the `dist` dir.
+
+Release packaging uses GoReleaser separately: run `make goreleaser-build` for a local Linux amd64 snapshot package, `make goreleaser-build-all` for all configured snapshot packages, or `make release` for a release build.
*or*
@@ -322,7 +324,7 @@ Add more producers to prevent outages.
### Run a RUM peer on server
-1. Build the quorum binary by running the command: `make linux` or `make buildall`. You can find the binary file in the `dist` dir.
+1. Build the quorum binary by running the command: `make linux` or `make buildall`. You can find the binary file in the `dist` dir.
2. Add a shell script to run the peer:
Using the system environment variable `RUM_KSPASSWD` or add the param `keystorepwd`.
diff --git a/Tutorial.md b/Tutorial.md
index 99e977f2..ee3631c4 100644
--- a/Tutorial.md
+++ b/Tutorial.md
@@ -98,7 +98,6 @@ You can try:
- [Get group allow/deny list](#api-get-list)
- [API Update for client api](#about-chainconfig-for-client)
- [SnapShot](#about-snapshot)
-- [Pubqueue](#about-pubqueue)
Common params:
@@ -2150,72 +2149,6 @@ Owner will send snapshot every 1 minute regardless if there is anything changed,
Snapshot rule doesn't apply to a producer node. A producer node still need wait till block syncing finished to make new block.
-[>>> Back to Top](#top)
-
-
-
-# Pubqueue
-
-pubqueue keeps track of the status of user-sent TRXs, TRXs that succeed will be marked, and failed TRXs will be retried until the 10th failure.
-
-By default, after a client sending TRXs, the client needs to query the corresponding TRXs' follow-up status via pubqueue, and for TRXs that succeed or failed 10 times, the client should ACK these TRXs with specific API (otherwise they will consume your system resources).
-
-If you don't care about the state of TRXs, quorum provides an autoack feature by adding the command line argument `-autoack=true` when starting quorum.
-
-There are two interfaces involved here.
-
-
-1. GET `/v1/group/:group_id/pubqueue`
-
-example
-
-```
-curl "http://localhost:8004/api/v1/group/6bd70de8-addc-4b03-8271-a5a5b02d1ebd/pubqueue" | jq
-```
-
-
-```
-{
- "GroupId": "6bd70de8-addc-4b03-8271-a5a5b02d1ebd",
- "Data": [
- {
- "GroupId": "6bd70de8-addc-4b03-8271-a5a5b02d1ebd",
- "State": "SUCCESS",
- "RetryCount": 0,
- "UpdateAt": "1650786473293614500",
- "Trx": {
- "TrxId": "b5433111-f3a1-41e2-a03f-648e47a04dad",
- "GroupId": "6bd70de8-addc-4b03-8271-a5a5b02d1ebd",
- "Data": "jvFEEhBuwRpu7or2IUt8NdTZ1R/qzlXeJeseU7csZi+XYC28Fufj3aORoKVCAXyxBxZCuHe7kp6tKAScNxClqEX82+As+fKsBK6zTpB9gyO+fn2y",
- "TimeStamp": "1650532131665550100",
- "Version": "1.0.0",
- "Expired": 1650532161665550000,
- "Nonce": 24000,
- "SenderPubkey": "CAISIQMrNsVK8/ZrJylBFJZEe6BnslK7B5wAygbxde+RG9Hafg==",
- "SenderSign": "MEQCIDZlG/ILNC89z/OYEuADqYpHfx81pqA3RnOlLSCeypP3AiAFKLSD8M8TyNr6quYFCnuL1nzMwUlHWiEiVimDFCHlmQ=="
- },
- "StorageType": "CHAIN"
- }
- ]
-}
-```
-
-
-2. POST `POST /v1/trx/ack`
-
-It will return the TRXs that are succeefully acked.
-
-example
-
-```
-curl -X POST -H 'Content-Type: application/json' -d '{"trx_ids": ["b5433111-f3a1-41e2-a03f-648e47a04dad"]}' "http://localhost:8004/api/v1/trx/ack"
-```
-
-```
-["b5433111-f3a1-41e2-a03f-648e47a04dad"]
-```
-
-
[>>> Back to Top](#top)
diff --git a/cmd/cli/api/api.go b/cmd/cli/api/api.go
index 69bc69e2..11de9115 100644
--- a/cmd/cli/api/api.go
+++ b/cmd/cli/api/api.go
@@ -130,40 +130,6 @@ func ForceSyncGroup(groupId string) (syncRes *GroupForceSyncRetStruct, err error
return &ret, nil
}
-func GetPubQueue(groupId string, trxId string, status string) (*handlers.PubQueueInfo, error) {
- url := fmt.Sprintf(
- "%s/api/v1/group/%s/pubqueue?trx=%s&status=%s", ApiServer, groupId, trxId, status)
- ret := handlers.PubQueueInfo{}
- body, err := httpGet(url)
- if err != nil {
- return nil, err
- }
- err = json.Unmarshal(body, &ret)
- if err != nil || ret.GroupId == "" {
- return nil, errors.New(string(body))
- }
- return &ret, nil
-}
-
-func PubQueueAck(trxIds []string) ([]string, error) {
- url := fmt.Sprintf("%s/api/v1/trx/ack", ApiServer)
- param := qApi.PubQueueAckPayload{trxIds}
- payload, err := json.Marshal(¶m)
- if err != nil {
- return nil, err
- }
- ret := []string{}
- body, err := httpPost(url, payload)
- if err != nil {
- return nil, err
- }
- err = json.Unmarshal(body, &ret)
- if err != nil {
- return nil, errors.New(string(body))
- }
- return ret, nil
-}
-
func IsQuorumContentMessage(content ContentStruct) bool {
// only support Note
if content.TypeUrl == "quorum.pb.Object" {
@@ -186,14 +152,6 @@ func IsQuorumContentUserInfo(content ContentStruct) bool {
return false
}
-func AddGroupConfig(groupId, key, tp, value, memo string) (*handlers.AppConfigResult, error) {
- return ModifyGroupConfig("add", groupId, key, tp, value, memo)
-}
-
-func DelGroupConfig(groupId, key, tp, value, memo string) (*handlers.AppConfigResult, error) {
- return ModifyGroupConfig("del", groupId, key, tp, value, memo)
-}
-
func ModifyGroupConfig(action, groupId, key, tp, value, memo string) (*handlers.AppConfigResult, error) {
data := handlers.AppConfigParam{
Action: action,
@@ -595,14 +553,12 @@ func ApproveAnnouncedProducer(groupId string, user *handlers.AnnouncedProducerLi
ret := &handlers.GrpProducerResult{}
url := ApiServer + "/api/v1/group/producer"
- action := "add"
if removal {
- action = "remove"
+ return nil, errors.New("producer removal is not supported by the current chain API")
}
data := handlers.GrpProducerParam{
- Action: action,
- ProducerPubkey: user.AnnouncedPubkey,
+ ProducerPubkey: []string{user.AnnouncedPubkey},
GroupId: groupId,
Memo: "by cli",
}
diff --git a/cmd/cli/api/def.go b/cmd/cli/api/def.go
index f67054a2..d2c80362 100644
--- a/cmd/cli/api/def.go
+++ b/cmd/cli/api/def.go
@@ -1,7 +1,5 @@
package api
-import qApi "github.com/rumsystem/quorum/pkg/chainapi/api"
-
type PagerOpt struct {
StartTrxId string
Reverse bool
@@ -173,10 +171,16 @@ type GroupForceSyncRetStruct struct {
// GET /api/v1/network/peers/ping
type PingInfoItemStruct struct {
- Addrs []string `json:"addrs"`
- Protocols []string `json:"protocols"`
- RTT [10]int64 `json:"rtt"`
- Connections []qApi.AddrProtoPair `json:"connections"`
+ Addrs []string `json:"addrs"`
+ Protocols []string `json:"protocols"`
+ RTT [10]int64 `json:"rtt"`
+ Connections []AddrProtoPair `json:"connections"`
+}
+
+type AddrProtoPair struct {
+ Local string `json:"local"`
+ Remote string `json:"remote"`
+ Protocol string `json:"protocol"`
}
// POST approve user
diff --git a/cmd/cli/cache/cache.go b/cmd/cli/cache/cache.go
index fabd9f52..663348fc 100644
--- a/cmd/cli/cache/cache.go
+++ b/cmd/cli/cache/cache.go
@@ -55,16 +55,6 @@ func (cache *QuorumDataCache) Get(key []byte) ([]byte, error) {
return nil, errors.New("Not found")
}
-func (cache *QuorumDataCache) StartSync(interval int) {
- if cache != nil {
- }
-}
-
-func (cache *QuorumDataCache) StopSync() {
- if cache != nil {
- }
-}
-
func Shutdown() {
if QCache != nil && QCache.db != nil {
QCache.db.Close()
diff --git a/cmd/cli/model/blocks.go b/cmd/cli/model/blocks.go
index 71395df9..890852ec 100644
--- a/cmd/cli/model/blocks.go
+++ b/cmd/cli/model/blocks.go
@@ -11,19 +11,20 @@ import (
// can only check from back to front
type BlockRangeOpt struct {
- CurBlockId string
- NextBlockId string
+ CurBlockId uint64
+ NextBlockId uint64
Count int
Done bool
+ Initialized bool
}
-var DefaultBlockRange = BlockRangeOpt{"", "", 20, false}
+var DefaultBlockRange = BlockRangeOpt{0, 0, 20, false, false}
type BlocksDataModel struct {
Pager map[string]BlockRangeOpt
Groups qApi.GroupInfoList
Blocks []pb.Block
- NextBlocks map[string][]string
+ NextBlocks map[uint64][]uint64
Cache map[string][]pb.Block
CurGroup string
TickerCh chan struct{}
@@ -121,7 +122,7 @@ func (m *BlocksDataModel) GetBlocks() []pb.Block {
return m.Blocks
}
-func (m *BlocksDataModel) GetBlockById(id string) *pb.Block {
+func (m *BlocksDataModel) GetBlockById(id uint64) *pb.Block {
m.RLock()
defer m.RUnlock()
@@ -173,7 +174,7 @@ func (m *BlocksDataModel) SetPager(groupId string, opt BlockRangeOpt) {
pager[groupId] = opt
}
-func (m *BlocksDataModel) SetNextBlock(prev string, next string) int {
+func (m *BlocksDataModel) SetNextBlock(prev uint64, next uint64) int {
m.RWMutex.Lock()
defer m.RWMutex.Unlock()
@@ -190,17 +191,17 @@ func (m *BlocksDataModel) SetNextBlock(prev string, next string) int {
nbmap[prev] = blocks
return len(blocks)
} else {
- nextBlocks := []string{}
+ nextBlocks := []uint64{}
nextBlocks = append(nextBlocks, next)
nbmap[prev] = nextBlocks
return 1
}
}
-func (m *BlocksDataModel) GetNextBlocks(blockId string) []string {
+func (m *BlocksDataModel) GetNextBlocks(blockId uint64) []uint64 {
m.RLock()
defer m.RUnlock()
- ret := []string{}
+ ret := []uint64{}
ret, ok := m.NextBlocks[blockId]
if !ok {
diff --git a/cmd/cli/model/commands.go b/cmd/cli/model/commands.go
index 5b4a4a33..3acc6074 100644
--- a/cmd/cli/model/commands.go
+++ b/cmd/cli/model/commands.go
@@ -1,83 +1,81 @@
-package model
-
-type Command struct {
- Cmd string
- Help string
-}
-
-type CommandList []Command
-
-func (e CommandList) Len() int {
- return len(e)
-}
-
-func (e CommandList) Less(i, j int) bool {
- return e[i].Cmd > e[j].Cmd
-}
-
-func (e CommandList) Swap(i, j int) {
- e[i], e[j] = e[j], e[i]
-}
-
-var (
- CommandConnect = Command{Cmd: "/connect", Help: "$cmd ip:port\t Connect to your API server.\n"}
- CommandBackup = Command{Cmd: "/backup", Help: "$cmd\t To get backup file from API server.\n"}
- CommandJoin = Command{Cmd: "/join", Help: "$cmd @seed.json\t Join into a group from seed file.\n$cmd xxxxxxxxxx\t Join into a group from raw seed string.\n"}
- CommandTokenApply = Command{Cmd: "/token.apply", Help: "$cmd\t Apply JWT if you don't applied before.\n"}
- CommandGroupSync = Command{Cmd: "/group.sync", Help: "$cmd\t Trigger a sync on current group manually.\n"}
- CommandGroupSeed = Command{Cmd: "/group.seed", Help: "$cmd\t Get current group's seed.\n"}
- CommandGroupCreate = Command{Cmd: "/group.create", Help: "$cmd\t Open a creation form to create a group.\n"}
- CommandGroupLeave = Command{Cmd: "/group.leave", Help: "$cmd\t Leave cuerrent group.\n"}
- CommandGroupDelete = Command{Cmd: "/group.delete", Help: "$cmd\t Delete cuerrent group(if you are the owner).\n"}
- CommandGroupAdmin = Command{Cmd: "/group.admin", Help: "$cmd\t Open admin page to manage current group(manage keys, producers, etc.)\n"}
- CommandGroupChainConfig = Command{Cmd: "/group.chain.config", Help: "$cmd\t Open chain config page to manage current chain(manage allow/deny list, auth mode.)\n"}
- CommandConfigReload = Command{Cmd: "/config.reload", Help: "$cmd\t Reload config from disk.\n"}
- CommandConfigSave = Command{Cmd: "/config.save", Help: "$cmd\t Write current config to disk.\n"}
- CommandModeQuorum = Command{Cmd: "/mode.quorum", Help: "$cmd\t Switch to quorum mode(default).\n"}
- CommandModeBlocks = Command{Cmd: "/mode.blocks", Help: "$cmd\t Switch to blocks mode.\n"}
- CommandModeNetwork = Command{Cmd: "/mode.network", Help: "$cmd\t Switch to network mode.\n"}
- CommandModePubqueue = Command{Cmd: "/mode.pubqueue", Help: "$cmd\t Switch to pubqueue mode.\n"}
-
- // mode quorum only
- CommandQuorumSend = Command{Cmd: "/send", Help: "$cmd xxxx\t Send message to current group.(quorum mode only)\n"}
- CommandQuorumNick = Command{Cmd: "/nick", Help: "$cmd nickname\t Change nickname of current group.(quorum mode only)\n"}
-
- // mode blocks only
- CommandBlocksJmp = Command{Cmd: "/blocks.jmp", Help: "$cmd \t Jump to block (blocks mode only).\n"}
-
- // mode network only
- CommandNetworkPing = Command{Cmd: "/network.ping", Help: "$cmd \t Ping connected peers(network mode only).\n"}
-)
-
-var BaseCommands = []Command{
- CommandConnect,
- CommandBackup,
- CommandJoin,
- CommandTokenApply,
- CommandGroupSync,
- CommandGroupSeed,
- CommandGroupCreate,
- CommandGroupLeave,
- CommandGroupDelete,
- CommandGroupAdmin,
- CommandGroupChainConfig,
- CommandConfigReload,
- CommandConfigSave,
- CommandModeBlocks,
- CommandModeQuorum,
- CommandModeNetwork,
- CommandModePubqueue,
-}
-
-var QuorumCommands = []Command{
- CommandQuorumSend,
- CommandQuorumNick,
-}
-
-var BlocksCommands = []Command{
- CommandBlocksJmp,
-}
-
-var NetworkCommands = []Command{
- CommandNetworkPing,
-}
+package model
+
+type Command struct {
+ Cmd string
+ Help string
+}
+
+type CommandList []Command
+
+func (e CommandList) Len() int {
+ return len(e)
+}
+
+func (e CommandList) Less(i, j int) bool {
+ return e[i].Cmd > e[j].Cmd
+}
+
+func (e CommandList) Swap(i, j int) {
+ e[i], e[j] = e[j], e[i]
+}
+
+var (
+ CommandConnect = Command{Cmd: "/connect", Help: "$cmd ip:port\t Connect to your API server.\n"}
+ CommandBackup = Command{Cmd: "/backup", Help: "$cmd\t To get backup file from API server.\n"}
+ CommandJoin = Command{Cmd: "/join", Help: "$cmd @seed.json\t Join into a group from seed file.\n$cmd xxxxxxxxxx\t Join into a group from raw seed string.\n"}
+ CommandTokenApply = Command{Cmd: "/token.apply", Help: "$cmd\t Apply JWT if you don't applied before.\n"}
+ CommandGroupSync = Command{Cmd: "/group.sync", Help: "$cmd\t Trigger a sync on current group manually.\n"}
+ CommandGroupSeed = Command{Cmd: "/group.seed", Help: "$cmd\t Get current group's seed.\n"}
+ CommandGroupCreate = Command{Cmd: "/group.create", Help: "$cmd\t Open a creation form to create a group.\n"}
+ CommandGroupLeave = Command{Cmd: "/group.leave", Help: "$cmd\t Leave cuerrent group.\n"}
+ CommandGroupDelete = Command{Cmd: "/group.delete", Help: "$cmd\t Delete cuerrent group(if you are the owner).\n"}
+ CommandGroupAdmin = Command{Cmd: "/group.admin", Help: "$cmd\t Open admin page to manage current group(manage keys, producers, etc.)\n"}
+ CommandGroupChainConfig = Command{Cmd: "/group.chain.config", Help: "$cmd\t Open chain config page to manage current chain(manage allow/deny list, auth mode.)\n"}
+ CommandConfigReload = Command{Cmd: "/config.reload", Help: "$cmd\t Reload config from disk.\n"}
+ CommandConfigSave = Command{Cmd: "/config.save", Help: "$cmd\t Write current config to disk.\n"}
+ CommandModeQuorum = Command{Cmd: "/mode.quorum", Help: "$cmd\t Switch to quorum mode(default).\n"}
+ CommandModeBlocks = Command{Cmd: "/mode.blocks", Help: "$cmd\t Switch to blocks mode.\n"}
+ CommandModeNetwork = Command{Cmd: "/mode.network", Help: "$cmd\t Switch to network mode.\n"}
+
+ // mode quorum only
+ CommandQuorumSend = Command{Cmd: "/send", Help: "$cmd xxxx\t Send message to current group.(quorum mode only)\n"}
+ CommandQuorumNick = Command{Cmd: "/nick", Help: "$cmd nickname\t Change nickname of current group.(quorum mode only)\n"}
+
+ // mode blocks only
+ CommandBlocksJmp = Command{Cmd: "/blocks.jmp", Help: "$cmd \t Jump to block (blocks mode only).\n"}
+
+ // mode network only
+ CommandNetworkPing = Command{Cmd: "/network.ping", Help: "$cmd \t Ping connected peers(network mode only).\n"}
+)
+
+var BaseCommands = []Command{
+ CommandConnect,
+ CommandBackup,
+ CommandJoin,
+ CommandTokenApply,
+ CommandGroupSync,
+ CommandGroupSeed,
+ CommandGroupCreate,
+ CommandGroupLeave,
+ CommandGroupDelete,
+ CommandGroupAdmin,
+ CommandGroupChainConfig,
+ CommandConfigReload,
+ CommandConfigSave,
+ CommandModeBlocks,
+ CommandModeQuorum,
+ CommandModeNetwork,
+}
+
+var QuorumCommands = []Command{
+ CommandQuorumSend,
+ CommandQuorumNick,
+}
+
+var BlocksCommands = []Command{
+ CommandBlocksJmp,
+}
+
+var NetworkCommands = []Command{
+ CommandNetworkPing,
+}
diff --git a/cmd/cli/model/pubqueue.go b/cmd/cli/model/pubqueue.go
deleted file mode 100644
index b23167f5..00000000
--- a/cmd/cli/model/pubqueue.go
+++ /dev/null
@@ -1,115 +0,0 @@
-package model
-
-import (
- "sync"
- "time"
-
- "github.com/rumsystem/quorum/cmd/cli/api"
- chain "github.com/rumsystem/quorum/internal/pkg/chainsdk/core"
- qApi "github.com/rumsystem/quorum/pkg/chainapi/api"
-)
-
-type PubqueueDataModel struct {
- Groups qApi.GroupInfoList
- Trxs []*chain.PublishQueueItem
- Cache map[string][]*chain.PublishQueueItem
- CurGroup string
- TickerCh chan struct{}
- TickerRunning bool
-
- sync.RWMutex
-}
-
-func (m *PubqueueDataModel) StartTicker(fn func()) {
- m.RLock()
- TickerRunning := m.TickerRunning
- m.RUnlock()
- if !TickerRunning {
- Ticker := time.NewTicker(500 * time.Millisecond)
- m.RWMutex.Lock()
- m.TickerCh = make(chan struct{})
- m.RWMutex.Unlock()
- go func() {
- for {
- select {
- case <-Ticker.C:
- if api.IsValidApiServer() {
- fn()
- }
- case <-m.TickerCh:
- Ticker.Stop()
- m.RWMutex.Lock()
- m.TickerRunning = false
- m.RWMutex.Unlock()
- return
- }
- }
- }()
- m.RWMutex.Lock()
- m.TickerRunning = true
- m.RWMutex.Unlock()
- }
-}
-func (m *PubqueueDataModel) StopTicker() {
- m.RLock()
- TickerRunning := m.TickerRunning
- m.RUnlock()
- if TickerRunning {
- m.RWMutex.Lock()
- close(m.TickerCh)
- m.RWMutex.Unlock()
- }
-}
-
-func (m *PubqueueDataModel) SetGroups(groups qApi.GroupInfoList) {
- m.RWMutex.Lock()
- defer m.RWMutex.Unlock()
-
- m.Groups = groups
-}
-
-func (m *PubqueueDataModel) GetGroups() qApi.GroupInfoList {
- m.RLock()
- defer m.RUnlock()
-
- return m.Groups
-}
-
-func (m *PubqueueDataModel) GetCurrentGroup() string {
- m.RLock()
- defer m.RUnlock()
- return m.CurGroup
-}
-
-func (m *PubqueueDataModel) SetCurrentGroup(gid string) {
- m.RWMutex.Lock()
- defer m.RWMutex.Unlock()
- m.CurGroup = gid
-}
-
-func (m *PubqueueDataModel) GetTrx() []*chain.PublishQueueItem {
- m.RLock()
- defer m.RUnlock()
-
- return m.Trxs
-}
-
-func (m *PubqueueDataModel) SetTrxs(trxs []*chain.PublishQueueItem) {
- m.RWMutex.Lock()
- defer m.RWMutex.Unlock()
-
- m.Trxs = trxs
-}
-
-func (m *PubqueueDataModel) GetCache(gid string) ([]*chain.PublishQueueItem, bool) {
- m.RLock()
- defer m.RUnlock()
- data, ok := m.Cache[gid]
- return data, ok
-}
-
-func (m *PubqueueDataModel) UpdateCache(gid string, contents []*chain.PublishQueueItem) {
- m.RWMutex.Lock()
- defer m.RWMutex.Unlock()
- m.Cache[gid] = contents
-}
diff --git a/cmd/cli/ui/command.go b/cmd/cli/ui/command.go
index f63725c9..955bfbc7 100644
--- a/cmd/cli/ui/command.go
+++ b/cmd/cli/ui/command.go
@@ -141,11 +141,6 @@ func cmdInputInit() {
exitAll()
Blocks()
- } else if strings.HasPrefix(cmdStr, model.CommandModePubqueue.Cmd) {
- reset("")
- exitAll()
-
- Pubqueue()
} else if strings.HasPrefix(cmdStr, model.CommandModeQuorum.Cmd) {
reset("")
diff --git a/cmd/cli/ui/page_blocks.go b/cmd/cli/ui/page_blocks.go
index fbc4af41..b7793ef5 100644
--- a/cmd/cli/ui/page_blocks.go
+++ b/cmd/cli/ui/page_blocks.go
@@ -27,7 +27,7 @@ var blocksPageLeft = cview.NewList() // groups
var blocksPageRight = cview.NewTextView() // blocks
var blocksData = model.BlocksDataModel{
- NextBlocks: make(map[string][]string),
+ NextBlocks: make(map[uint64][]uint64),
Pager: make(map[string]model.BlockRangeOpt),
TickerRunning: false,
Counter: 0,
@@ -112,13 +112,14 @@ func initBlocksPageInputHandler() {
return
}
curOpt := blocksData.GetPager(curGroup)
- if curOpt.NextBlockId != "" {
+ if !curOpt.Done {
blocksData.SetPager(curGroup,
model.BlockRangeOpt{
CurBlockId: curOpt.NextBlockId,
- NextBlockId: "",
+ NextBlockId: 0,
Count: curOpt.Count,
Done: false,
+ Initialized: true,
})
//clearBlocksSelection()
//blocksPageRight.ScrollToBeginning()
@@ -231,24 +232,20 @@ func goBlocksContent() {
if opt.Done {
return
}
- if opt.CurBlockId == "" {
+ if !opt.Initialized {
// Get the latest block id first
for _, group := range blocksData.GetGroups().GroupInfos {
if group.GroupId == curGroup {
- if len(group.HighestBlockId) > 0 {
- opt.CurBlockId = group.HighestBlockId
- blocksData.SetPager(curGroup, model.BlockRangeOpt{CurBlockId: opt.CurBlockId, NextBlockId: opt.NextBlockId, Count: opt.Count})
- }
+ opt.CurBlockId = group.CurrtTopBlock
+ opt.Initialized = true
+ blocksData.SetPager(curGroup, opt)
}
}
}
- if opt.CurBlockId == "" {
- Error("Failed to get blocks", "Can not get HighestBlockId of this group")
- return
- }
var startBlockId = opt.CurBlockId
var curBlockId = opt.CurBlockId
var count = opt.Count
+ done := false
for i := 0; i < count; i++ {
curOpt := blocksData.GetPager(curGroup)
curG := blocksData.GetCurrentGroup()
@@ -256,29 +253,31 @@ func goBlocksContent() {
config.Logger.Warnf("Abort blocks fetching due to opts change or group change\n")
return
}
- block, err := api.GetBlockById(curGroup, curBlockId)
+ block, err := api.GetBlockById(curGroup, strconv.FormatUint(curBlockId, 10))
checkFatalError(err)
if block == nil {
config.Logger.Infof("Abort blocks fetching, nil block found\n")
break
}
- if block.PrevBlockId != "" {
- blocks = append(blocks, *block)
- nextBlockLen := blocksData.SetNextBlock(block.PrevBlockId, block.BlockId)
+ blocks = append(blocks, *block)
+ if curBlockId > 0 {
+ prevBlockId := curBlockId - 1
+ nextBlockLen := blocksData.SetNextBlock(prevBlockId, block.BlockId)
if nextBlockLen > 1 {
// show message
- Error("Multiple children detected", fmt.Sprintf("Block %s has %d children", block.BlockId, nextBlockLen))
- config.Logger.Errorf("Multiple children detected: Block %s has %d children", block.BlockId, nextBlockLen)
+ Error("Multiple children detected", fmt.Sprintf("Block %d has %d children", block.BlockId, nextBlockLen))
+ config.Logger.Errorf("Multiple children detected: Block %d has %d children", block.BlockId, nextBlockLen)
}
- curBlockId = block.PrevBlockId
+ curBlockId = prevBlockId
} else {
config.Logger.Infof("blocks fetched, no prev block\n")
+ done = true
break
}
}
curOpt := blocksData.GetPager(curGroup)
if blocksData.GetCurrentGroup() == curGroup && curOpt.CurBlockId == startBlockId && curOpt.Count == count {
- blocksData.SetPager(curGroup, model.BlockRangeOpt{CurBlockId: startBlockId, NextBlockId: curBlockId, Count: curOpt.Count, Done: true})
+ blocksData.SetPager(curGroup, model.BlockRangeOpt{CurBlockId: startBlockId, NextBlockId: curBlockId, Count: curOpt.Count, Done: done, Initialized: true})
// safe to update
curBlocks := blocksData.GetBlocks()
blocksData.SetBlocks(append(curBlocks, blocks...))
@@ -295,7 +294,7 @@ func goBlocksContent() {
func drawBlocksGroups() {
blocksPageLeft.Clear()
for i, group := range blocksData.GetGroups().GroupInfos {
- item := cview.NewListItem(fmt.Sprintf("%s(%s)", group.GroupName, group.GroupStatus))
+ item := cview.NewListItem(fmt.Sprintf("%s(%s)", group.GroupName, group.RexSyncerStatus))
item.SetShortcut(rune('a' + i))
blocksPageLeft.AddItem(item)
}
@@ -337,11 +336,11 @@ func drawBlocksContent() {
fmt.Fprintf(blocksPageRight, "Name: %s\n", group.GroupName)
fmt.Fprintf(blocksPageRight, "ID: %s\n", group.GroupId)
fmt.Fprintf(blocksPageRight, "Owner: %s\n", group.OwnerPubKey)
- fmt.Fprintf(blocksPageRight, "HighestHeight: %d\n", group.HighestHeight)
- fmt.Fprintf(blocksPageRight, "Status: %s\n", group.GroupStatus)
+ fmt.Fprintf(blocksPageRight, "Current Epoch: %d\n", group.CurrtEpoch)
+ fmt.Fprintf(blocksPageRight, "Status: %s\n", group.RexSyncerStatus)
fmt.Fprintf(blocksPageRight, "\n")
fmt.Fprintf(blocksPageRight, "Last Update: %s\n", time.Unix(0, group.LastUpdated))
- fmt.Fprintf(blocksPageRight, "Highest Block: %s\n", group.HighestBlockId)
+ fmt.Fprintf(blocksPageRight, "Current Top Block: %d\n", group.CurrtTopBlock)
break
}
}
@@ -349,11 +348,11 @@ func drawBlocksContent() {
blocks := blocksData.GetBlocks()
for i, block := range blocks {
- fmt.Fprintf(blocksPageRight, "[\"%d\"][::b]%s[-:-:-]\n", i, block.BlockId)
+ fmt.Fprintf(blocksPageRight, "[\"%d\"][::b]%d[-:-:-]\n", i, block.BlockId)
fmt.Fprintf(blocksPageRight, "%s\n", time.Unix(0, block.TimeStamp))
- fmt.Fprintf(blocksPageRight, "Hash: %s\n", hex.EncodeToString(block.Hash))
- fmt.Fprintf(blocksPageRight, "Signature: %s\n", hex.EncodeToString(block.Signature))
+ fmt.Fprintf(blocksPageRight, "Hash: %s\n", hex.EncodeToString(block.BlockHash))
+ fmt.Fprintf(blocksPageRight, "Signature: %s\n", hex.EncodeToString(block.ProducerSign))
fmt.Fprintf(blocksPageRight, "Trxs:\n")
for _, trx := range block.Trxs {
fmt.Fprintf(blocksPageRight, "\t- trx %s\n", trx.TrxId)
@@ -379,7 +378,7 @@ func drawBlocksContent() {
fmt.Fprintf(blocksPageRight, "Children:\n")
for _, child := range blocksData.GetNextBlocks(block.BlockId) {
- fmt.Fprintf(blocksPageRight, "\t- blk %s\n", child)
+ fmt.Fprintf(blocksPageRight, "\t- blk %d\n", child)
}
fmt.Fprintf(blocksPageRight, "\n\n")
}
@@ -398,11 +397,17 @@ func jumpToBlock(id string) {
Error("No Group in selection", "Please select a group first.")
return
}
+ blockId, err := strconv.ParseUint(strings.TrimSpace(id), 10, 64)
+ if err != nil {
+ Error("Invalid block id", err.Error())
+ return
+ }
curOpt := blocksData.GetPager(curGroup)
- if curOpt.CurBlockId == id {
+ if curOpt.CurBlockId == blockId {
return
}
- blocksData.SetPager(curGroup, model.BlockRangeOpt{CurBlockId: id, Count: curOpt.Count})
+ blocksData.SetPager(curGroup, model.BlockRangeOpt{CurBlockId: blockId, Count: curOpt.Count, Initialized: true})
+ blocksData.SetBlocks([]pb.Block{})
go goBlocksContent()
clearBlocksSelection()
blocksPageRight.ScrollToBeginning()
diff --git a/cmd/cli/ui/page_pubqueue.go b/cmd/cli/ui/page_pubqueue.go
deleted file mode 100644
index 734894dc..00000000
--- a/cmd/cli/ui/page_pubqueue.go
+++ /dev/null
@@ -1,268 +0,0 @@
-package ui
-
-import (
- "fmt"
- "net"
- "runtime"
- "strconv"
- "time"
-
- "code.rocketnine.space/tslocum/cbind"
- "code.rocketnine.space/tslocum/cview"
- "github.com/gdamore/tcell/v2"
- "github.com/rumsystem/quorum/cmd/cli/api"
- "github.com/rumsystem/quorum/cmd/cli/config"
- "github.com/rumsystem/quorum/cmd/cli/model"
- chain "github.com/rumsystem/quorum/internal/pkg/chainsdk/core"
- quorumpb "github.com/rumsystem/quorum/pkg/pb"
-)
-
-var pubqueuePage = cview.NewFlex()
-var pubqueuePageLeft = cview.NewList() // groups
-var pubqueuePageRight = cview.NewTextView() // trx
-
-const PUBQUEUE_PAGE = "pubqueue"
-
-var pubqueueData = model.PubqueueDataModel{
- Cache: make(map[string][]*chain.PublishQueueItem),
- TickerCh: make(chan struct{}),
- TickerRunning: false,
-}
-
-func pubqueuePageInit() {
- pubqueuePageLeft.SetTitle("Groups")
- pubqueuePageLeft.SetBorder(true)
-
- pubqueuePageRight.SetBorder(true)
- pubqueuePageRight.SetRegions(true)
- pubqueuePageRight.SetDynamicColors(true)
- pubqueuePageRight.SetPadding(0, 1, 1, 1)
-
- initPubqueuePageInputHandler()
-
- // short cut
- pubqueuePage.AddItem(pubqueuePageLeft, 0, 1, false)
- pubqueuePage.AddItem(pubqueuePageRight, 0, 2, false)
-
- rootPanels.AddPanel(PUBQUEUE_PAGE, pubqueuePage, true, false)
-}
-
-func initPubqueuePageInputHandler() {
- focusGroupListView := func() { App.SetFocus(pubqueuePageLeft) }
- focusContentView := func() { App.SetFocus(pubqueuePageRight) }
-
- pageInputHandler := cbind.NewConfiguration()
- pageInputHandler.Set("Enter", wrapQuorumKeyFn(focusContentView))
- pubqueuePage.SetInputCapture(pageInputHandler.Capture)
-
- leftViewHandler := cbind.NewConfiguration()
- if runtime.GOOS == "windows" {
- // windows will set extra shift mod somehow
- leftViewHandler.Set("Shift+L", wrapQuorumKeyFn(focusContentView))
- } else {
- leftViewHandler.Set("L", wrapQuorumKeyFn(focusContentView))
- }
- pubqueuePageLeft.SetInputCapture(leftViewHandler.Capture)
-
- rightViewHandler := cbind.NewConfiguration()
-
- if runtime.GOOS == "windows" {
- rightViewHandler.Set("Shift+H", wrapQuorumKeyFn(focusGroupListView))
- } else {
- rightViewHandler.Set("H", wrapQuorumKeyFn(focusGroupListView))
- }
- pubqueuePageRight.SetInputCapture(rightViewHandler.Capture)
-
- selectNext := func() {
- trxs := pubqueueData.GetTrx()
- minBlockNum := 0
- maxBlockNum := len(trxs) - 1
-
- curSelection := pubqueuePageRight.GetHighlights()
- tag := minBlockNum
- if len(curSelection) > 0 {
- tag, _ = strconv.Atoi(curSelection[0])
- tag += 1
- }
- if tag >= minBlockNum && tag <= maxBlockNum {
- pubqueuePageRight.Highlight(strconv.Itoa(tag))
- pubqueuePageRight.ScrollToHighlight()
- }
- }
- selectLast := func() {
- trxs := pubqueueData.GetTrx()
- minBlockNum := 0
- maxBlockNum := len(trxs) - 1
-
- curSelection := pubqueuePageRight.GetHighlights()
- tag := minBlockNum
- if len(curSelection) > 0 {
- tag, _ = strconv.Atoi(curSelection[0])
- tag -= 1
- }
- if tag >= minBlockNum && tag <= maxBlockNum {
- pubqueuePageRight.Highlight(strconv.Itoa(tag))
- pubqueuePageRight.ScrollToHighlight()
- }
- }
- showTrxInfo := func() {
- }
- pubqueuePageRight.SetDoneFunc(func(key tcell.Key) {
- switch key {
- case tcell.KeyEsc:
- clearPubqueueSelection()
- case tcell.KeyEnter:
- showTrxInfo()
- case tcell.KeyTab:
- selectNext()
- case tcell.KeyBacktab:
- selectLast()
- default:
- }
- })
-}
-
-func Pubqueue() {
- rootPanels.ShowPanel(PUBQUEUE_PAGE)
- rootPanels.SendToFront(PUBQUEUE_PAGE)
- App.SetFocus(pubqueuePageRight)
-
- PubqueueRefreshAll()
- pubqueueData.StartTicker(PubqueueRefreshAll)
-}
-
-func PubqueueExit() {
- pubqueueData.StopTicker()
-}
-
-func PubqueueRefreshAll() {
- go func() {
- goPubqueueGroups()
- goPubqueueTrx()
- }()
-}
-
-func goPubqueueGroups() {
- groupsInfo, err := api.Groups()
- checkFatalError(err)
- if err != nil {
- if err, ok := err.(net.Error); ok && err.Timeout() {
- return
- }
- Error("Failed to get groups", err.Error())
- } else {
- oldGroups := pubqueueData.GetGroups().GroupInfos
- pubqueueData.SetGroups(*groupsInfo)
- if len(groupsInfo.GroupInfos) != len(oldGroups) {
- drawPubqueueGroups()
- }
- curGroup := pubqueueData.GetCurrentGroup()
- if curGroup == "" && len(groupsInfo.GroupInfos) > 0 {
- pubqueueData.SetCurrentGroup(groupsInfo.GroupInfos[0].GroupId)
- }
- }
-}
-
-func goPubqueueTrx() {
- curGroup := pubqueueData.GetCurrentGroup()
- if curGroup != "" {
- // get all trx in current queue
- trxs, err := api.GetPubQueue(curGroup, "", "")
- checkFatalError(err)
- pubqueueData.SetTrxs(trxs.Data)
- drawPubqueueContent()
- }
-}
-
-func drawPubqueueGroups() {
- pubqueuePageLeft.Clear()
- for i, group := range pubqueueData.GetGroups().GroupInfos {
- item := cview.NewListItem(fmt.Sprintf("%s(%s)", group.GroupName, group.GroupStatus))
- item.SetShortcut(rune('a' + i))
- pubqueuePageLeft.AddItem(item)
- }
-
- pubqueuePageLeft.SetSelectedFunc(func(idx int, group *cview.ListItem) {
- targetGroup := pubqueueData.GetGroups().GroupInfos[idx]
- trxs, ok := pubqueueData.GetCache(targetGroup.GroupId)
- if !ok {
- trxs = []*chain.PublishQueueItem{}
- }
- curGroup := pubqueueData.GetCurrentGroup()
- curTrxs := pubqueueData.GetTrx()
- pubqueueData.UpdateCache(curGroup, curTrxs)
- if curGroup != targetGroup.GroupId {
- // switch to new group
- clearPubqueueSelection()
- pubqueueData.SetCurrentGroup(targetGroup.GroupId)
- pubqueueData.SetTrxs(trxs)
-
- drawPubqueueContent()
- if len(trxs) == 0 {
- go goPubqueueTrx()
- }
- App.SetFocus(pubqueuePageRight)
- }
- })
- App.Draw()
-}
-
-func drawPubqueueContent() {
- pubqueuePageRight.Clear()
- cipherKey := ""
- groupType := "PUBLIC"
-
- for _, group := range pubqueueData.GetGroups().GroupInfos {
- if group.GroupId == pubqueueData.GetCurrentGroup() {
- cipherKey = group.CipherKey
- groupType = group.EncryptionType
- fmt.Fprintf(pubqueuePageRight, "Name: %s\n", group.GroupName)
- fmt.Fprintf(pubqueuePageRight, "ID: %s\n", group.GroupId)
- fmt.Fprintf(pubqueuePageRight, "Owner: %s\n", group.OwnerPubKey)
- fmt.Fprintf(pubqueuePageRight, "HighestHeight: %d\n", group.HighestHeight)
- fmt.Fprintf(pubqueuePageRight, "Status: %s\n", group.GroupStatus)
- fmt.Fprintf(pubqueuePageRight, "\n")
- fmt.Fprintf(pubqueuePageRight, "Last Update: %s\n", time.Unix(0, group.LastUpdated))
- fmt.Fprintf(pubqueuePageRight, "Highest Block: %s\n", group.HighestBlockId)
- break
- }
- }
- fmt.Fprintf(pubqueuePageRight, "\n\n")
-
- // trx
- trxs := pubqueueData.GetTrx()
- for i, trx := range trxs {
- fmt.Fprintf(pubqueuePageRight, "[\"%d\"][::b]%s[-:-:-]\n", i, trx.Trx.TrxId)
- fmt.Fprintf(pubqueuePageRight, "Updated: %s\n", time.Unix(0, trx.UpdateAt))
- fmt.Fprintf(pubqueuePageRight, "State: %s\n", trx.State)
- fmt.Fprintf(pubqueuePageRight, "RetryCount: %d\n", trx.RetryCount)
-
- fmt.Fprintf(pubqueuePageRight, "\t- trx %s\n", trx.Trx.TrxId)
- trxData, err := decodeTrxData(groupType, cipherKey, trx.Trx.Data)
- if err != nil {
- fmt.Fprintf(pubqueuePageRight, "\t[red:]Failed to decode: %s[-:-:-]\n", err.Error())
- } else {
- trxContent, typeUrl, err := quorumpb.BytesToMessage(trx.Trx.TrxId, trxData)
- if err != nil {
- config.Logger.Error(err)
- fmt.Fprintf(pubqueuePageRight, "\t[red:]Failed to decode: %s[-:-:-]\n", err.Error())
- } else {
- fmt.Fprintf(pubqueuePageRight, "\t\t - TypeUrl: %s\n", typeUrl)
- contentStr := fmt.Sprintf("%s", trxContent)
- if len(contentStr) > 1024 {
- contentStr = contentStr[0:1024] + "..."
- }
- fmt.Fprintf(pubqueuePageRight, "\t\t - Content: %s\n", contentStr)
- }
- }
-
- fmt.Fprintf(pubqueuePageRight, "\n\n")
- }
- App.Draw()
-}
-
-func clearPubqueueSelection() {
- pubqueuePageRight.Highlight("")
- cmdInput.SetLabel("")
- cmdInput.SetText("")
-}
diff --git a/cmd/cli/ui/page_quorum.go b/cmd/cli/ui/page_quorum.go
index f2c2d453..714d36c4 100644
--- a/cmd/cli/ui/page_quorum.go
+++ b/cmd/cli/ui/page_quorum.go
@@ -21,7 +21,6 @@ import (
"github.com/rumsystem/quorum/cmd/cli/api"
"github.com/rumsystem/quorum/cmd/cli/config"
"github.com/rumsystem/quorum/cmd/cli/model"
- "github.com/rumsystem/quorum/cmd/cli/utils"
"github.com/rumsystem/quorum/pkg/pb"
)
@@ -595,7 +594,7 @@ func drawQuorumGroups() {
// draw groupListView's content
groupListView.Clear()
for i, group := range quorumData.GetGroups().GroupInfos {
- item := cview.NewListItem(fmt.Sprintf("%s(%s)", group.GroupName, group.GroupStatus))
+ item := cview.NewListItem(fmt.Sprintf("%s(%s)", group.GroupName, group.RexSyncerStatus))
item.SetShortcut(rune('a' + i))
groupListView.AddItem(item)
}
@@ -668,11 +667,11 @@ func drawQuorumCurrentGroup() {
fmt.Fprintf(groupInfoView, "Name: %s\n", group.GroupName)
fmt.Fprintf(groupInfoView, "ID: %s\n", group.GroupId)
fmt.Fprintf(groupInfoView, "Owner: %s\n", group.OwnerPubKey)
- fmt.Fprintf(groupInfoView, "HighestHeight: %d\n", group.HighestHeight)
- fmt.Fprintf(groupInfoView, "Status: %s\n", group.GroupStatus)
+ fmt.Fprintf(groupInfoView, "Current Epoch: %d\n", group.CurrtEpoch)
+ fmt.Fprintf(groupInfoView, "Status: %s\n", group.RexSyncerStatus)
fmt.Fprintf(groupInfoView, "\n")
fmt.Fprintf(groupInfoView, "Last Update: %s\n", time.Unix(0, group.LastUpdated))
- fmt.Fprintf(groupInfoView, "Latest Block: %s\n", group.HighestBlockId)
+ fmt.Fprintf(groupInfoView, "Current Top Block: %d\n", group.CurrtTopBlock)
break
}
}
@@ -922,7 +921,6 @@ func goQuorumNick(nick string) {
} else {
cmdInput.SetLabel(fmt.Sprintf("Nickname TRX %s Sent: ", ret.TrxId))
cmdInput.SetText("Wait for syncing...")
- go goAutoAckGroupTrx(curGroup)
}
}
@@ -949,32 +947,11 @@ func goQuorumCreateContent(content string) {
} else {
cmdInput.SetLabel(fmt.Sprintf("TRX %s: ", ret.TrxId))
cmdInput.SetText("Syncing with peers..")
- go goAutoAckGroupTrx(curGroup)
App.SetFocus(contentView)
}
}
}
-func goAutoAckGroupTrx(groupId string) {
- trxIds, err := utils.CheckTrx(groupId, "", "")
- if err != nil {
- Error("Failed to check trx info from pubqueue", err.Error())
- return
- }
- if len(trxIds) > 0 {
- cmdInput.SetLabel(fmt.Sprintf("[%d] TRX ACKED: ", len(trxIds)))
- info := ""
- for idx, tId := range trxIds {
- if idx >= 2 {
- info += ".."
- break
- }
- info += fmt.Sprintf("%s ", tId)
- }
- cmdInput.SetText(info)
- }
-}
-
func goQuorumLeaveGroup(gid string) {
_, err := api.LeaveGroup(gid)
if err != nil {
diff --git a/cmd/cli/ui/ui.go b/cmd/cli/ui/ui.go
index d383051c..07a036d8 100644
--- a/cmd/cli/ui/ui.go
+++ b/cmd/cli/ui/ui.go
@@ -43,7 +43,6 @@ func Init() {
adminPageInit()
chainConfigPageInit()
networkPageInit()
- pubqueuePageInit()
// display groups
App.EnableMouse(false)
diff --git a/cmd/cli/utils/utils.go b/cmd/cli/utils/utils.go
deleted file mode 100644
index 3bc79e92..00000000
--- a/cmd/cli/utils/utils.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package utils
-
-import (
- "time"
-
- "github.com/rumsystem/quorum/cmd/cli/api"
- chain "github.com/rumsystem/quorum/internal/pkg/chainsdk/core"
-)
-
-// this function will check trx in pubqueue
-// once success, it will ack
-// also, it will ack trx which failed > 10 times
-func CheckTrx(groupId string, trxId string, status string) ([]string, error) {
- select {
- case <-time.After(30 * time.Second):
- qInfo, err := api.GetPubQueue(groupId, trxId, status)
- if err != nil {
- return nil, err
- }
- if len(qInfo.Data) == 0 {
- return nil, nil
- }
- successed := []string{}
- rejected := []string{}
- for _, item := range qInfo.Data {
- if item.State == chain.PublishQueueItemStateSuccess {
- successed = append(successed, item.Trx.TrxId)
- }
- if item.RetryCount > chain.MAX_RETRY_COUNT && item.State == chain.PublishQueueItemStateFail {
- rejected = append(rejected, item.Trx.TrxId)
- }
- }
-
- acked := append(successed, rejected...)
- if len(acked) > 0 {
- _, err = api.PubQueueAck(acked)
- if err != nil {
- return nil, err
- }
- return acked, nil
- }
- return nil, nil
- }
-}
diff --git a/cmd/fullnode.go b/cmd/fullnode.go
index 93ae48b6..35846672 100644
--- a/cmd/fullnode.go
+++ b/cmd/fullnode.go
@@ -10,7 +10,6 @@ import (
"time"
"github.com/fatih/color"
- _ "github.com/golang/protobuf/ptypes/timestamp" //import for swaggo
discovery "github.com/libp2p/go-libp2p/p2p/discovery/util"
connmgr "github.com/libp2p/go-libp2p/p2p/net/connmgr"
_ "github.com/multiformats/go-multiaddr" //import for swaggo
@@ -29,6 +28,7 @@ import (
localcrypto "github.com/rumsystem/quorum/pkg/crypto"
"github.com/spf13/cobra"
"github.com/spf13/viper"
+ _ "google.golang.org/protobuf/types/known/timestamppb" //import for swaggo
)
var (
@@ -93,7 +93,6 @@ func init() {
flags.StringSlice("peer", nil, "bootstrap peer address")
flags.String("skippeers", "", "peer id lists, will be skipped in the pubsub connection")
flags.String("jsontracer", "", "output tracer data to a json file")
- flags.Bool("autoack", true, "auto ack the transactions in pubqueue")
flags.Bool("autorelay", true, "enable relay")
fullNodeViper = options.NewViper()
diff --git a/cmd/rumfile.go b/cmd/rumfile.go
index fd0737f8..cc5699eb 100644
--- a/cmd/rumfile.go
+++ b/cmd/rumfile.go
@@ -444,7 +444,7 @@ func VerifyFileFormat(filename string) (*Fileinfo, error) {
case ".epub":
return OpenEpub(filename)
default:
- return nil, fmt.Errorf("unsupported file: ", ext)
+ return nil, fmt.Errorf("unsupported file: %s", ext)
}
}
diff --git a/docs.go b/docs.go
index 6b9f6f5c..70d6a124 100644
--- a/docs.go
+++ b/docs.go
@@ -1,3 +1,6 @@
+//go:build docs
+// +build docs
+
package main
import (
diff --git a/go.mod b/go.mod
index ae2984a5..1be5da1a 100644
--- a/go.mod
+++ b/go.mod
@@ -1,237 +1,256 @@
module github.com/rumsystem/quorum
-go 1.19
+go 1.25.11
replace github.com/dgraph-io/badger/v3 => github.com/chux0519/badger/v3 v3.2103.3
replace github.com/dgraph-io/ristretto => github.com/chux0519/ristretto v0.1.1
+replace code.rocketnine.space/tslocum/cbind => github.com/tslocum/cbind v0.1.5
+
+replace code.rocketnine.space/tslocum/cview => github.com/tslocum/cview v1.5.6
+
//replace github.com/libp2p/go-libp2p-noise => github.com/libp2p/go-libp2p-noise v0.3.0
// replace github.com/libp2p/go-libp2p => ../go-libp2p
require (
code.rocketnine.space/tslocum/cbind v0.1.5
code.rocketnine.space/tslocum/cview v1.5.6
- filippo.io/age v1.1.1
- github.com/BurntSushi/toml v1.1.0
+ filippo.io/age v1.2.1
+ github.com/BurntSushi/toml v1.4.0
github.com/NebulousLabs/merkletree v0.0.0-20181203152040-08d5d54b07f5
github.com/Press-One/go-update v1.0.0
github.com/adrg/xdg v0.3.3
github.com/atotto/clipboard v0.1.4
- github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0
+ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1
github.com/dgraph-io/badger/v3 v3.2103.2
+ github.com/dustin/go-humanize v1.0.1
github.com/edwingeng/deque/v2 v2.1.1
- github.com/ethereum/go-ethereum v1.10.23
- github.com/fatih/color v1.15.0
+ github.com/ethereum/go-ethereum v1.17.3
+ github.com/fatih/color v1.18.0
github.com/gdamore/tcell/v2 v2.4.0
github.com/go-playground/locales v0.14.0
github.com/go-playground/universal-translator v0.18.0
- github.com/go-playground/validator/v10 v10.10.0
- github.com/golang-jwt/jwt/v4 v4.4.1
- github.com/golang/protobuf v1.5.2
- github.com/google/go-cmp v0.5.9
+ github.com/go-playground/validator/v10 v10.11.1
+ github.com/golang-jwt/jwt/v4 v4.5.2
+ github.com/google/go-cmp v0.7.0
github.com/google/go-querystring v1.1.0
github.com/google/orderedcode v0.0.1
- github.com/google/uuid v1.3.0
- github.com/gorilla/websocket v1.5.0
- github.com/h2non/filetype v1.1.3
- github.com/ipfs/go-ipfs-util v0.0.2
- github.com/ipfs/go-log/v2 v2.5.1
+ github.com/google/uuid v1.6.0
+ github.com/gorilla/websocket v1.5.3
+ github.com/ipfs/go-ipfs-util v0.0.3
+ github.com/ipfs/go-log/v2 v2.9.2
github.com/kevinms/leakybucket-go v0.0.0-20200115003610-082473db97ca
- github.com/klauspost/compress v1.15.12
- github.com/klauspost/reedsolomon v1.11.5
- github.com/labstack/echo/v4 v4.9.0
- github.com/labstack/gommon v0.3.1
- github.com/libp2p/go-libp2p v0.25.1
- github.com/libp2p/go-libp2p-core v0.17.0
- github.com/libp2p/go-libp2p-kad-dht v0.21.0
- github.com/libp2p/go-libp2p-pubsub v0.9.2
+ github.com/klauspost/compress v1.18.6
+ github.com/klauspost/reedsolomon v1.14.1
+ github.com/labstack/echo-jwt/v4 v4.4.0
+ github.com/labstack/echo/v4 v4.15.4
+ github.com/labstack/gommon v0.5.0
+ github.com/libp2p/go-libp2p v0.48.0
+ github.com/libp2p/go-libp2p-kad-dht v0.40.0
+ github.com/libp2p/go-libp2p-pubsub v0.16.0
github.com/libp2p/go-msgio v0.3.0
- github.com/multiformats/go-multiaddr v0.8.0
- github.com/open-policy-agent/opa v0.39.0
+ github.com/multiformats/go-multiaddr v0.16.1
+ github.com/open-policy-agent/opa v1.17.1
github.com/otiai10/copy v1.7.0
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5
- github.com/prometheus/client_golang v1.14.0
- github.com/prometheus/client_model v0.3.0
- github.com/prometheus/common v0.37.0
+ github.com/prometheus/client_golang v1.23.2
+ github.com/prometheus/client_model v0.6.2
+ github.com/prometheus/common v0.67.5
github.com/prometheus/prom2json v1.3.2
- github.com/prysmaticlabs/prysm/v3 v3.1.1
github.com/rumsystem/ip-cert v0.0.0-20220802012323-cebacb66b383
- github.com/sirupsen/logrus v1.8.1
- github.com/spf13/cobra v1.5.0
- github.com/spf13/viper v1.12.0
- github.com/swaggo/echo-swagger v1.3.5
- github.com/swaggo/swag v1.8.1
+ github.com/sirupsen/logrus v1.9.4
+ github.com/spf13/cobra v1.10.2
+ github.com/spf13/pflag v1.0.10
+ github.com/spf13/viper v1.21.0
+ github.com/stretchr/testify v1.11.1
+ github.com/swaggo/echo-swagger v1.5.2
+ github.com/swaggo/swag v1.16.6
github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e
- go.etcd.io/bbolt v1.3.6
- go.uber.org/zap v1.24.0
- golang.org/x/crypto v0.6.0
- golang.org/x/term v0.5.0
- google.golang.org/protobuf v1.28.1
- gopkg.in/natefinch/lumberjack.v2 v2.0.0
+ go.etcd.io/bbolt v1.5.0
+ go.uber.org/zap v1.28.0
+ golang.org/x/crypto v0.53.0
+ golang.org/x/term v0.44.0
+ google.golang.org/protobuf v1.36.11
+ gopkg.in/natefinch/lumberjack.v2 v2.2.1
)
require (
+ filippo.io/bigmod v0.1.1-0.20260103110540-f8a47775ebe5 // indirect
+ filippo.io/keygen v0.0.0-20260114151900-8e2790ea4c5b // indirect
+ github.com/Jorropo/jsync v1.0.1 // indirect
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/NebulousLabs/errors v0.0.0-20181203160057-9f787ce8f69e // indirect
github.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e // indirect
github.com/OneOfOne/xxhash v1.2.8 // indirect
- github.com/PuerkitoBio/purell v1.1.1 // indirect
- github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
- github.com/benbjohnson/clock v1.3.0 // indirect
+ github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 // indirect
+ github.com/agnivade/levenshtein v1.2.1 // indirect
+ github.com/benbjohnson/clock v1.3.5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
- github.com/btcsuite/btcd v0.23.1 // indirect
- github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect
- github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect
+ github.com/bits-and-blooms/bitset v1.20.0 // indirect
+ github.com/cespare/cp v1.1.1 // indirect
github.com/cespare/xxhash v1.1.0 // indirect
- github.com/cespare/xxhash/v2 v2.2.0 // indirect
- github.com/containerd/cgroups v1.0.4 // indirect
- github.com/coreos/go-systemd/v22 v22.5.0 // indirect
- github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
- github.com/d4l3k/messagediff v1.2.1 // indirect
+ github.com/cespare/xxhash/v2 v2.3.0 // indirect
+ github.com/clipperhouse/uax29/v2 v2.7.0 // indirect
+ github.com/consensys/gnark-crypto v0.18.1 // indirect
+ github.com/crate-crypto/go-eth-kzg v1.5.0 // indirect
+ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
- github.com/deckarep/golang-set v1.8.0 // indirect
+ github.com/deckarep/golang-set/v2 v2.6.0 // indirect
github.com/dgraph-io/ristretto v0.1.0 // indirect
- github.com/docker/go-units v0.5.0 // indirect
- github.com/dustin/go-humanize v1.0.1 // indirect
- github.com/elastic/gosigar v0.14.2 // indirect
- github.com/flynn/noise v1.0.0 // indirect
- github.com/francoispqt/gojay v1.2.13 // indirect
- github.com/fsnotify/fsnotify v1.5.4 // indirect
- github.com/gdamore/encoding v1.0.0 // indirect
- github.com/ghodss/yaml v1.0.0 // indirect
- github.com/go-openapi/jsonpointer v0.19.5 // indirect
- github.com/go-openapi/jsonreference v0.19.6 // indirect
- github.com/go-openapi/spec v0.20.4 // indirect
- github.com/go-openapi/swag v0.19.15 // indirect
+ github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da // indirect
+ github.com/dunglas/httpsfv v1.1.0 // indirect
+ github.com/ethereum/c-kzg-4844/v2 v2.1.6 // indirect
+ github.com/filecoin-project/go-clock v0.1.0 // indirect
+ github.com/flynn/noise v1.1.0 // indirect
+ github.com/fsnotify/fsnotify v1.10.1 // indirect
+ github.com/gdamore/encoding v1.0.1 // indirect
+ github.com/go-logr/logr v1.4.3 // indirect
+ github.com/go-logr/stdr v1.2.2 // indirect
+ github.com/go-openapi/jsonpointer v0.19.6 // indirect
+ github.com/go-openapi/jsonreference v0.20.2 // indirect
+ github.com/go-openapi/spec v0.20.9 // indirect
+ github.com/go-openapi/swag v0.22.3 // indirect
github.com/go-playground/form/v4 v4.2.0 // indirect
- github.com/go-stack/stack v1.8.0 // indirect
- github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
+ github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/gobwas/glob v0.2.3 // indirect
- github.com/godbus/dbus/v5 v5.1.0 // indirect
+ github.com/goccy/go-json v0.10.6 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
- github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
- github.com/golang/glog v1.0.0 // indirect
+ github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
+ github.com/golang/glog v1.2.5 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
- github.com/golang/mock v1.6.0 // indirect
- github.com/golang/snappy v0.0.4 // indirect
- github.com/google/flatbuffers v1.12.0 // indirect
+ github.com/golang/protobuf v1.5.4 // indirect
+ github.com/golang/snappy v1.0.0 // indirect
+ github.com/google/flatbuffers v25.2.10+incompatible // indirect
github.com/google/gopacket v1.1.19 // indirect
- github.com/google/pprof v0.0.0-20221203041831-ce31453925ec // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
- github.com/hashicorp/errwrap v1.1.0 // indirect
- github.com/hashicorp/go-multierror v1.1.1 // indirect
- github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect
- github.com/hashicorp/golang-lru/v2 v2.0.1 // indirect
- github.com/hashicorp/hcl v1.0.0 // indirect
- github.com/huin/goupnp v1.0.3 // indirect
- github.com/inconshreveable/mousetrap v1.0.0 // indirect
- github.com/ipfs/go-cid v0.3.2 // indirect
- github.com/ipfs/go-datastore v0.6.0 // indirect
- github.com/ipfs/go-ipns v0.2.0 // indirect
- github.com/ipfs/go-log v1.0.5 // indirect
- github.com/ipld/go-ipld-prime v0.9.0 // indirect
+ github.com/hashicorp/golang-lru v1.0.2 // indirect
+ github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
+ github.com/holiman/uint256 v1.3.2 // indirect
+ github.com/huin/goupnp v1.3.0 // indirect
+ github.com/inconshreveable/mousetrap v1.1.0 // indirect
+ github.com/ipfs/boxo v0.39.0 // indirect
+ github.com/ipfs/go-cid v0.6.1 // indirect
+ github.com/ipfs/go-datastore v0.9.1 // indirect
+ github.com/ipld/go-ipld-prime v0.23.0 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
- github.com/jbenet/goprocess v0.1.4 // indirect
github.com/josharian/intern v1.0.0 // indirect
- github.com/klauspost/cpuid/v2 v2.2.4 // indirect
- github.com/koron/go-ssdp v0.0.3 // indirect
+ github.com/klauspost/cpuid/v2 v2.3.0 // indirect
+ github.com/koron/go-ssdp v0.0.6 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
+ github.com/lestrrat-go/blackmagic v1.0.4 // indirect
+ github.com/lestrrat-go/dsig v1.2.1 // indirect
+ github.com/lestrrat-go/dsig-secp256k1 v1.0.0 // indirect
+ github.com/lestrrat-go/httpcc v1.0.1 // indirect
+ github.com/lestrrat-go/httprc/v3 v3.0.5 // indirect
+ github.com/lestrrat-go/jwx/v3 v3.1.1 // indirect
+ github.com/lestrrat-go/option/v2 v2.0.0 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-cidranger v1.1.0 // indirect
- github.com/libp2p/go-flow-metrics v0.1.0 // indirect
- github.com/libp2p/go-libp2p-asn-util v0.3.0 // indirect
- github.com/libp2p/go-libp2p-kbucket v0.5.0 // indirect
- github.com/libp2p/go-libp2p-record v0.2.0 // indirect
- github.com/libp2p/go-libp2p-routing-helpers v0.4.0 // indirect
- github.com/libp2p/go-nat v0.1.0 // indirect
- github.com/libp2p/go-netroute v0.2.1 // indirect
- github.com/libp2p/go-openssl v0.1.0 // indirect
- github.com/libp2p/go-reuseport v0.2.0 // indirect
- github.com/libp2p/go-yamux/v4 v4.0.0 // indirect
- github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
- github.com/magiconair/properties v1.8.6 // indirect
+ github.com/libp2p/go-flow-metrics v0.3.0 // indirect
+ github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
+ github.com/libp2p/go-libp2p-kbucket v0.8.0 // indirect
+ github.com/libp2p/go-libp2p-record v0.3.1 // indirect
+ github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
+ github.com/libp2p/go-netroute v0.4.0 // indirect
+ github.com/libp2p/go-reuseport v0.4.0 // indirect
+ github.com/libp2p/go-yamux/v5 v5.0.1 // indirect
+ github.com/lucasb-eyer/go-colorful v1.4.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
- github.com/mattn/go-colorable v0.1.13 // indirect
- github.com/mattn/go-isatty v0.0.17 // indirect
- github.com/mattn/go-pointer v0.0.1 // indirect
- github.com/mattn/go-runewidth v0.0.13 // indirect
+ github.com/mattn/go-colorable v0.1.15 // indirect
+ github.com/mattn/go-isatty v0.0.22 // indirect
+ github.com/mattn/go-runewidth v0.0.22 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
- github.com/miekg/dns v1.1.50 // indirect
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
- github.com/minio/highwayhash v1.0.1 // indirect
- github.com/minio/sha256-simd v1.0.0 // indirect
+ github.com/minio/sha256-simd v1.0.1 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
- github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
- github.com/mr-tron/base58 v1.2.0 // indirect
+ github.com/mr-tron/base58 v1.3.0 // indirect
github.com/multiformats/go-base32 v0.1.0 // indirect
github.com/multiformats/go-base36 v0.2.0 // indirect
- github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect
+ github.com/multiformats/go-multiaddr-dns v0.5.0 // indirect
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
- github.com/multiformats/go-multibase v0.1.1 // indirect
- github.com/multiformats/go-multicodec v0.8.1 // indirect
- github.com/multiformats/go-multihash v0.2.1 // indirect
- github.com/multiformats/go-multistream v0.4.1 // indirect
- github.com/multiformats/go-varint v0.0.7 // indirect
- github.com/onsi/ginkgo/v2 v2.5.1 // indirect
- github.com/opencontainers/runtime-spec v1.0.2 // indirect
- github.com/opentracing/opentracing-go v1.2.0 // indirect
+ github.com/multiformats/go-multibase v0.3.0 // indirect
+ github.com/multiformats/go-multicodec v0.10.0 // indirect
+ github.com/multiformats/go-multihash v0.2.3 // indirect
+ github.com/multiformats/go-multistream v0.6.1 // indirect
+ github.com/multiformats/go-varint v0.1.0 // indirect
+ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
- github.com/pelletier/go-toml v1.9.5 // indirect
- github.com/pelletier/go-toml/v2 v2.0.1 // indirect
+ github.com/pelletier/go-toml/v2 v2.2.4 // indirect
+ github.com/pion/datachannel v1.5.10 // indirect
+ github.com/pion/dtls/v3 v3.1.2 // indirect
+ github.com/pion/ice/v4 v4.0.10 // indirect
+ github.com/pion/interceptor v0.1.40 // indirect
+ github.com/pion/logging v0.2.4 // indirect
+ github.com/pion/mdns/v2 v2.0.7 // indirect
+ github.com/pion/randutil v0.1.0 // indirect
+ github.com/pion/rtcp v1.2.16 // indirect
+ github.com/pion/rtp v1.8.19 // indirect
+ github.com/pion/sctp v1.8.39 // indirect
+ github.com/pion/sdp/v3 v3.0.18 // indirect
+ github.com/pion/srtp/v3 v3.0.6 // indirect
+ github.com/pion/stun/v3 v3.1.1 // indirect
+ github.com/pion/transport/v3 v3.0.7 // indirect
+ github.com/pion/transport/v4 v4.0.1 // indirect
+ github.com/pion/turn/v4 v4.0.2 // indirect
+ github.com/pion/webrtc/v4 v4.1.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
- github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1 // indirect
- github.com/prometheus/procfs v0.8.0 // indirect
- github.com/prysmaticlabs/fastssz v0.0.0-20220628121656-93dfe28febab // indirect
- github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect
- github.com/prysmaticlabs/gohashtree v0.0.2-alpha // indirect
- github.com/quic-go/qpack v0.4.0 // indirect
- github.com/quic-go/qtls-go1-19 v0.2.1 // indirect
- github.com/quic-go/qtls-go1-20 v0.1.1 // indirect
- github.com/quic-go/quic-go v0.33.0 // indirect
- github.com/quic-go/webtransport-go v0.5.2 // indirect
- github.com/raulk/go-watchdog v1.3.0 // indirect
- github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect
- github.com/rivo/uniseg v0.2.0 // indirect
- github.com/rjeczalik/notify v0.9.1 // indirect
- github.com/russross/blackfriday/v2 v2.1.0 // indirect
- github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect
+ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
+ github.com/polydawn/refmt v0.89.1-0.20231129105047-37766d95467a // indirect
+ github.com/prometheus/procfs v0.20.1 // indirect
+ github.com/quic-go/qpack v0.6.0 // indirect
+ github.com/quic-go/quic-go v0.59.0 // indirect
+ github.com/quic-go/webtransport-go v0.10.0 // indirect
+ github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect
+ github.com/rivo/uniseg v0.4.7 // indirect
+ github.com/sagikazarmark/locafero v0.11.0 // indirect
+ github.com/segmentio/asm v1.2.1 // indirect
+ github.com/shirou/gopsutil v3.21.11+incompatible // indirect
+ github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
- github.com/spf13/afero v1.8.2 // indirect
- github.com/spf13/cast v1.5.0 // indirect
- github.com/spf13/jwalterweatherman v1.1.0 // indirect
- github.com/spf13/pflag v1.0.5 // indirect
- github.com/subosito/gotenv v1.3.0 // indirect
- github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a // indirect
- github.com/urfave/cli/v2 v2.10.2 // indirect
+ github.com/spf13/afero v1.15.0 // indirect
+ github.com/spf13/cast v1.10.0 // indirect
+ github.com/subosito/gotenv v1.6.0 // indirect
+ github.com/supranational/blst v0.3.16 // indirect
+ github.com/sv-tools/openapi v0.2.1 // indirect
+ github.com/swaggo/files/v2 v2.0.0 // indirect
+ github.com/swaggo/swag/v2 v2.0.0-rc4 // indirect
+ github.com/tchap/go-patricia/v2 v2.3.3 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
- github.com/valyala/fasttemplate v1.2.1 // indirect
+ github.com/valyala/fastjson v1.6.10 // indirect
+ github.com/valyala/fasttemplate v1.2.2 // indirect
+ github.com/vektah/gqlparser/v2 v2.5.33 // indirect
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
+ github.com/wlynxg/anet v0.0.5 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
- github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
- github.com/yashtewari/glob-intersection v0.1.0 // indirect
+ github.com/yashtewari/glob-intersection v0.2.0 // indirect
+ github.com/yusufpapurcu/wmi v1.2.2 // indirect
go.opencensus.io v0.24.0 // indirect
- go.uber.org/atomic v1.10.0 // indirect
- go.uber.org/dig v1.15.0 // indirect
- go.uber.org/fx v1.18.2 // indirect
- go.uber.org/multierr v1.9.0 // indirect
- golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect
- golang.org/x/mod v0.7.0 // indirect
- golang.org/x/net v0.6.0 // indirect
- golang.org/x/sync v0.1.0 // indirect
- golang.org/x/sys v0.6.0 // indirect
- golang.org/x/text v0.7.0 // indirect
- golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect
- golang.org/x/tools v0.3.0 // indirect
- google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect
- google.golang.org/grpc v1.46.2 // indirect
- gopkg.in/ini.v1 v1.66.4 // indirect
+ go.opentelemetry.io/auto/sdk v1.2.1 // indirect
+ go.opentelemetry.io/otel v1.43.0 // indirect
+ go.opentelemetry.io/otel/metric v1.43.0 // indirect
+ go.opentelemetry.io/otel/trace v1.43.0 // indirect
+ go.uber.org/dig v1.19.0 // indirect
+ go.uber.org/fx v1.24.0 // indirect
+ go.uber.org/mock v0.5.2 // indirect
+ go.uber.org/multierr v1.11.0 // indirect
+ go.yaml.in/yaml/v2 v2.4.4 // indirect
+ go.yaml.in/yaml/v3 v3.0.4 // indirect
+ golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f // indirect
+ golang.org/x/mod v0.36.0 // indirect
+ golang.org/x/net v0.56.0 // indirect
+ golang.org/x/sync v0.21.0 // indirect
+ golang.org/x/sys v0.46.0 // indirect
+ golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 // indirect
+ golang.org/x/text v0.38.0 // indirect
+ golang.org/x/time v0.15.0 // indirect
+ golang.org/x/tools v0.45.0 // indirect
+ gonum.org/v1/gonum v0.17.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- lukechampine.com/blake3 v1.1.7 // indirect
- nhooyr.io/websocket v1.8.7 // indirect
+ lukechampine.com/blake3 v1.4.1 // indirect
+ sigs.k8s.io/yaml v1.6.0 // indirect
)
diff --git a/go.sum b/go.sum
index e007b183..b000a3b9 100644
--- a/go.sum
+++ b/go.sum
@@ -1,11 +1,10 @@
+c2sp.org/CCTV/age v0.0.0-20240306222714-3ec4d716e805 h1:u2qwJeEvnypw+OCPUHmoZE3IqwfuN5kgDfo5MLzpNM0=
+c2sp.org/CCTV/age v0.0.0-20240306222714-3ec4d716e805/go.mod h1:FomMrUJ2Lxt5jCLmZkG3FHa72zUprnhd3v/Z18Snm4w=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
@@ -18,7 +17,9 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
-cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
+cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
+cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
+cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
@@ -27,6 +28,7 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
@@ -36,23 +38,19 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
-code.rocketnine.space/tslocum/cbind v0.1.5 h1:i6NkeLLNPNMS4NWNi3302Ay3zSU6MrqOT+yJskiodxE=
-code.rocketnine.space/tslocum/cbind v0.1.5/go.mod h1:LtfqJTzM7qhg88nAvNhx+VnTjZ0SXBJtxBObbfBWo/M=
-code.rocketnine.space/tslocum/cview v1.5.6 h1:W0HJFIIgly3LzYoTitZIIaYDDqW0u/qmA0B6jWzw6R0=
-code.rocketnine.space/tslocum/cview v1.5.6/go.mod h1:RogJMObbKuGiP8+9WsFsHpPeQQqgkCXgvTLxh7IH5eE=
-dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU=
-dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
-dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
-filippo.io/age v1.1.1 h1:pIpO7l151hCnQ4BdyBujnGP2YlUo0uj6sAVNHGBvXHg=
-filippo.io/age v1.1.1/go.mod h1:l03SrzDUrBkdBx8+IILdnn2KZysqQdbEBUQ4p3sqEQE=
-git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
+filippo.io/age v1.2.1 h1:X0TZjehAZylOIj4DubWYU1vWQxv9bJpo+Uu2/LGhi1o=
+filippo.io/age v1.2.1/go.mod h1:JL9ew2lTN+Pyft4RiNGguFfOpewKwSHm5ayKD/A4004=
+filippo.io/bigmod v0.1.1-0.20260103110540-f8a47775ebe5 h1:JA0fFr+kxpqTdxR9LOBiTWpGNchqmkcsgmdeJZRclZ0=
+filippo.io/bigmod v0.1.1-0.20260103110540-f8a47775ebe5/go.mod h1:OjOXDNlClLblvXdwgFFOQFJEocLhhtai8vGLy0JCZlI=
+filippo.io/keygen v0.0.0-20260114151900-8e2790ea4c5b h1:REI1FbdW71yO56Are4XAxD+OS/e+BQsB3gE4mZRQEXY=
+filippo.io/keygen v0.0.0-20260114151900-8e2790ea4c5b/go.mod h1:9nnw1SlYHYuPSo/3wjQzNjSbeHlq2NsKo5iEtfJPWP0=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I=
-github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
+github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/Jorropo/jsync v1.0.1 h1:6HgRolFZnsdfzRUj+ImB9og1JYOxQoReSywkHOGSaUU=
+github.com/Jorropo/jsync v1.0.1/go.mod h1:jCOZj3vrBCri3bSU3ErUYvevKlnbssrXeCivybS5ABQ=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/NebulousLabs/errors v0.0.0-20181203160057-9f787ce8f69e h1:9UwdEr0AFI021vXG+hXDGH9ZHGuNtPCdJkRTqcIhJ3A=
@@ -66,53 +64,43 @@ github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8
github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q=
github.com/Press-One/go-update v1.0.0 h1:jXRL7ofvnIdRw0FsxBb/16leY/YkGpOURGb4hiFGtd4=
github.com/Press-One/go-update v1.0.0/go.mod h1:XB4kqDenDoFMLMSzeDS2yaFBav8mKq3DLIU/lFf01Ac=
-github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
-github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
-github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
-github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46 h1:5sXbqlSomvdjlRbWyNqkPsJ3Fg+tQZCbgeX1VGljbQY=
-github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o=
+github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 h1:1zYrtlhrZ6/b6SAjLSfKzWtdgqK0U+HtH/VcBWh1BaU=
+github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI=
github.com/adrg/xdg v0.3.3 h1:s/tV7MdqQnzB1nKY8aqHvAMD+uCiuEDzVB5HLRY849U=
github.com/adrg/xdg v0.3.3/go.mod h1:61xAR2VZcggl2St4O9ohF5qCKe08+JDmE4VNzPFQvOQ=
-github.com/agiledragon/gomonkey/v2 v2.3.1 h1:k+UnUY0EMNYUFUAQVETGY9uUTxjMdnUkP0ARyJS1zzs=
-github.com/agiledragon/gomonkey/v2 v2.3.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY=
-github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
-github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
+github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM=
+github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU=
+github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
+github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
+github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
+github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
+github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
-github.com/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM=
-github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
-github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
-github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
+github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
-github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
-github.com/btcsuite/btcd v0.23.1 h1:IB8cVQcC2X5mHbnfirLG5IZnkWYNTPlLZVrxUYSotbE=
-github.com/btcsuite/btcd v0.23.1/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY=
-github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k=
-github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU=
-github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
-github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
-github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
-github.com/bytecodealliance/wasmtime-go v0.35.0 h1:VZjaZ0XOY0qp9TQfh0CQj9zl/AbdeXePVTALy8V1sKs=
-github.com/bytecodealliance/wasmtime-go v0.35.0/go.mod h1:q320gUxqyI8yB+ZqRuaJOEnGkAnHh6WtJjMaT2CW4wI=
-github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
+github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU=
+github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
+github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
+github.com/bytecodealliance/wasmtime-go/v44 v44.0.0 h1:WRZXnLPIer/TWs5aYPaMlmVcOlzmR6Ur6wjLRIQOhTQ=
+github.com/bytecodealliance/wasmtime-go/v44 v44.0.0/go.mod h1:GP93piU+39CoFVCQ5xfHrPOUtL0APlMnkbblJ2d3YY0=
+github.com/canonical/go-sp800.90a-drbg v0.0.0-20210314144037-6eeb1040d6c3 h1:oe6fCvaEpkhyW3qAicT0TnGtyht/UrgvOwMcEgLb7Aw=
+github.com/canonical/go-sp800.90a-drbg v0.0.0-20210314144037-6eeb1040d6c3/go.mod h1:qdP0gaj0QtgX2RUZhnlVrceJ+Qln8aSlDyJwelLLFeM=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU=
+github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
-github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chux0519/badger/v3 v3.2103.3 h1:ZUOQ4PoPmEuloYPuII/VvwtExLPl23Qi2XJfV+T8VoI=
github.com/chux0519/badger/v3 v3.2103.3/go.mod h1:bp8LpW+XFgf6aXrBOmJCoOJUfNIfKkJI6clHr9hc+do=
github.com/chux0519/ristretto v0.1.1 h1:2qG1fLeoNfnOifo71z+96//ZPglIc+JDSm+OCmdbrVI=
@@ -120,178 +108,152 @@ github.com/chux0519/ristretto v0.1.1/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6
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/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk=
+github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
-github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
-github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA=
-github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA=
+github.com/consensys/gnark-crypto v0.18.1 h1:RyLV6UhPRoYYzaFnPQA4qK3DyuDgkTgskDdoGqFt3fI=
+github.com/consensys/gnark-crypto v0.18.1/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
-github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
-github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
-github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
-github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
+github.com/crate-crypto/go-eth-kzg v1.5.0 h1:FYRiJMJG2iv+2Dy3fi14SVGjcPteZ5HAAUe4YWlJygc=
+github.com/crate-crypto/go-eth-kzg v1.5.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U=
-github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU=
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U=
-github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4=
-github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo=
-github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4=
-github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc=
+github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM=
+github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
+github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8=
+github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 h1:5RVFMOWjMyRy8cARdy79nAmgYw3hK/4HUq48LQ6Wwqo=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
+github.com/dgraph-io/badger/v4 v4.9.1 h1:DocZXZkg5JJHJPtUErA0ibyHxOVUDVoXLSCV6t8NC8w=
+github.com/dgraph-io/badger/v4 v4.9.1/go.mod h1:5/MEx97uzdPUHR4KtkNt8asfI2T4JiEiQlV7kWUo8c0=
+github.com/dgraph-io/ristretto/v2 v2.2.0 h1:bkY3XzJcXoMuELV8F+vS8kzNgicwQFAaGINAEJdWGOM=
+github.com/dgraph-io/ristretto/v2 v2.2.0/go.mod h1:RZrm63UmcBAaYWC1DotLYBmTvgkrs0+XhBd7Npn7/zI=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
-github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y=
-github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
-github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
-github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
-github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
-github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
+github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38=
+github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
+github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo=
+github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
+github.com/dunglas/httpsfv v1.1.0 h1:Jw76nAyKWKZKFrpMMcL76y35tOpYHqQPzHQiwDvpe54=
+github.com/dunglas/httpsfv v1.1.0/go.mod h1:zID2mqw9mFsnt7YC3vYQ9/cjq30q41W+1AnDwH8TiMg=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
-github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
github.com/edwingeng/deque/v2 v2.1.1 h1:+xjC3TnaeMPLZMi7QQf9jN2K00MZmTwruApqplbL9IY=
github.com/edwingeng/deque/v2 v2.1.1/go.mod h1:HukI8CQe9KDmZCcURPZRYVYjH79Zy2tIjTF9sN3Bgb0=
-github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
-github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4=
-github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
+github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A=
+github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
-github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
-github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/ethereum/go-ethereum v1.10.23 h1:Xk8XAT4/UuqcjMLIMF+7imjkg32kfVFKoeyQDaO2yWM=
-github.com/ethereum/go-ethereum v1.10.23/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg=
-github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
-github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
-github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
-github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
-github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ=
-github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
+github.com/ethereum/c-kzg-4844/v2 v2.1.6 h1:xQymkKCT5E2Jiaoqf3v4wsNgjZLY0lRSkZn27fRjSls=
+github.com/ethereum/c-kzg-4844/v2 v2.1.6/go.mod h1:8HMkUZ5JRv4hpw/XUrYWSQNAUzhHMg2UDb/U+5m+XNw=
+github.com/ethereum/go-ethereum v1.17.3 h1:Ev/sQHH+UdKZHWjuVzhu2pxhi/sXaPZl23Q+Q5LDd4Q=
+github.com/ethereum/go-ethereum v1.17.3/go.mod h1:f2EhRwqewIZkGoQekywI2Y2RZAMTSavLNkD9qItFy1A=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
+github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
+github.com/ferranbt/fastssz v0.1.4 h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeDY=
+github.com/ferranbt/fastssz v0.1.4/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg=
+github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU=
+github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs=
+github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg=
+github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
-github.com/foxcpp/go-mockdns v0.0.0-20210729171921-fb145fc6f897 h1:E52jfcE64UG42SwLmrW0QByONfGynWuzBvm86BoB9z8=
-github.com/foxcpp/go-mockdns v0.0.0-20210729171921-fb145fc6f897/go.mod h1:lgRN6+KxQBawyIghpnl5CezHFGS9VLzvtVlwxvzXTQ4=
-github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk=
-github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY=
-github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
-github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
+github.com/foxcpp/go-mockdns v1.2.0 h1:omK3OrHRD1IWJz1FuFBCFquhXslXoF17OvBS6JPzZF0=
+github.com/foxcpp/go-mockdns v1.2.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk=
+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
+github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
-github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
-github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
-github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho=
+github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo=
github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
+github.com/gdamore/encoding v1.0.1 h1:YzKZckdBL6jVt2Gc+5p82qhrGiqMdG/eNs6Wy0u3Uhw=
+github.com/gdamore/encoding v1.0.1/go.mod h1:0Z0cMFinngz9kS1QfMjCP8TY7em3bZYeeklsSDPivEo=
github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU=
github.com/gdamore/tcell/v2 v2.3.11/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU=
github.com/gdamore/tcell/v2 v2.4.0 h1:W6dxJEmaxYvhICFoTY3WrLLEXsQ11SaFnKGVEXW57KM=
github.com/gdamore/tcell/v2 v2.4.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU=
-github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
-github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
-github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
-github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
-github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
-github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-ini/ini v1.66.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
-github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
-github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
-github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
-github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
-github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
-github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY=
+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
+github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
+github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
-github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
-github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=
-github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
+github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
+github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
+github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=
+github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
+github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
+github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8=
+github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=
github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
+github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
+github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/form/v4 v4.2.0 h1:N1wh+Goz61e6w66vo8vJkQt+uwZSoLz50kZPJWR8eic=
github.com/go-playground/form/v4 v4.2.0/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U=
-github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
-github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
-github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
-github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0=
-github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
-github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
-github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
+github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ=
+github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
+github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
+github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
+github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
-github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0=
-github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
-github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8=
-github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
-github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo=
-github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
-github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/goccy/go-json v0.10.6 h1:p8HrPJzOakx/mn/bQtjgNjdTcN+/S6FcG2CTtQOrHVU=
+github.com/goccy/go-json v0.10.6/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
-github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
+github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
-github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
-github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
-github.com/golang-jwt/jwt/v4 v4.4.1 h1:pC5DB52sCeK48Wlb9oPcdhnjkz1TKt1D/P7WKJ0kUcQ=
-github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
+github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
+github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
-github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
+github.com/golang/glog v1.2.5 h1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I=
+github.com/golang/glog v1.2.5/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
@@ -299,8 +261,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
-github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
-github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
+github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -316,15 +277,18 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
-github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
-github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
+github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/flatbuffers v1.12.0 h1:/PtAHvnBY4Kqnx/xCQ3OIV9uYcSFGScBsWI3Oogeh6w=
github.com/google/flatbuffers v1.12.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
+github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q=
+github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
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=
@@ -337,16 +301,11 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
-github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
-github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
-github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
-github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
@@ -363,210 +322,191 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20221203041831-ce31453925ec h1:fR20TYVVwhK4O7r7y+McjRYyaTH6/vjwJOajE+XhlzM=
-github.com/google/pprof v0.0.0-20221203041831-ce31453925ec/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo=
+github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
-github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
-github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
-github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
-github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
-github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
+github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=
+github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=
+github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
+github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
-github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg=
-github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY=
+github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
+github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
-github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
-github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
+github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
+github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
+github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs=
-github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
-github.com/hashicorp/golang-lru/v2 v2.0.1 h1:5pv5N1lT1fjLg2VQ5KWc7kmucp2x/kvFOnxuVTqZ6x4=
-github.com/hashicorp/golang-lru/v2 v2.0.1/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
-github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
+github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
+github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
-github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e h1:wCMygKUQhmcQAjlk2Gquzq6dLmyMv2kF+llRspoRgrk=
-github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
-github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM=
-github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc=
-github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ=
-github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y=
-github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o=
+github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
+github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA=
+github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E=
+github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc=
+github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M=
-github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc=
-github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw=
-github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk=
-github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8=
+github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
+github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/ipfs/boxo v0.39.0 h1:u9jLf5pLx5SWROXjHtj8VMvv+iDlMbiTyZ/vVTQ4VhI=
+github.com/ipfs/boxo v0.39.0/go.mod h1:k9YCvMjytFguMHndEiGdCGMMj4b7CkdOT44vtgAxOdk=
+github.com/ipfs/go-block-format v0.2.3 h1:mpCuDaNXJ4wrBJLrtEaGFGXkferrw5eqVvzaHhtFKQk=
+github.com/ipfs/go-block-format v0.2.3/go.mod h1:WJaQmPAKhD3LspLixqlqNFxiZ3BZ3xgqxxoSR/76pnA=
+github.com/ipfs/go-cid v0.6.1 h1:T5TnNb08+ueovG76Z5gx1L4Y7QOaGTXHg1F6raWFxIc=
+github.com/ipfs/go-cid v0.6.1/go.mod h1:zrY0SwOhjrrIdfPQ/kf+k1sXyJ0QE7cMxfCployLBs0=
+github.com/ipfs/go-datastore v0.9.1 h1:67Po2epre/o0UxrmkzdS9ZTe2GFGODgTd2odx8Wh6Yo=
+github.com/ipfs/go-datastore v0.9.1/go.mod h1:zi07Nvrpq1bQwSkEnx3bfjz+SQZbdbWyCNvyxMh9pN0=
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
-github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8=
-github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ=
-github.com/ipfs/go-ipns v0.2.0 h1:BgmNtQhqOw5XEZ8RAfWEpK4DhqaYiuP6h71MhIp7xXU=
-github.com/ipfs/go-ipns v0.2.0/go.mod h1:3cLT2rbvgPZGkHJoPO1YMJeh6LtkxopCkKFcio/wE24=
-github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
-github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
-github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
-github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY=
-github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
-github.com/ipld/go-ipld-prime v0.9.0 h1:N2OjJMb+fhyFPwPnVvJcWU/NsumP8etal+d2v3G4eww=
-github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8=
+github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0=
+github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs=
+github.com/ipfs/go-log/v2 v2.9.2 h1:O/5BB0elpkRILvT24rCJ5976wWd7u0nJ436T3rdYdc4=
+github.com/ipfs/go-log/v2 v2.9.2/go.mod h1:RziRwwXWhndlk8L75RnEe0zeAYaq2heKtEMc3jqUov0=
+github.com/ipfs/go-test v0.3.0 h1:0Y4Uve3tp9HI+2lIJjfOliOrOgv/YpXg/l1y3P4DEYE=
+github.com/ipfs/go-test v0.3.0/go.mod h1:JK+U8pRpATZb7lsYNSJlCj3WYB3cFfWIbI6nWRM/GFk=
+github.com/ipld/go-ipld-prime v0.23.0 h1:csqdPZH60BsTC+AZrv7fpa27v+09I/oTqyHYYYE27eE=
+github.com/ipld/go-ipld-prime v0.23.0/go.mod h1:46YCFSFNFBJHPjB0pfMuv7Ly7df2eChpkpyPo5SE0bA=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
-github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk=
github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk=
-github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o=
-github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
-github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
-github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
-github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
-github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/kevinms/leakybucket-go v0.0.0-20200115003610-082473db97ca h1:qNtd6alRqd3qOdPrKXMZImV192ngQ0WSh1briEO33Tk=
github.com/kevinms/leakybucket-go v0.0.0-20200115003610-082473db97ca/go.mod h1:ph+C5vpnCcQvKBwJwKLTK3JLNGnBXYlG7m7JjoC/zYA=
-github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
-github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
-github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM=
-github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
-github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
-github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
-github.com/klauspost/reedsolomon v1.11.5 h1:8ebqrZbby2dplht2gUPplizNlvYGCghRRfq5F9SFYKM=
-github.com/klauspost/reedsolomon v1.11.5/go.mod h1:lbYSjK96uTl22BD+PzgzlsCal+PW/0yLKlQP4MMT+i4=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
-github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8=
-github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA=
+github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao=
+github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
+github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
+github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
+github.com/klauspost/reedsolomon v1.14.1 h1:swE9kzyWXD/wVG+l5Pe8bWnQ0giIY7D1GjCBKk3kG2U=
+github.com/klauspost/reedsolomon v1.14.1/go.mod h1:yjqqjgMTQkBUHSG97/rm4zipffCNbCiZcB3kTqr++sQ=
+github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU=
+github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/labstack/echo/v4 v4.9.0 h1:wPOF1CE6gvt/kmbMR4dGzWvHMPT+sAEUJOwOTtvITVY=
-github.com/labstack/echo/v4 v4.9.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks=
-github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o=
-github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=
-github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
+github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
+github.com/labstack/echo-jwt/v4 v4.4.0 h1:nrXaEnJupfc2R4XChcLRDyghhMZup77F8nIzHnBK19U=
+github.com/labstack/echo-jwt/v4 v4.4.0/go.mod h1:kYXWgWms9iFqI3ldR+HAEj/Zfg5rZtR7ePOgktG4Hjg=
+github.com/labstack/echo/v4 v4.15.4 h1:DL45vVYa+BWE+XuW+zZNd9H0YEdZ80UAWJGcTVW4EVs=
+github.com/labstack/echo/v4 v4.15.4/go.mod h1:CuMetKIRwsuO/qlAgMq+KTAalwGoB/h4tC+yPdrTj1g=
+github.com/labstack/gommon v0.5.0 h1:6VSQ2NOzsnEJ5W6+84E0RbcaDDmgB6NIAzWCczTEe6c=
+github.com/labstack/gommon v0.5.0/go.mod h1:Rzlg7HHy1maLfzBYGg9NZcVuz1sA68HHhLjhcEllYE0=
+github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4=
+github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c=
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
+github.com/lestrrat-go/blackmagic v1.0.4 h1:IwQibdnf8l2KoO+qC3uT4OaTWsW7tuRQXy9TRN9QanA=
+github.com/lestrrat-go/blackmagic v1.0.4/go.mod h1:6AWFyKNNj0zEXQYfTMPfZrAXUWUfTIZ5ECEUEJaijtw=
+github.com/lestrrat-go/dsig v1.2.1 h1:MwxzZhE4+4fguHi+uDALKVlC3Cn+O1QU1Q/F8D7hVIc=
+github.com/lestrrat-go/dsig v1.2.1/go.mod h1:RD2eOaidyPvpc7IJQoO3Qq52RWdy8ZcJs8lrOnoa1Kc=
+github.com/lestrrat-go/dsig-secp256k1 v1.0.0 h1:JpDe4Aybfl0soBvoVwjqDbp+9S1Y2OM7gcrVVMFPOzY=
+github.com/lestrrat-go/dsig-secp256k1 v1.0.0/go.mod h1:CxUgAhssb8FToqbL8NjSPoGQlnO4w3LG1P0qPWQm/NU=
+github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE=
+github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E=
+github.com/lestrrat-go/httprc/v3 v3.0.5 h1:S+Mb4L2I+bM6JGTibLmxExhyTOqnXjqx+zi9MoXw/TM=
+github.com/lestrrat-go/httprc/v3 v3.0.5/go.mod h1:mSMtkZW92Z98M5YoNNztbRGxbXHql7tSitCvaxvo9l0=
+github.com/lestrrat-go/jwx/v3 v3.1.1 h1:yd9AdPmZ4INnQ7k42IrzXYpnEG803+SrQ6hdMvzHJzw=
+github.com/lestrrat-go/jwx/v3 v3.1.1/go.mod h1:uw/MN2M/Xiu4FhwcIwH11Zsh9JWx9SWzgALl7/uIEkU=
+github.com/lestrrat-go/option/v2 v2.0.0 h1:XxrcaJESE1fokHy3FpaQ/cXW8ZsIdWcdFzzLOcID3Ss=
+github.com/lestrrat-go/option/v2 v2.0.0/go.mod h1:oSySsmzMoR0iRzCDCaUfsCzxQHUEuhOViQObyy7S6Vg=
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c=
github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic=
-github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM=
-github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro=
-github.com/libp2p/go-libp2p v0.25.1 h1:YK+YDCHpYyTvitKWVxa5PfElgIpOONU01X5UcLEwJGA=
-github.com/libp2p/go-libp2p v0.25.1/go.mod h1:xnK9/1d9+jeQCVvi/f1g12KqtVi/jP/SijtKV1hML3g=
-github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s=
-github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w=
-github.com/libp2p/go-libp2p-core v0.17.0 h1:QGU8mlxHytwTc4pq/aVQX9VDoAPiCHxfe/oOSwF+YDg=
-github.com/libp2p/go-libp2p-core v0.17.0/go.mod h1:h/iAbFij28ASmI+tvXfjoipg1g2N33O4UN6LIb6QfoU=
-github.com/libp2p/go-libp2p-kad-dht v0.21.0 h1:J0Yd22VA+sk0CJRGMgtfHvLVIkZDyJ3AJGiljywIw5U=
-github.com/libp2p/go-libp2p-kad-dht v0.21.0/go.mod h1:Bhm9diAFmc6qcWAr084bHNL159srVZRKADdp96Qqd1I=
-github.com/libp2p/go-libp2p-kbucket v0.5.0 h1:g/7tVm8ACHDxH29BGrpsQlnNeu+6OF1A9bno/4/U1oA=
-github.com/libp2p/go-libp2p-kbucket v0.5.0/go.mod h1:zGzGCpQd78b5BNTDGHNDLaTt9aDK/A02xeZp9QeFC4U=
-github.com/libp2p/go-libp2p-pubsub v0.9.2 h1:CoWrvqtIbk+8iTLk1yCN8zODMgBSCqRgyVCvHaGJx8Y=
-github.com/libp2p/go-libp2p-pubsub v0.9.2/go.mod h1:RYA7aM9jIic5VV47WXu4GkcRxRhrdElWf8xtyli+Dzc=
-github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0=
-github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk=
-github.com/libp2p/go-libp2p-routing-helpers v0.4.0 h1:b7y4aixQ7AwbqYfcOQ6wTw8DQvuRZeTAA0Od3YYN5yc=
-github.com/libp2p/go-libp2p-routing-helpers v0.4.0/go.mod h1:dYEAgkVhqho3/YKxfOEGdFMIcWfAFNlZX8iAIihYA2E=
+github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
+github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
+github.com/libp2p/go-libp2p v0.48.0 h1:h2BrLAgrj7X8bEN05K7qmrjpNHYA+6tnsGRdprjTnvo=
+github.com/libp2p/go-libp2p v0.48.0/go.mod h1:Q1fBZNdmC2Hf82husCTfkKJVfHm2we5zk+NWmOGEmWk=
+github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
+github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
+github.com/libp2p/go-libp2p-kad-dht v0.40.0 h1:as8U7Y1RX9CTKCBiFBHWKZ6tSS+rE+6WNz+H1+M+wbo=
+github.com/libp2p/go-libp2p-kad-dht v0.40.0/go.mod h1:iLUjII47u3/HjxyhucI2lhsl29lrzlAs/ym16+H40jE=
+github.com/libp2p/go-libp2p-kbucket v0.8.0 h1:QAK7RzKJpYe+EuSEATAaaHYMYLkPDGC18m9jxPLnU8s=
+github.com/libp2p/go-libp2p-kbucket v0.8.0/go.mod h1:JMlxqcEyKwO6ox716eyC0hmiduSWZZl6JY93mGaaqc4=
+github.com/libp2p/go-libp2p-pubsub v0.16.0 h1:j7G2C8kJwkcAQqYR7Wmq3d75d3Sgw/N0Hhiv0dVx7OY=
+github.com/libp2p/go-libp2p-pubsub v0.16.0/go.mod h1:lr4oE8bFgQaifRcoc2uWhWWiK6tPdOEKpUuR408GFN4=
+github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
+github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E=
+github.com/libp2p/go-libp2p-routing-helpers v0.7.5 h1:HdwZj9NKovMx0vqq6YNPTh6aaNzey5zHD7HeLJtq6fI=
+github.com/libp2p/go-libp2p-routing-helpers v0.7.5/go.mod h1:3YaxrwP0OBPDD7my3D0KxfR89FlcX/IEbxDEDfAmj98=
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
+github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0=
github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM=
-github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg=
-github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM=
-github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk=
-github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU=
-github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ=
-github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo=
-github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc=
-github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560=
-github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtIlaURZZgOY4k=
-github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k=
-github.com/libp2p/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ=
-github.com/libp2p/go-yamux/v4 v4.0.0/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4=
+github.com/libp2p/go-netroute v0.4.0 h1:sZZx9hyANYUx9PZyqcgE/E1GUG3iEtTZHUEvdtXT7/Q=
+github.com/libp2p/go-netroute v0.4.0/go.mod h1:Nkd5ShYgSMS5MUKy/MU2T57xFoOKvvLR92Lic48LEyA=
+github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s=
+github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU=
+github.com/libp2p/go-yamux/v5 v5.0.1 h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg=
+github.com/libp2p/go-yamux/v5 v5.0.1/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU=
github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
-github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
-github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
+github.com/lucasb-eyer/go-colorful v1.4.0 h1:UtrWVfLdarDgc44HcS7pYloGHJUjHV/4FwW4TvVgFr4=
+github.com/lucasb-eyer/go-colorful v1.4.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
-github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
-github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
-github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/marcopolo/simnet v0.0.4 h1:50Kx4hS9kFGSRIbrt9xUS3NJX33EyPqHVmpXvaKLqrY=
+github.com/marcopolo/simnet v0.0.4/go.mod h1:tfQF1u2DmaB6WHODMtQaLtClEf3a296CKQLq5gAsIS0=
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk=
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU=
-github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
-github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
-github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
-github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
-github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
-github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0=
-github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc=
-github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.1.15 h1:+u9SLTRGnXv73cEsnsmoZBom+dMU88B2M0aDcWy0/jY=
+github.com/mattn/go-colorable v0.1.15/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4=
+github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4=
github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
-github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/mattn/go-runewidth v0.0.22 h1:76lXsPn6FyHtTY+jt2fTTvsMUCZq1k0qwRsAMuxzKAk=
+github.com/mattn/go-runewidth v0.0.22/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
-github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
-github.com/miekg/dns v1.1.25/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
-github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
-github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA=
-github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
+github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/miekg/dns v1.1.72 h1:vhmr+TF2A3tuoGNkLDFK9zi36F2LS+hKTRW0Uf8kbzI=
+github.com/miekg/dns v1.1.72/go.mod h1:+EuEPhdHOsfk6Wk5TT2CzssZdqkmFhf8r+aVyDEToIs=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc=
@@ -574,77 +514,55 @@ github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKo
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc=
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
-github.com/minio/highwayhash v1.0.1 h1:dZ6IIu8Z14VlC0VpfKofAhCy74wu/Qb5gcn52yWoz/0=
-github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY=
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
-github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
-github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
+github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
+github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
+github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
+github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
+github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
-github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
-github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
-github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
-github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
-github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
-github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
-github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
-github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
+github.com/mr-tron/base58 v1.3.0 h1:K6Y13R2h+dku0wOqKtecgRnBUBPrZzLZy5aIj8lCcJI=
+github.com/mr-tron/base58 v1.3.0/go.mod h1:2BuubE67DCSWwVfx37JWNG8emOC0sHEU4/HpcYgCLX8=
github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE=
github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI=
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
-github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4=
-github.com/multiformats/go-multiaddr v0.8.0 h1:aqjksEcqK+iD/Foe1RRFsGZh8+XFiGo7FgUCZlpv3LU=
-github.com/multiformats/go-multiaddr v0.8.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs=
-github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A=
-github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk=
+github.com/multiformats/go-multiaddr v0.16.1 h1:fgJ0Pitow+wWXzN9do+1b8Pyjmo8m5WhGfzpL82MpCw=
+github.com/multiformats/go-multiaddr v0.16.1/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0=
+github.com/multiformats/go-multiaddr-dns v0.5.0 h1:p/FTyHKX0nl59f+S+dEUe8HRK+i5Ow/QHMw8Nh3gPCo=
+github.com/multiformats/go-multiaddr-dns v0.5.0/go.mod h1:yJ349b8TPIAANUyuOzn1oz9o22tV9f+06L+cCeMxC14=
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
-github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs=
-github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI=
-github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8=
-github.com/multiformats/go-multicodec v0.8.1 h1:ycepHwavHafh3grIbR1jIXnKCsFm0fqsfEOsJ8NtKE8=
-github.com/multiformats/go-multicodec v0.8.1/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k=
+github.com/multiformats/go-multibase v0.3.0 h1:8helZD2+4Db7NNWFiktk2NePbF0boolBe6bDQvM4r68=
+github.com/multiformats/go-multibase v0.3.0/go.mod h1:MoBLQPCkRTOL3eveIPO81860j2AQY8JwcnNlRkGRUfI=
+github.com/multiformats/go-multicodec v0.10.0 h1:UpP223cig/Cx8J76jWt91njpK3GTAO1w02sdcjZDSuc=
+github.com/multiformats/go-multicodec v0.10.0/go.mod h1:wg88pM+s2kZJEQfRCKBNU+g32F5aWBEjyFHXvZLTcLI=
github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
-github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew=
-github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
-github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg=
-github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108=
-github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc=
-github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo=
-github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q=
-github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
-github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
-github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
-github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8=
-github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU=
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U=
+github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM=
+github.com/multiformats/go-multistream v0.6.1 h1:4aoX5v6T+yWmc2raBHsTvzmFhOI8WVOer28DeBBEYdQ=
+github.com/multiformats/go-multistream v0.6.1/go.mod h1:ksQf6kqHAb6zIsyw7Zm+gAuVo57Qbq84E27YlYqavqw=
+github.com/multiformats/go-varint v0.1.0 h1:i2wqFp4sdl3IcIxfAonHQV9qU5OsZ4Ts9IOoETFs5dI=
+github.com/multiformats/go-varint v0.1.0/go.mod h1:5KVAVXegtfmNQQm/lCY+ATvDzvJJhSkUlGQV9wgObdI=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
-github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
+github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
-github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
-github.com/onsi/ginkgo/v2 v2.5.1 h1:auzK7OI497k6x4OvWq+TKAcpcSAlod0doAH72oIN0Jw=
-github.com/onsi/ginkgo/v2 v2.5.1/go.mod h1:63DOGlLAH8+REH8jUGdL3YpCpu7JODesutUjdENfUAc=
-github.com/onsi/gomega v1.24.0 h1:+0glovB9Jd6z3VR+ScSwQqXVTIfJcGA9UBM8yzQxhqg=
-github.com/open-policy-agent/opa v0.39.0 h1:nus6g0UC4+6adN5GV2W7K/gsL9QoELBlv5iBVyLVzWI=
-github.com/open-policy-agent/opa v0.39.0/go.mod h1:M+l9UHc2T3PCZ/RMPxiHNKZZhukiOWfmaSapx71TmGM=
-github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0=
-github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
-github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
-github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
-github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
+github.com/open-policy-agent/opa v1.17.1 h1:wO0MOux/VCqY41aVAD6Toe1p3A7O7DlRZ1RHmYSpoS8=
+github.com/open-policy-agent/opa v1.17.1/go.mod h1:lcuZYSlqQpXFzsA6EJCELmfR5+nNOpZYX+eo7xaIIlk=
github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE=
github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U=
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
@@ -652,160 +570,146 @@ github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
github.com/otiai10/mint v1.3.3 h1:7JgpsBaN0uMkyju4tbYHu0mnM55hNKVYLsXmwr15NQI=
github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
+github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0=
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
-github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
-github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU=
-github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
-github.com/peterh/liner v0.0.0-20170211195444-bf27d3ba8e1d/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
+github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
+github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
+github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI=
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE=
+github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o=
+github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M=
+github.com/pion/dtls/v3 v3.1.2 h1:gqEdOUXLtCGW+afsBLO0LtDD8GnuBBjEy6HRtyofZTc=
+github.com/pion/dtls/v3 v3.1.2/go.mod h1:Hw/igcX4pdY69z1Hgv5x7wJFrUkdgHwAn/Q/uo7YHRo=
+github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4=
+github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw=
+github.com/pion/interceptor v0.1.40 h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4=
+github.com/pion/interceptor v0.1.40/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic=
+github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8=
+github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so=
+github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM=
+github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA=
+github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
+github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
+github.com/pion/rtcp v1.2.16 h1:fk1B1dNW4hsI78XUCljZJlC4kZOPk67mNRuQ0fcEkSo=
+github.com/pion/rtcp v1.2.16/go.mod h1:/as7VKfYbs5NIb4h6muQ35kQF/J0ZVNz2Z3xKoCBYOo=
+github.com/pion/rtp v1.8.19 h1:jhdO/3XhL/aKm/wARFVmvTfq0lC/CvN1xwYKmduly3c=
+github.com/pion/rtp v1.8.19/go.mod h1:bAu2UFKScgzyFqvUKmbvzSdPr+NGbZtv6UB2hesqXBk=
+github.com/pion/sctp v1.8.39 h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE=
+github.com/pion/sctp v1.8.39/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE=
+github.com/pion/sdp/v3 v3.0.18 h1:l0bAXazKHpepazVdp+tPYnrsy9dfh7ZbT8DxesH5ZnI=
+github.com/pion/sdp/v3 v3.0.18/go.mod h1:ZREGo6A9ZygQ9XkqAj5xYCQtQpif0i6Pa81HOiAdqQ8=
+github.com/pion/srtp/v3 v3.0.6 h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4=
+github.com/pion/srtp/v3 v3.0.6/go.mod h1:BxvziG3v/armJHAaJ87euvkhHqWe9I7iiOy50K2QkhY=
+github.com/pion/stun/v3 v3.1.1 h1:CkQxveJ4xGQjulGSROXbXq94TAWu8gIX2dT+ePhUkqw=
+github.com/pion/stun/v3 v3.1.1/go.mod h1:qC1DfmcCTQjl9PBaMa5wSn3x9IPmKxSdcCsxBcDBndM=
+github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
+github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
+github.com/pion/transport/v4 v4.0.1 h1:sdROELU6BZ63Ab7FrOLn13M6YdJLY20wldXW2Cu2k8o=
+github.com/pion/transport/v4 v4.0.1/go.mod h1:nEuEA4AD5lPdcIegQDpVLgNoDGreqM/YqmEx3ovP4jM=
+github.com/pion/turn/v4 v4.0.2 h1:ZqgQ3+MjP32ug30xAbD6Mn+/K4Sxi3SdNOTFf+7mpps=
+github.com/pion/turn/v4 v4.0.2/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7IToA1zs=
+github.com/pion/webrtc/v4 v4.1.2 h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54=
+github.com/pion/webrtc/v4 v4.1.2/go.mod h1:xsCXiNAmMEjIdFxAYU0MbB3RwRieJsegSB2JZsGN+8U=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
-github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1 h1:CskT+S6Ay54OwxBGB0R3Rsx4Muto6UnEYTyKJbyRIAI=
-github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
-github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
-github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
-github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
-github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=
-github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=
-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/polydawn/refmt v0.89.1-0.20231129105047-37766d95467a h1:cgqrm0F3zwf9IPzca7xN4w+Zy6MC9ZkPvAC8QEWa/iQ=
+github.com/polydawn/refmt v0.89.1-0.20231129105047-37766d95467a/go.mod h1:ocZfO/tLSHqfScRDNTJbAJR1by4D1lewauX9OwTaPuY=
+github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
+github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
-github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
-github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
-github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
-github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
-github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=
-github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
-github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
-github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
-github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
+github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
+github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
+github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4=
+github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw=
+github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc=
+github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo=
github.com/prometheus/prom2json v1.3.2 h1:heRKAGHWqm8N3IaRDDNBBJNVS6a9mLdsTlFhvOaNGb0=
github.com/prometheus/prom2json v1.3.2/go.mod h1:TQ9o1OxW0eyhl4BBpVpGGsavyJfTDETna4/d0Kib+V0=
-github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic=
-github.com/prysmaticlabs/fastssz v0.0.0-20220628121656-93dfe28febab h1:Y3PcvUrnneMWLuypZpwPz8P70/DQsz6KgV9JveKpyZs=
-github.com/prysmaticlabs/fastssz v0.0.0-20220628121656-93dfe28febab/go.mod h1:MA5zShstUwCQaE9faGHgCGvEWUbG87p4SAXINhmCkvg=
-github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw=
-github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4=
-github.com/prysmaticlabs/gohashtree v0.0.2-alpha h1:hk5ZsDQuSkyUMhTd55qB396P1+dtyIKiSwMmYE/hyEU=
-github.com/prysmaticlabs/gohashtree v0.0.2-alpha/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk=
-github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20211014160335-757fae4f38c6 h1:+jhXLjEYVW4qU2z5SOxlxN+Hv/A9FDf0HpfDurfMEz0=
-github.com/prysmaticlabs/prysm/v3 v3.1.1 h1:N7cggeyZhHku6efPIU66RUtqq9bTpF7nlHQ3TUCyIcg=
-github.com/prysmaticlabs/prysm/v3 v3.1.1/go.mod h1:+v+em7rOykPs93APGWCX/95/3uxU8bSVmbZ4+YNJzdA=
-github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
-github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
-github.com/quic-go/qtls-go1-19 v0.2.1 h1:aJcKNMkH5ASEJB9FXNeZCyTEIHU1J7MmHyz1Q1TSG1A=
-github.com/quic-go/qtls-go1-19 v0.2.1/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI=
-github.com/quic-go/qtls-go1-20 v0.1.1 h1:KbChDlg82d3IHqaj2bn6GfKRj84Per2VGf5XV3wSwQk=
-github.com/quic-go/qtls-go1-20 v0.1.1/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM=
-github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0=
-github.com/quic-go/quic-go v0.33.0/go.mod h1:YMuhaAV9/jIu0XclDXwZPAsP/2Kgr5yMYhe9oxhhOFA=
-github.com/quic-go/webtransport-go v0.5.2 h1:GA6Bl6oZY+g/flt00Pnu0XtivSD8vukOu3lYhJjnGEk=
-github.com/quic-go/webtransport-go v0.5.2/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU=
-github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk=
-github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU=
-github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ=
-github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8=
+github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII=
+github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw=
+github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU=
+github.com/quic-go/webtransport-go v0.10.0 h1:LqXXPOXuETY5Xe8ITdGisBzTYmUOy5eSj+9n4hLTjHI=
+github.com/quic-go/webtransport-go v0.10.0/go.mod h1:LeGIXr5BQKE3UsynwVBeQrU1TPrbh73MGoC6jd+V7ow=
+github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 h1:bsUq1dX0N8AOIL7EB/X911+m4EHsnWEHeJ0c+3TTBrg=
+github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
-github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
-github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE=
-github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho=
+github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
+github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
+github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/rumsystem/ip-cert v0.0.0-20220802012323-cebacb66b383 h1:AEHW94qUDxgYLeMOUzkH0hOVmg59jC/9T6yqYi2BBrA=
github.com/rumsystem/ip-cert v0.0.0-20220802012323-cebacb66b383/go.mod h1:kKyQafGZXzEwsNPvbZQZiLo0+HhwU5BYrB3kQmmfAs4=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU=
-github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
-github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM=
-github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0=
-github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
-github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
-github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw=
-github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI=
-github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU=
-github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag=
-github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg=
-github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw=
-github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y=
-github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
-github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q=
-github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ=
-github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I=
-github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0=
-github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ=
-github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk=
-github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc=
+github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
+github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0=
+github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
+github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
+github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
+github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
+github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
+github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4=
-github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
-github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
-github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
+github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
+github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
+github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
+github.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY=
+github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
-github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
-github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU=
-github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc=
+github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY=
+github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60=
+github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw=
+github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
-github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo=
-github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
+github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
+github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
+github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
-github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
+github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
+github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
-github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
-github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU=
-github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM=
+github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
+github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
+github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
-github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
+github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
-github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ=
-github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI=
+github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
+github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=
+github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
@@ -816,61 +720,72 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
-github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI=
-github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs=
-github.com/supranational/blst v0.3.8-0.20220526154634-513d2456b344 h1:m+8fKfQwCAy1QjzINvKe/pYtLjo2dl59x2w9YSEJxuY=
-github.com/swaggo/echo-swagger v1.3.5 h1:kCx1wvX5AKhjI6Ykt48l3PTsfL9UD40ZROOx/tYzWyY=
-github.com/swaggo/echo-swagger v1.3.5/go.mod h1:3IMHd2Z8KftdWFEEjGmv6QpWj370LwMCOfovuh7vF34=
-github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a h1:kAe4YSu0O0UFn1DowNo2MY5p6xzqtJ/wQ7LZynSvGaY=
-github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w=
-github.com/swaggo/swag v1.8.1 h1:JuARzFX1Z1njbCGz+ZytBR15TFJwF2Q7fu8puJHhQYI=
-github.com/swaggo/swag v1.8.1/go.mod h1:ugemnJsPZm/kRwFUnzBlbHRd0JY9zE1M4F+uy2pAaPQ=
-github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI=
-github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
+github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
+github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
+github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
+github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
+github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
+github.com/supranational/blst v0.3.16 h1:bTDadT+3fK497EvLdWRQEjiGnUtzJ7jjIUMF0jqwYhE=
+github.com/supranational/blst v0.3.16/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw=
+github.com/sv-tools/openapi v0.2.1 h1:ES1tMQMJFGibWndMagvdoo34T1Vllxr1Nlm5wz6b1aA=
+github.com/sv-tools/openapi v0.2.1/go.mod h1:k5VuZamTw1HuiS9p2Wl5YIDWzYnHG6/FgPOSFXLAhGg=
+github.com/swaggo/echo-swagger v1.5.2 h1:KUM4QuEO1r/maky6Ybb9wS5MFEkJUpXwPbK4wwBe5Uk=
+github.com/swaggo/echo-swagger v1.5.2/go.mod h1:nt3Z+SlyzXNIQ4odFNlPzRdcNOFvkPJHf+t4sMLhNu4=
+github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw=
+github.com/swaggo/files/v2 v2.0.0/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM=
+github.com/swaggo/swag v1.16.6 h1:qBNcx53ZaX+M5dxVyTrgQ0PJ/ACK+NzhwcbieTt+9yI=
+github.com/swaggo/swag v1.16.6/go.mod h1:ngP2etMK5a0P3QBizic5MEwpRmluJZPHjXcMoj4Xesg=
+github.com/swaggo/swag/v2 v2.0.0-rc4 h1:SZ8cK68gcV6cslwrJMIOqPkJELRwq4gmjvk77MrvHvY=
+github.com/swaggo/swag/v2 v2.0.0-rc4/go.mod h1:Ow7Y8gF16BTCDn8YxZbyKn8FkMLRUHekv1kROJZpbvE=
+github.com/tchap/go-patricia/v2 v2.3.3 h1:xfNEsODumaEcCcY3gI0hYPZ/PcpVv5ju6RMAhgwZDDc=
+github.com/tchap/go-patricia/v2 v2.3.3/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k=
github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e h1:cR8/SYRgyQCt5cNCMniB/ZScMkhI9nk8U5C7SbISXjo=
github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e/go.mod h1:Tu4lItkATkonrYuvtVjG0/rhy15qrNGNTjPdaphtZ/8=
-github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4=
-github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA=
-github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
-github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
+github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
+github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
+github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
+github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
+github.com/tslocum/cbind v0.1.5 h1:AXWK4SzzNGw1ZY8m2fBuSNLZHiRratGFUc3R/oija7I=
+github.com/tslocum/cbind v0.1.5/go.mod h1:LtfqJTzM7qhg88nAvNhx+VnTjZ0SXBJtxBObbfBWo/M=
+github.com/tslocum/cview v1.5.6 h1:bLillrBImoHA2PjbHyt56fIAQwpTME7TF68C1Yvy8yI=
+github.com/tslocum/cview v1.5.6/go.mod h1:RogJMObbKuGiP8+9WsFsHpPeQQqgkCXgvTLxh7IH5eE=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
-github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
-github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
-github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
-github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
-github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y=
-github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo=
+github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
-github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
-github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
-github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
-github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM=
-github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w=
-github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
+github.com/valyala/fastjson v1.6.10 h1:/yjJg8jaVQdYR3arGxPE2X5z89xrlhS0eGXdv+ADTh4=
+github.com/valyala/fastjson v1.6.10/go.mod h1:e6FubmQouUNP73jtMLmcbxS6ydWIpOfhz34TSfO3JaE=
+github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
+github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
+github.com/vektah/gqlparser/v2 v2.5.33 h1:lRp8aIeNUNbimf/axZd7ETg24q06hBtPaas+TcvI/7E=
+github.com/vektah/gqlparser/v2 v2.5.33/go.mod h1:c1I28gSOVNzlfc4WuDlqU7voQnsqI6OG2amkBAFmgts=
+github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ=
+github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k=
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc=
+github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU=
+github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
-github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
-github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
-github.com/yashtewari/glob-intersection v0.1.0 h1:6gJvMYQlTDOL3dMsPF6J0+26vwX9MB8/1q3uAdhmTrg=
-github.com/yashtewari/glob-intersection v0.1.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok=
+github.com/yashtewari/glob-intersection v0.2.0 h1:8iuHdN88yYuCzCdjt0gDe+6bAhUwBeEWqThExu54RFg=
+github.com/yashtewari/glob-intersection v0.2.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU=
-go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
-go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
+github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+go.etcd.io/bbolt v1.5.0 h1:S7GAl7Fxv12yohbwFfIbQCGDWbQbtDGPET4P/bD4lxU=
+go.etcd.io/bbolt v1.5.0/go.mod h1:mkltfYE5aUHQxUct9N9V+Kp7aSjFqjgrhcXIS70Lrdk=
+go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
+go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
@@ -880,63 +795,49 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.31.0/go.mod h1:PFmBsWbldL1kiWZk9+0LBZz2brhByaGsvp6pRICMlPE=
-go.opentelemetry.io/otel v1.6.0/go.mod h1:bfJD2DZVw0LBxghOTlgnlI0CV3hLDu9XF/QKOUXMTQQ=
-go.opentelemetry.io/otel v1.6.1/go.mod h1:blzUabWHkX6LJewxvadmzafgh/wnvBSDBdOuwkAtrWQ=
-go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.1/go.mod h1:NEu79Xo32iVb+0gVNV8PMd7GoWqnyDXRlj04yFjqz40=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.1/go.mod h1:YJ/JbY5ag/tSQFXzH3mtDmHqzF3aFn3DI/aB1n7pt4w=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.1/go.mod h1:UJJXJj0rltNIemDMwkOJyggsvyMG9QHfJeFH0HS5JjM=
-go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw=
-go.opentelemetry.io/otel/sdk v1.6.1/go.mod h1:IVYrddmFZ+eJqu2k38qD3WezFR2pymCzm8tdxyh3R4E=
-go.opentelemetry.io/otel/trace v1.6.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE=
-go.opentelemetry.io/otel/trace v1.6.1/go.mod h1:RkFRM1m0puWIq10oxImnGEduNBzxiN7TXluRBtE+5j0=
-go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
-go.opentelemetry.io/proto/otlp v0.12.1/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
-go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
+go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
+go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=
+go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0=
+go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=
+go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY=
+go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=
+go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
-go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
-go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q=
-go.uber.org/dig v1.15.0 h1:vq3YWr8zRj1eFGC7Gvf907hE0eRjPTZ1d3xHadD6liE=
-go.uber.org/dig v1.15.0/go.mod h1:pKHs0wMynzL6brANhB2hLMro+zalv1osARTviTcqHLM=
-go.uber.org/fx v1.18.2 h1:bUNI6oShr+OVFQeU8cDNbnN7VFsu+SsjHzUF51V/GAU=
-go.uber.org/fx v1.18.2/go.mod h1:g0V1KMQ66zIRk8bLu3Ea5Jt2w/cHlOIp4wdRsgh0JaY=
-go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
-go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
-go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
-go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
+go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
+go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
+go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg=
+go.uber.org/fx v1.24.0/go.mod h1:AmDeGyS+ZARGKM4tlH4FY2Jr63VjbEDJHtqXTGP5hbo=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
+go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
-go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
-go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
-go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
-go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
-go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
-go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
-go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
-golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
+go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo=
+go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q=
+go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
+go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ=
+go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
+go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
+golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
+golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc=
-golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
+golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto=
+golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -947,11 +848,10 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20221205204356-47842c84f3db h1:D/cFflL63o2KSLJIwjlcIt8PR064j/xsmdEJL/YvY/o=
-golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
+golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f h1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM=
+golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f/go.mod h1:J1xhfL/vlindoeF/aINzNzt2Bket5bjo9sdOYzOsU80=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -963,6 +863,7 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
@@ -974,29 +875,25 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
-golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=
-golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4=
+golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -1015,25 +912,17 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
-golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211111083644-e5c967477495/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.6.0 h1:L4ZwwTvKW9gr0ZMS1yrHD9GZhIuVjOBBnaKH+SPQK0Q=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o=
+golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1042,10 +931,9 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
+golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1057,39 +945,30 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
+golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
+golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190130150945-aca44879d564/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-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1101,50 +980,43 @@ golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309040221-94ec62e08169/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
+golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
+golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 h1:HjU6IWBiAgRIdAJ9/y1rwCn+UELEmwV+VsTLzj/W4sE=
+golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6/go.mod h1:Eqhaxk/wZsWEH8CRxLwj6xzEJbz7k1EFGqx7nyCoabE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
+golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1154,19 +1026,17 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
+golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
-golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=
+golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
@@ -1180,11 +1050,9 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -1217,22 +1085,22 @@ golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
-golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
-golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
-golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM=
-golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
+golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8=
+golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
-google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
-google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
+golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
+golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
+gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
+gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -1252,9 +1120,10 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513
google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
+google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
+google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
+google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
@@ -1262,10 +1131,6 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
-google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -1300,15 +1165,12 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I=
-google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
-google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
-google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
-google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
+google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
+google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -1327,12 +1189,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
-google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
-google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
-google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ=
-google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
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=
@@ -1345,11 +1203,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
-google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
+google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1357,19 +1212,12 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
-gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4=
-gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
-gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
-gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@@ -1377,8 +1225,6 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
-honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -1386,12 +1232,10 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0=
-lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA=
-nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
-nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
+lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg=
+lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck=
-sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
+sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
+sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=
diff --git a/howtotest.md b/howtotest.md
index ffc9e4f2..9f74f870 100644
--- a/howtotest.md
+++ b/howtotest.md
@@ -77,7 +77,6 @@ so, your bootstrap peer is `/ip4/127.0.0.1/tcp/50510/p2p/16Uiu2HAkxfXvruFGQUAURi
--listen=/ip4/0.0.0.0/tcp/50610 \
--listen=/ip4/0.0.0.0/tcp/50611/ws \
--apiport=50613 \
- --autoack=true \
--log-compress=true \
--log-max-age=7 \
--log-max-backups=3 \
@@ -102,7 +101,6 @@ so, your bootstrap peer is `/ip4/127.0.0.1/tcp/50510/p2p/16Uiu2HAkxfXvruFGQUAURi
--listen=/ip4/0.0.0.0/tcp/50620 \
--listen=/ip4/0.0.0.0/tcp/50621/ws \
--apiport=50623 \
- --autoack=true \
--log-compress=true \
--log-max-age=7 \
--log-max-backups=3 \
@@ -570,5 +568,3 @@ chain should ready for work
p2 should start consensus sync and back to idle
### 5. Chain is fully recovered
-
-
diff --git a/internal/pkg/appdata/db_test.go b/internal/pkg/appdata/db_test.go
index d7dd3de9..8410609f 100644
--- a/internal/pkg/appdata/db_test.go
+++ b/internal/pkg/appdata/db_test.go
@@ -1,3 +1,6 @@
+//go:build legacy_tests
+// +build legacy_tests
+
package appdata
import (
diff --git a/internal/pkg/chainsdk/core/rexsyncer.go b/internal/pkg/chainsdk/core/rexsyncer.go
index af032032..326996cc 100644
--- a/internal/pkg/chainsdk/core/rexsyncer.go
+++ b/internal/pkg/chainsdk/core/rexsyncer.go
@@ -136,8 +136,6 @@ func (rs *RexSyncer) Stop() {
rs.Status = CLOSED
rs.mustatus.Unlock()
// TODO: don't close channel until destory all related timers
- //safeCloseTaskQ(rs.taskq)
- //safeCloseResultQ(rs.resultq)
rex_syncer_log.Debugf("<%s> rexsyncer stop success.", rs.GroupId)
}
@@ -155,45 +153,6 @@ func (rs *RexSyncer) GetLastRexSyncResult() (*def.RexSyncResult, error) {
return rs.LastSyncResult, nil
}
-func safeClose(ch chan struct{}) (recovered bool) {
- defer func() {
- if recover() != nil {
- recovered = true
- }
- }()
- if ch == nil {
- return false
- }
- close(ch)
- return false
-}
-
-func safeCloseTaskQ(ch chan *SyncTask) (recovered bool) {
- defer func() {
- if recover() != nil {
- recovered = true
- }
- }()
- if ch == nil {
- return false
- }
- close(ch)
- return false
-}
-
-func safeCloseResultQ(ch chan *SyncResult) (recovered bool) {
- defer func() {
- if recover() != nil {
- recovered = true
- }
- }()
- if ch == nil {
- return false
- }
- close(ch)
- return false
-}
-
func (rs *RexSyncer) runTask(ctx context.Context, task *SyncTask, cancel context.CancelFunc) error {
//TODO: close this goroutine when the processTask func return. add some defer signal?
rex_syncer_log.Debugf("runTask called, taskId <%d>, retry <%d>", task.TaskId, rs.CurrRetryCount)
@@ -208,8 +167,6 @@ func (rs *RexSyncer) runTask(ctx context.Context, task *SyncTask, cancel context
}()
select {
- //case <-rs.taskdone:
- // return nil
case <-ctx.Done():
switch ctx.Err() {
case context.DeadlineExceeded:
@@ -354,7 +311,6 @@ func (rs *RexSyncer) handleResult(result *SyncResult) error {
NextSyncTaskTimeStamp: -1,
}
- //rs.taskdone <- struct{}{}
if rs.CurrentTaskCancel != nil {
rs.CurrentTaskCancel()
}
diff --git a/internal/pkg/cli/flags.go b/internal/pkg/cli/flags.go
index fbe49959..febf609a 100644
--- a/internal/pkg/cli/flags.go
+++ b/internal/pkg/cli/flags.go
@@ -26,7 +26,6 @@ type FullNodeFlag struct {
KeyStoreDir string
KeyStoreName string
KeyStorePwd string
- AutoAck bool
EnableRelay bool
}
@@ -48,7 +47,6 @@ type BootstrapNodeFlag struct {
KeyStoreDir string
KeyStoreName string
KeyStorePwd string
- AutoAck bool
EnableRelay bool
}
diff --git a/internal/pkg/conn/connmgr.go b/internal/pkg/conn/connmgr.go
index db00d62b..bc124bc5 100644
--- a/internal/pkg/conn/connmgr.go
+++ b/internal/pkg/conn/connmgr.go
@@ -51,24 +51,6 @@ type ConnMgr struct {
//Rex *p2p.RexService
}
-type PsConnChanel uint
-
-const (
- UserChannel PsConnChanel = iota
- ProducerChannel
-)
-
-func (t PsConnChanel) String() string {
- switch t {
- case UserChannel:
- return "UserChannel"
- case ProducerChannel:
- return "ProducerChannel"
- default:
- return fmt.Sprintf("%d", int(t))
- }
-}
-
const (
CLOSE_PRD_CHANN_TIMER time.Duration = 20 * time.Second
)
diff --git a/internal/pkg/conn/p2p/network_native.go b/internal/pkg/conn/p2p/network_native.go
index 2ed09ea9..054c0afa 100644
--- a/internal/pkg/conn/p2p/network_native.go
+++ b/internal/pkg/conn/p2p/network_native.go
@@ -230,7 +230,7 @@ func (node *Node) ConnectPeers(ctx context.Context, peerok chan struct{}, maxpee
}
skip := false
for _, sp := range node.SkipPeers {
- if sp == peer.ID.Pretty() {
+ if sp == peer.ID.String() {
skip = true
}
}
diff --git a/internal/pkg/conn/p2p/network_test.go b/internal/pkg/conn/p2p/network_test.go
index 3f1a97f5..b1531a5f 100644
--- a/internal/pkg/conn/p2p/network_test.go
+++ b/internal/pkg/conn/p2p/network_test.go
@@ -8,62 +8,115 @@ import (
"testing"
"time"
- "github.com/rumsystem/quorum/testnode"
+ ethkeystore "github.com/ethereum/go-ethereum/accounts/keystore"
+ ethcrypto "github.com/ethereum/go-ethereum/crypto"
+ "github.com/libp2p/go-libp2p/core/network"
+ "github.com/libp2p/go-libp2p/core/peer"
+ connmgr "github.com/libp2p/go-libp2p/p2p/net/connmgr"
+ maddr "github.com/multiformats/go-multiaddr"
+ "github.com/rumsystem/quorum/internal/pkg/cli"
+ "github.com/rumsystem/quorum/internal/pkg/options"
)
func TestNodeConnecting(t *testing.T) {
- ctx, cancel := context.WithCancel(context.Background())
+ ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
- mockRendezvousString := "testrendezvousuniqstring"
- bootstrap, peer1, peer2, _, _, _, err := testnode.Run2nodes(ctx, mockRendezvousString)
+ bootstrap := newTestNetworkNode(t, ctx, "bootstrap", true)
+ peer1 := newTestNetworkNode(t, ctx, "peer1", false)
+ peer2 := newTestNetworkNode(t, ctx, "peer2", false)
+ defer closeTestNetworkNodes(bootstrap, peer1, peer2)
+
+ bootstrapAddrs, err := peer.AddrInfoToP2pAddrs(&peer.AddrInfo{
+ ID: bootstrap.Host.ID(),
+ Addrs: bootstrap.Host.Addrs(),
+ })
if err != nil {
- t.Errorf("create test peers err:%s", err)
+ t.Fatalf("build bootstrap peer address: %s", err)
+ }
+
+ for _, node := range []*Node{peer1, peer2} {
+ if err := node.Bootstrap(ctx, cli.AddrList(bootstrapAddrs)); err != nil {
+ t.Fatalf("bootstrap %s: %s", node.NodeName, err)
+ }
+ waitForConnectedPeer(t, ctx, node, bootstrap.Host.ID())
}
- networklog.Debugf("bootstrap id: %s", bootstrap.Host.ID())
- networklog.Debugf("peer1 id: %s", peer1.Host.ID())
- networklog.Debugf("peer2 id: %s", peer2.Host.ID())
+ connected := peer1.AddPeers(ctx, []peer.AddrInfo{{
+ ID: peer2.Host.ID(),
+ Addrs: peer2.Host.Addrs(),
+ }})
+ if connected != 1 {
+ t.Fatalf("expected peer1 to connect to peer2 once, connected %d peers", connected)
+ }
+ waitForConnectedPeer(t, ctx, peer1, peer2.Host.ID())
+ waitForConnectedPeer(t, ctx, peer2, peer1.Host.ID())
+}
- networklog.Debug("Waitting 10s for finding peers testing...")
- time.Sleep(10 * time.Second)
- peer1info, err := peer1.FindPeers(ctx, mockRendezvousString)
+func newTestNetworkNode(t *testing.T, ctx context.Context, name string, isBootstrap bool) *Node {
+ t.Helper()
+
+ listenAddr, err := maddr.NewMultiaddr("/ip4/127.0.0.1/tcp/0")
if err != nil {
- t.Errorf("Find peer1 peers err:%s", err)
+ t.Fatalf("create listen address: %s", err)
}
- peer2info, err := peer2.FindPeers(ctx, mockRendezvousString)
+ privateKey, err := ethcrypto.GenerateKey()
if err != nil {
- t.Errorf("Find peer2 peers err:%s", err)
+ t.Fatalf("generate node key: %s", err)
}
- if len(peer2info) == len(peer1info) && len(peer1info) == 2 {
- for _, p2 := range peer2info {
- peerexist := false
- networklog.Debugf("check addr %s", p2)
- for _, p1 := range peer1info {
- if p1.String() == p2.String() {
- peerexist = true
- networklog.Debugf("addr %s exist", p2)
- }
- }
- if peerexist != true {
- t.Errorf("peer2 address not exist in the peer1 %s", p2.String())
- }
- }
- } else {
- t.Errorf("Findpeers peer1 != peer2 %s %s", peer1info, peer2info)
+ cm, err := connmgr.NewConnManager(10, 100, connmgr.WithGracePeriod(time.Second))
+ if err != nil {
+ t.Fatalf("create connection manager: %s", err)
+ }
+ node, err := NewNode(
+ ctx,
+ name,
+ &options.NodeOptions{NetworkName: "staten-test", MaxPeers: 10, ConnsHi: 100},
+ isBootstrap,
+ ðkeystore.Key{PrivateKey: privateKey},
+ cm,
+ []maddr.Multiaddr{listenAddr},
+ nil,
+ "",
+ )
+ if err != nil {
+ t.Fatalf("create %s node: %s", name, err)
}
+ if node.RoutingDiscovery == nil {
+ t.Fatalf("%s node has no routing discovery", name)
+ }
+ return node
+}
+
+func waitForConnectedPeer(t *testing.T, ctx context.Context, node *Node, want peer.ID) {
+ t.Helper()
- cancel()
+ ticker := time.NewTicker(250 * time.Millisecond)
+ defer ticker.Stop()
- timer2 := time.NewTimer(time.Second * 30)
- go func() {
- <-timer2.C
- cancel()
- }()
+ for {
+ if node.Host.Network().Connectedness(want) == network.Connected {
+ return
+ }
- select {
- case <-ctx.Done():
- ("cancel all nodes after 60s")
- return
+ select {
+ case <-ctx.Done():
+ t.Fatalf("%s did not connect to %s: %s", node.NodeName, want, ctx.Err())
+ case <-ticker.C:
+ }
+ }
+}
+
+func closeTestNetworkNodes(nodes ...*Node) {
+ for _, node := range nodes {
+ if node == nil {
+ continue
+ }
+ if node.Ddht != nil {
+ _ = node.Ddht.Close()
+ }
+ if node.Host != nil {
+ _ = node.Host.Close()
+ }
}
}
diff --git a/internal/pkg/conn/p2p/peerdata/store_test.go b/internal/pkg/conn/p2p/peerdata/store_test.go
index d8bb2fac..821c3040 100644
--- a/internal/pkg/conn/p2p/peerdata/store_test.go
+++ b/internal/pkg/conn/p2p/peerdata/store_test.go
@@ -5,9 +5,9 @@ import (
"testing"
"github.com/libp2p/go-libp2p/core/peer"
- "github.com/prysmaticlabs/prysm/v3/testing/assert"
- "github.com/prysmaticlabs/prysm/v3/testing/require"
"github.com/rumsystem/quorum/internal/pkg/conn/p2p/peerdata"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestStore_GetSetDelete(t *testing.T) {
diff --git a/internal/pkg/conn/p2p/psping.go b/internal/pkg/conn/p2p/psping.go
index 79598f04..bfc14324 100644
--- a/internal/pkg/conn/p2p/psping.go
+++ b/internal/pkg/conn/p2p/psping.go
@@ -36,7 +36,7 @@ func NewPSPingService(ctx context.Context, ps *pubsub.PubSub, peerid peer.ID) *P
}
func (p *PSPing) EnablePing() error {
- peerid := p.PeerId.Pretty()
+ peerid := p.PeerId.String()
var err error
topicid := fmt.Sprintf("PSPing:%s", peerid)
p.Topic, err = p.ps.Join(topicid)
diff --git a/internal/pkg/conn/p2p/rumexchange.go b/internal/pkg/conn/p2p/rumexchange.go
index 7a735987..77827581 100644
--- a/internal/pkg/conn/p2p/rumexchange.go
+++ b/internal/pkg/conn/p2p/rumexchange.go
@@ -187,7 +187,7 @@ func (r *RexService) Publish(groupid string, channelpeers []peer.ID, msg *quorum
//defer cancel()
for _, p := range peers {
- if err := r.PublishToPeerId(msg, peer.Encode(p)); err == nil {
+ if err := r.PublishToPeerId(msg, p.String()); err == nil {
r.peerstore.Scorers().BlockProviderScorer().Touch(p)
rumexchangelog.Debugf("writemsg to network stream succ: %s.", p)
return nil
diff --git a/internal/pkg/conn/p2p/rumpeerstore_test.go b/internal/pkg/conn/p2p/rumpeerstore_test.go
index 50bfa4c6..b43ba597 100644
--- a/internal/pkg/conn/p2p/rumpeerstore_test.go
+++ b/internal/pkg/conn/p2p/rumpeerstore_test.go
@@ -1,134 +1,42 @@
package p2p
import (
- "crypto/rand"
- "io"
+ "context"
"testing"
- "time"
- "github.com/libp2p/go-libp2p/core/crypto"
"github.com/libp2p/go-libp2p/core/peer"
+ "github.com/rumsystem/quorum/internal/pkg/conn/p2p/scorers"
)
-func TestRumGroupPeerStoreUpdate(t *testing.T) {
- //testing add, update, get
- rgp := &RumGroupPeerStore{}
- groupid := "e3326fcf-0df4-4388-9355-48b184c5a3ce"
- peerid1, _ := peer.Decode("16Uiu2HAmCxKwe3h1MiQmgrWsuDpsdRXz1Tr12iuUJ8iEjoCpi7BY")
- ttl := time.Duration(20 * time.Minute)
- rgp.Save(groupid, peerid1, ttl)
+func TestRumGroupPeerStoreFilterPeersDropsBadPeers(t *testing.T) {
+ rgp := NewRumGroupPeerStore()
+ pids := []peer.ID{"peer1", "peer2", "peer3", "peer4"}
- peerid2, _ := peer.Decode("16Uiu2HAm17k6DX4ZkDPYw1H915MxZ4K11qqBvkueFhgdcHRWkX4G")
- rgp.Save(groupid, peerid2, ttl)
-
- ttl2 := time.Duration(30 * time.Minute)
- rgp.Save(groupid, peerid2, ttl2)
-
- peerlist := rgp.Get(groupid)
-
- if len(peerlist) != 2 {
- t.Errorf("RumGroupPeerStore length %d error expect: %d", len(peerlist), 2)
+ for i := 0; i < scorers.DefaultBadResponsesThreshold; i++ {
+ rgp.Scorers().BadResponsesScorer().Increment(pids[1])
}
- groupid1 := "f6a92871-1df5-4e23-b9c6-95745bb4236d"
- rgp.Save(groupid1, peerid2, ttl)
- peerlist2 := rgp.Get(groupid1)
- if len(peerlist2) != 1 {
- t.Errorf("RumGroupPeerStore length %d error expect: %d", len(peerlist2), 1)
- }
-
-}
-
-func TestRumGroupPeerStoreTTL(t *testing.T) {
- rgp := &RumGroupPeerStore{}
- groupid1 := "4455c41b-4098-4be1-ba53-a2c4293ca1b5"
- peerid1, _ := peer.Decode("16Uiu2HAmCxKwe3h1MiQmgrWsuDpsdRXz1Tr12iuUJ8iEjoCpi7BY")
- veryshortttl := time.Duration(2 * time.Second)
- rgp.Save(groupid1, peerid1, veryshortttl)
- peerlist1 := rgp.Get(groupid1)
- if len(peerlist1) != 1 {
- t.Errorf("RumGroupPeerStore length %d error expect: %d", len(peerlist1), 1)
- }
- time.Sleep(3 * time.Second)
- t.Log("wait for ttl expired...")
- peerlist1 = rgp.Get(groupid1)
- if len(peerlist1) != 0 {
- t.Errorf("RumGroupPeerStore length %d error expect: %d", len(peerlist1), 0)
- }
-}
-
-func TestRumGroupPeerStoreRandom(t *testing.T) {
- rgp := &RumGroupPeerStore{}
- groupid1 := "4455c41b-4098-4be1-ba53-a2c4293ca1b5"
- ttl := time.Duration(20 * time.Minute)
- addpeernum := 10
- connectpeernum := 20
- samplenum := 3
-
- var r io.Reader
- r = rand.Reader
- for i := 0; i < addpeernum; i++ {
- priv, _, _ := crypto.GenerateKeyPairWithReader(crypto.RSA, 2048, r)
- newId, _ := peer.IDFromPrivateKey(priv)
- rgp.Save(groupid1, newId, ttl)
- }
-
- connectpeers := []peer.ID{}
- for i := 0; i < connectpeernum; i++ {
- priv, _, _ := crypto.GenerateKeyPairWithReader(crypto.RSA, 2048, r)
- newId, _ := peer.IDFromPrivateKey(priv)
- connectpeers = append(connectpeers, newId)
- }
-
- allpeers := rgp.Get(groupid1)
-
- randomlist1 := rgp.GetRandomPeer(groupid1, samplenum, []peer.ID{})
- randomlist2 := rgp.GetRandomPeer(groupid1, samplenum, []peer.ID{})
-
- for i := 0; i < samplenum; i++ {
- peer1included := false
- peer2included := false
- for j := 0; j < addpeernum; j++ {
- if randomlist1[i] == allpeers[j] {
- peer1included = true
- }
- if randomlist2[i] == allpeers[j] {
- peer2included = true
- }
- }
- if peer1included != true || peer2included != true {
- t.Errorf("random peer list not included in all peers.")
+ filtered := rgp.filterPeers(context.Background(), pids, 1.0)
+ for _, pid := range filtered {
+ if pid == pids[1] {
+ t.Fatalf("bad peer %s was not filtered: %v", pid, filtered)
}
}
-
- randomlist3 := rgp.GetRandomPeer(groupid1, addpeernum+samplenum, connectpeers)
- if len(randomlist3) != addpeernum+samplenum {
- t.Errorf("RumGroupPeerStore length %d error expect: %d", len(randomlist3), addpeernum+samplenum)
+ if len(filtered) != 3 {
+ t.Fatalf("expected three good peers, got %d: %v", len(filtered), filtered)
}
-
}
-func TestRumGroupPeerStoreRandomWithoutPreSaved(t *testing.T) {
- rgp := &RumGroupPeerStore{}
-
- groupid1 := "4455c41b-4098-4be1-ba53-a2c4293ca1b5"
- connectpeernum := 20
- samplenum := 3
+func TestTrimPeersKeepsMinimumAndCapsAtAvailablePeers(t *testing.T) {
+ pids := []peer.ID{"peer1", "peer2", "peer3", "peer4", "peer5"}
- var r io.Reader
- r = rand.Reader
-
- connectpeers := []peer.ID{}
- for i := 0; i < connectpeernum; i++ {
- priv, _, _ := crypto.GenerateKeyPairWithReader(crypto.RSA, 2048, r)
- newId, _ := peer.IDFromPrivateKey(priv)
- connectpeers = append(connectpeers, newId)
+ trimmed := trimPeers(pids, 0.2)
+ if len(trimmed) != 3 {
+ t.Fatalf("expected minimum of three peers, got %d: %v", len(trimmed), trimmed)
}
- randomlist1 := rgp.GetRandomPeer(groupid1, samplenum, connectpeers)
-
- if len(randomlist1) != samplenum {
- t.Errorf("RumGroupPeerStore length %d error expect: %d", len(randomlist1), samplenum)
+ trimmed = trimPeers(pids[:2], 0.1)
+ if len(trimmed) != 2 {
+ t.Fatalf("expected cap at available peers, got %d: %v", len(trimmed), trimmed)
}
-
}
diff --git a/internal/pkg/conn/p2p/scorers/bad_responses_test.go b/internal/pkg/conn/p2p/scorers/bad_responses_test.go
index 227169c0..c6c8f59f 100644
--- a/internal/pkg/conn/p2p/scorers/bad_responses_test.go
+++ b/internal/pkg/conn/p2p/scorers/bad_responses_test.go
@@ -7,24 +7,18 @@ import (
"github.com/libp2p/go-libp2p/core/network"
"github.com/libp2p/go-libp2p/core/peer"
- "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/peers"
- "github.com/prysmaticlabs/prysm/v3/testing/assert"
- "github.com/prysmaticlabs/prysm/v3/testing/require"
"github.com/rumsystem/quorum/internal/pkg/conn/p2p/peerdata"
"github.com/rumsystem/quorum/internal/pkg/conn/p2p/scorers"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestScorers_BadResponses_Score(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- PeerLimit: 30,
- ScorerParams: &scorers.Config{
- BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
- Threshold: 4,
- },
- },
+ peerStatuses := newTestPeerStatuses(ctx, 30, &scorers.Config{
+ BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{Threshold: 4},
})
scorer := peerStatuses.Scorers().BadResponsesScorer()
@@ -44,31 +38,22 @@ func TestScorers_BadResponses_ParamsThreshold(t *testing.T) {
defer cancel()
maxBadResponses := 2
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- PeerLimit: 30,
- ScorerParams: &scorers.Config{
- BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
- Threshold: maxBadResponses,
- },
- },
+ peerStatuses := newTestPeerStatuses(ctx, 30, &scorers.Config{
+ BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{Threshold: maxBadResponses},
})
- scorer := peerStatuses.Scorers()
- assert.Equal(t, maxBadResponses, scorer.BadResponsesScorer().Params().Threshold)
+ assert.Equal(t, maxBadResponses, peerStatuses.Scorers().BadResponsesScorer().Params().Threshold)
}
func TestScorers_BadResponses_Count(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- PeerLimit: 30,
- ScorerParams: &scorers.Config{},
- })
+ peerStatuses := newTestPeerStatuses(ctx, 30, &scorers.Config{})
scorer := peerStatuses.Scorers()
pid := peer.ID("peer1")
_, err := scorer.BadResponsesScorer().Count(pid)
- assert.ErrorContains(t, peerdata.ErrPeerUnknown.Error(), err)
+ assert.ErrorContains(t, err, peerdata.ErrPeerUnknown.Error())
peerStatuses.Add(nil, pid, nil, network.DirUnknown)
count, err := scorer.BadResponsesScorer().Count(pid)
@@ -81,13 +66,8 @@ func TestScorers_BadResponses_Decay(t *testing.T) {
defer cancel()
maxBadResponses := 2
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- PeerLimit: 30,
- ScorerParams: &scorers.Config{
- BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
- Threshold: maxBadResponses,
- },
- },
+ peerStatuses := newTestPeerStatuses(ctx, 30, &scorers.Config{
+ BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{Threshold: maxBadResponses},
})
scorer := peerStatuses.Scorers().BadResponsesScorer()
@@ -106,7 +86,7 @@ func TestScorers_BadResponses_Decay(t *testing.T) {
require.NoError(t, err)
assert.Equal(t, 1, badResponses)
- // Peer 3 has 2 bad response.
+ // Peer 3 has 2 bad responses.
pid3 := peer.ID("peer3")
peerStatuses.Add(nil, pid3, nil, network.DirUnknown)
scorer.Increment(pid3)
@@ -115,10 +95,10 @@ func TestScorers_BadResponses_Decay(t *testing.T) {
require.NoError(t, err)
assert.Equal(t, 2, badResponses)
- // Decay the values
+ // Decay the values.
scorer.Decay()
- // Ensure the new values are as expected
+ // Ensure the new values are as expected.
badResponses, err = scorer.Count(pid1)
require.NoError(t, err)
assert.Equal(t, 0, badResponses, "unexpected bad responses for pid1")
@@ -136,10 +116,7 @@ func TestScorers_BadResponses_IsBadPeer(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- PeerLimit: 30,
- ScorerParams: &scorers.Config{},
- })
+ peerStatuses := newTestPeerStatuses(ctx, 30, &scorers.Config{})
scorer := peerStatuses.Scorers().BadResponsesScorer()
pid := peer.ID("peer1")
assert.Equal(t, false, scorer.IsBadPeer(pid))
@@ -161,14 +138,11 @@ func TestScorers_BadResponses_BadPeers(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- PeerLimit: 30,
- ScorerParams: &scorers.Config{},
- })
+ peerStatuses := newTestPeerStatuses(ctx, 30, &scorers.Config{})
scorer := peerStatuses.Scorers().BadResponsesScorer()
- pids := []peer.ID{peer.ID("peer1"), peer.ID("peer2"), peer.ID("peer3"), peer.ID("peer4"), peer.ID("peer5")}
- for i := 0; i < len(pids); i++ {
- peerStatuses.Add(nil, pids[i], nil, network.DirUnknown)
+ pids := []peer.ID{"peer1", "peer2", "peer3", "peer4", "peer5"}
+ for _, pid := range pids {
+ peerStatuses.Add(nil, pid, nil, network.DirUnknown)
}
for i := 0; i < scorers.DefaultBadResponsesThreshold; i++ {
scorer.Increment(pids[1])
@@ -185,5 +159,5 @@ func TestScorers_BadResponses_BadPeers(t *testing.T) {
sort.Slice(badPeers, func(i, j int) bool {
return badPeers[i] < badPeers[j]
})
- assert.DeepEqual(t, want, badPeers, "Unexpected list of bad peers")
+ assert.Equal(t, want, badPeers, "Unexpected list of bad peers")
}
diff --git a/internal/pkg/conn/p2p/scorers/block_providers_test.go b/internal/pkg/conn/p2p/scorers/block_providers_test.go
index 97cb3253..9ebe1d0f 100644
--- a/internal/pkg/conn/p2p/scorers/block_providers_test.go
+++ b/internal/pkg/conn/p2p/scorers/block_providers_test.go
@@ -3,25 +3,22 @@ package scorers_test
import (
"context"
"fmt"
+ mrand "math/rand"
"sort"
"strconv"
"testing"
+ "time"
"github.com/libp2p/go-libp2p/core/peer"
- "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/peers"
- "github.com/prysmaticlabs/prysm/v3/cmd/beacon-chain/flags"
- "github.com/prysmaticlabs/prysm/v3/config/features"
- "github.com/prysmaticlabs/prysm/v3/crypto/rand"
- "github.com/prysmaticlabs/prysm/v3/testing/assert"
- "github.com/prysmaticlabs/prysm/v3/time"
"github.com/rumsystem/quorum/internal/pkg/conn/p2p/scorers"
+ "github.com/stretchr/testify/assert"
)
func TestScorers_BlockProvider_Score(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- batchSize := uint64(flags.Get().BlockBatchLimit)
+ batchSize := uint64(10)
tests := []struct {
name string
update func(scorer *scorers.BlockProviderScorer)
@@ -113,18 +110,15 @@ func TestScorers_BlockProvider_Score(t *testing.T) {
},
check: func(scorer *scorers.BlockProviderScorer) {
assert.Equal(t, scorer.Params().ProcessedBlocksCap, scorer.ProcessedBlocks("peer1"))
- assert.Equal(t, 1.0, scorer.Score("peer1"))
+ assert.Equal(t, scorer.MaxScore(), scorer.Score("peer1"))
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- PeerLimit: 30,
- ScorerParams: &scorers.Config{
- BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{},
- },
+ peerStatuses := newTestPeerStatuses(ctx, 30, &scorers.Config{
+ BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{},
})
scorer := peerStatuses.Scorers().BlockProviderScorer()
if tt.update != nil {
@@ -139,9 +133,7 @@ func TestScorers_BlockProvider_GettersSetters(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- ScorerParams: &scorers.Config{},
- })
+ peerStatuses := newTestPeerStatuses(ctx, 0, &scorers.Config{})
scorer := peerStatuses.Scorers().BlockProviderScorer()
assert.Equal(t, uint64(0), scorer.ProcessedBlocks("peer1"), "Unexpected count for unregistered peer")
@@ -152,16 +144,14 @@ func TestScorers_BlockProvider_GettersSetters(t *testing.T) {
func TestScorers_BlockProvider_WeightSorted(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- ScorerParams: &scorers.Config{
- BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{
- ProcessedBatchWeight: 0.01,
- },
+ peerStatuses := newTestPeerStatuses(ctx, 0, &scorers.Config{
+ BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{
+ ProcessedBatchWeight: 0.01,
},
})
scorer := peerStatuses.Scorers().BlockProviderScorer()
- batchSize := uint64(flags.Get().BlockBatchLimit)
- r := rand.NewDeterministicGenerator()
+ batchSize := uint64(10)
+ r := mrand.New(mrand.NewSource(0))
reverse := func(pids []peer.ID) []peer.ID {
tmp := make([]peer.ID, len(pids))
@@ -189,7 +179,7 @@ func TestScorers_BlockProvider_WeightSorted(t *testing.T) {
}
// Make sure that peers scores are correct (peer(n).score > peer(n-1).score).
// Peers should be returned in descending order (by score).
- assert.DeepEqual(t, reverse(pids), scorer.Sorted(pids, nil))
+ assert.Equal(t, reverse(pids), scorer.Sorted(pids, nil))
// Run weighted sort lots of time, to get accurate statistics of whether more heavy items
// are indeed preferred when sorting.
@@ -210,11 +200,11 @@ func TestScorers_BlockProvider_WeightSorted(t *testing.T) {
return scores[scoredPIDs[i]] > scores[scoredPIDs[j]]
})
assert.Equal(t, len(pids), len(scoredPIDs))
- assert.DeepEqual(t, reverse(pids), scoredPIDs, "Expected items with more weight to be picked more often")
+ assert.Equal(t, reverse(pids), scoredPIDs, "Expected items with more weight to be picked more often")
}
func TestScorers_BlockProvider_Sorted(t *testing.T) {
- batchSize := uint64(flags.Get().BlockBatchLimit)
+ batchSize := uint64(10)
tests := []struct {
name string
update func(s *scorers.BlockProviderScorer)
@@ -256,7 +246,7 @@ func TestScorers_BlockProvider_Sorted(t *testing.T) {
s.IncrementProcessedBlocks("peer3", batchSize*7+26)
},
have: []peer.ID{"peer1", "peer2", "peer3"},
- want: []peer.ID{"peer1", "peer2", "peer3"},
+ want: []peer.ID{"peer3", "peer2", "peer1"},
},
{
name: "different scores",
@@ -277,6 +267,7 @@ func TestScorers_BlockProvider_Sorted(t *testing.T) {
},
score: func(pid peer.ID, score float64) float64 {
if pid == "peer2" {
+ // Set another peer to a higher score.
return score + 0.3 // 0.2 + 0.3 = 0.5 > 0.4 (of peer3)
}
if pid == "peer1" {
@@ -292,16 +283,14 @@ func TestScorers_BlockProvider_Sorted(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- ScorerParams: &scorers.Config{
- BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{
- ProcessedBatchWeight: 0.2,
- },
+ peerStatuses := newTestPeerStatuses(ctx, 0, &scorers.Config{
+ BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{
+ ProcessedBatchWeight: 0.2,
},
})
scorer := peerStatuses.Scorers().BlockProviderScorer()
tt.update(scorer)
- assert.DeepEqual(t, tt.want, scorer.Sorted(tt.have, tt.score))
+ assert.Equal(t, tt.want, scorer.Sorted(tt.have, tt.score))
})
}
}
@@ -309,7 +298,7 @@ func TestScorers_BlockProvider_Sorted(t *testing.T) {
func TestScorers_BlockProvider_MaxScore(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- batchSize := uint64(flags.Get().BlockBatchLimit)
+ batchSize := uint64(10)
tests := []struct {
name string
@@ -319,7 +308,7 @@ func TestScorers_BlockProvider_MaxScore(t *testing.T) {
{
name: "default config",
cfg: &scorers.BlockProviderScorerConfig{},
- want: 1.0,
+ want: 6.4,
},
{
name: "custom config",
@@ -333,10 +322,8 @@ func TestScorers_BlockProvider_MaxScore(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- ScorerParams: &scorers.Config{
- BlockProviderScorerConfig: tt.cfg,
- },
+ peerStatuses := newTestPeerStatuses(ctx, 0, &scorers.Config{
+ BlockProviderScorerConfig: tt.cfg,
})
scorer := peerStatuses.Scorers().BlockProviderScorer()
assert.Equal(t, tt.want, scorer.MaxScore())
@@ -347,8 +334,8 @@ func TestScorers_BlockProvider_MaxScore(t *testing.T) {
func TestScorers_BlockProvider_FormatScorePretty(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- batchSize := uint64(flags.Get().BlockBatchLimit)
- format := "[%0.1f%%, raw: %0.2f, blocks: %d/1280]"
+ batchSize := uint64(10)
+ format := "[%0.1f%%, raw: %0.2f, blocks: %d/%d]"
tests := []struct {
name string
@@ -359,7 +346,7 @@ func TestScorers_BlockProvider_FormatScorePretty(t *testing.T) {
name: "peer not registered",
update: nil,
check: func(s *scorers.BlockProviderScorer) {
- assert.Equal(t, fmt.Sprintf(format, 100.0, 1.0, 0), s.FormatScorePretty("peer1"))
+ assert.Equal(t, fmt.Sprintf(format, 100.0, 1.0, 0, 20*batchSize), s.FormatScorePretty("peer1"))
},
},
{
@@ -368,7 +355,7 @@ func TestScorers_BlockProvider_FormatScorePretty(t *testing.T) {
s.Touch("peer1")
},
check: func(s *scorers.BlockProviderScorer) {
- assert.Equal(t, fmt.Sprintf(format, 0.0, 0.0, 0), s.FormatScorePretty("peer1"))
+ assert.Equal(t, fmt.Sprintf(format, 0.0, 0.0, 0, 20*batchSize), s.FormatScorePretty("peer1"))
},
},
{
@@ -377,7 +364,7 @@ func TestScorers_BlockProvider_FormatScorePretty(t *testing.T) {
s.IncrementProcessedBlocks("peer1", batchSize/4)
},
check: func(s *scorers.BlockProviderScorer) {
- assert.Equal(t, fmt.Sprintf(format, 0.0, 0.0, batchSize/4), s.FormatScorePretty("peer1"))
+ assert.Equal(t, fmt.Sprintf(format, 0.0, 0.0, batchSize/4, 20*batchSize), s.FormatScorePretty("peer1"))
},
},
{
@@ -386,7 +373,7 @@ func TestScorers_BlockProvider_FormatScorePretty(t *testing.T) {
s.IncrementProcessedBlocks("peer1", batchSize)
},
check: func(s *scorers.BlockProviderScorer) {
- assert.Equal(t, fmt.Sprintf(format, 5.0, 0.05, batchSize), s.FormatScorePretty("peer1"))
+ assert.Equal(t, fmt.Sprintf(format, 5.0, 0.05, batchSize, 20*batchSize), s.FormatScorePretty("peer1"))
},
},
{
@@ -395,7 +382,7 @@ func TestScorers_BlockProvider_FormatScorePretty(t *testing.T) {
s.IncrementProcessedBlocks("peer1", batchSize*3/2)
},
check: func(s *scorers.BlockProviderScorer) {
- assert.Equal(t, fmt.Sprintf(format, 5.0, 0.05, batchSize*3/2), s.FormatScorePretty("peer1"))
+ assert.Equal(t, fmt.Sprintf(format, 5.0, 0.05, batchSize*3/2, 20*batchSize), s.FormatScorePretty("peer1"))
},
},
{
@@ -404,7 +391,7 @@ func TestScorers_BlockProvider_FormatScorePretty(t *testing.T) {
s.IncrementProcessedBlocks("peer1", batchSize*5)
},
check: func(s *scorers.BlockProviderScorer) {
- assert.Equal(t, fmt.Sprintf(format, 25.0, 0.05*5, batchSize*5), s.FormatScorePretty("peer1"))
+ assert.Equal(t, fmt.Sprintf(format, 25.0, 0.05*5, batchSize*5, 20*batchSize), s.FormatScorePretty("peer1"))
},
},
{
@@ -413,7 +400,7 @@ func TestScorers_BlockProvider_FormatScorePretty(t *testing.T) {
s.IncrementProcessedBlocks("peer1", s.Params().ProcessedBlocksCap*5)
},
check: func(s *scorers.BlockProviderScorer) {
- want := fmt.Sprintf(format, 100.0, 1.0, s.Params().ProcessedBlocksCap)
+ want := fmt.Sprintf(format, 100.0, 1.0, s.Params().ProcessedBlocksCap, s.Params().ProcessedBlocksCap)
assert.Equal(t, want, s.FormatScorePretty("peer1"))
},
},
@@ -423,30 +410,28 @@ func TestScorers_BlockProvider_FormatScorePretty(t *testing.T) {
s.IncrementProcessedBlocks("peer1", batchSize*5)
s.IncrementProcessedBlocks("peer1", batchSize)
s.IncrementProcessedBlocks("peer1", batchSize/4)
- want := fmt.Sprintf(format, 30.0, 0.05*6, batchSize*6+batchSize/4)
+ want := fmt.Sprintf(format, 30.0, 0.05*6, batchSize*6+batchSize/4, 20*batchSize)
assert.Equal(t, want, s.FormatScorePretty("peer1"))
// Maximize block count.
s.IncrementProcessedBlocks("peer1", s.Params().ProcessedBlocksCap)
- want = fmt.Sprintf(format, 100.0, 1.0, s.Params().ProcessedBlocksCap)
+ want = fmt.Sprintf(format, 100.0, 1.0, s.Params().ProcessedBlocksCap, s.Params().ProcessedBlocksCap)
assert.Equal(t, want, s.FormatScorePretty("peer1"))
// Half of blocks is to be decayed.
s.Decay()
},
check: func(s *scorers.BlockProviderScorer) {
- want := fmt.Sprintf(format, 50.0, 0.5, s.Params().ProcessedBlocksCap/2)
+ want := fmt.Sprintf(format, 50.0, 0.5, s.Params().ProcessedBlocksCap/2, s.Params().ProcessedBlocksCap)
assert.Equal(t, want, s.FormatScorePretty("peer1"))
},
},
}
- peerStatusGen := func() *peers.Status {
- return peers.NewStatus(ctx, &peers.StatusConfig{
- ScorerParams: &scorers.Config{
- BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{
- ProcessedBatchWeight: 0.05,
- ProcessedBlocksCap: 20 * batchSize,
- Decay: 10 * batchSize,
- },
+ peerStatusGen := func() *testPeerStatuses {
+ return newTestPeerStatuses(ctx, 0, &scorers.Config{
+ BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{
+ ProcessedBatchWeight: 0.05,
+ ProcessedBlocksCap: 20 * batchSize,
+ Decay: 10 * batchSize,
},
})
}
@@ -461,24 +446,13 @@ func TestScorers_BlockProvider_FormatScorePretty(t *testing.T) {
})
}
- t.Run("peer scorer disabled", func(t *testing.T) {
- resetCfg := features.InitWithReset(&features.Flags{
- EnablePeerScorer: false,
- })
- defer resetCfg()
- peerStatuses := peerStatusGen()
- scorer := peerStatuses.Scorers().BlockProviderScorer()
- assert.Equal(t, "disabled", scorer.FormatScorePretty("peer1"))
- })
}
func TestScorers_BlockProvider_BadPeerMarking(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- ScorerParams: &scorers.Config{},
- })
+ peerStatuses := newTestPeerStatuses(ctx, 0, &scorers.Config{})
scorer := peerStatuses.Scorers().BlockProviderScorer()
assert.Equal(t, false, scorer.IsBadPeer("peer1"), "Unexpected status for unregistered peer")
diff --git a/internal/pkg/conn/p2p/scorers/peer_status.go b/internal/pkg/conn/p2p/scorers/peer_status.go
index 80db3bf6..95ad328f 100644
--- a/internal/pkg/conn/p2p/scorers/peer_status.go
+++ b/internal/pkg/conn/p2p/scorers/peer_status.go
@@ -6,9 +6,6 @@ import (
"github.com/libp2p/go-libp2p/core/peer"
"github.com/rumsystem/quorum/internal/pkg/conn/p2p/peerdata"
- //p2ptypes "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/types"
- //types "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives"
- //"github.com/prysmaticlabs/prysm/v3/time"
)
var _ Scorer = (*PeerStatusScorer)(nil)
@@ -18,8 +15,6 @@ var _ Scorer = (*PeerStatusScorer)(nil)
type PeerStatusScorer struct {
config *PeerStatusScorerConfig
store *peerdata.Store
- //ourHeadSlot types.Slot
- //highestPeerHeadSlot types.Slot
}
// PeerStatusScorerConfig holds configuration parameters for peer status scoring service.
@@ -48,21 +43,7 @@ func (s *PeerStatusScorer) score(pid peer.ID) float64 {
if s.isBadPeer(pid) {
return BadPeerScore
}
- score := float64(0)
- //peerData, ok := s.store.PeerData(pid)
- //if !ok || peerData.ChainState == nil {
- // return score
- //}
- //if peerData.ChainState.HeadSlot < s.ourHeadSlot {
- // return score
- //}
- // Calculate score as a ratio to the known maximum head slot.
- // The closer the current peer's head slot to the maximum, the higher is the calculated score.
- //if s.highestPeerHeadSlot > 0 {
- // score = float64(peerData.ChainState.HeadSlot) / float64(s.highestPeerHeadSlot)
- // return math.Round(score*ScoreRoundingFactor) / ScoreRoundingFactor
- //}
- return score
+ return 0
}
// IsBadPeer states if the peer is to be considered bad.
@@ -106,53 +87,28 @@ func (s *PeerStatusScorer) BadPeers() []peer.ID {
return badPeers
}
-// SetPeerStatus sets chain state data for a given peer.
-//func (s *PeerStatusScorer) SetPeerStatus(pid peer.ID, chainState Status, validationError error) {
+// SetPeerStatus records the latest validation result for a given peer.
func (s *PeerStatusScorer) SetPeerStatus(pid peer.ID, validationError error) {
s.store.Lock()
defer s.store.Unlock()
peerData := s.store.PeerDataGetOrCreate(pid)
- //peerData.ChainState = chainState
peerData.ChainStateLastUpdated = time.Now()
peerData.ChainStateValidationError = validationError
-
- // Update maximum known head slot (scores will be calculated with respect to that maximum value).
- //if chainState != nil && chainState.HeadSlot > s.highestPeerHeadSlot {
- // s.highestPeerHeadSlot = chainState.HeadSlot
- //}
}
-// PeerStatus gets the chain state of the given remote peer.
-// This can return nil if there is no known chain state for the peer.
+// PeerStatus returns the known status placeholder for the given remote peer.
// This will error if the peer does not exist.
-//func (s *PeerStatusScorer) PeerStatus(pid peer.ID) (Status, error) {
func (s *PeerStatusScorer) PeerStatus(pid peer.ID) (int, error) {
s.store.RLock()
defer s.store.RUnlock()
- //return s.peerStatus(pid)
- return 0, nil
+ return s.peerStatus(pid)
}
// peerStatus lock-free version of PeerStatus.
-//func (s *PeerStatusScorer) peerStatus(pid peer.ID) (Status, error) {
func (s *PeerStatusScorer) peerStatus(pid peer.ID) (int, error) {
- //if peerData, ok := s.store.PeerData(pid); ok {
if _, ok := s.store.PeerData(pid); ok {
- //if peerData.ChainState == nil {
- // //return nil, peerdata.ErrNoPeerStatus
- // return 0, peerdata.ErrNoPeerStatus
- //}
- //return peerData.ChainState, nil
return 0, nil
}
- //return nil, peerdata.ErrPeerUnknown
return 0, peerdata.ErrPeerUnknown
}
-
-// SetHeadSlot updates known head slot.
-//func (s *PeerStatusScorer) SetHeadSlot(slot types.Slot) {
-// s.store.Lock()
-// defer s.store.Unlock()
-// s.ourHeadSlot = slot
-//}
diff --git a/internal/pkg/conn/p2p/scorers/peer_status_test.go b/internal/pkg/conn/p2p/scorers/peer_status_test.go
index 50adba7b..3919fe94 100644
--- a/internal/pkg/conn/p2p/scorers/peer_status_test.go
+++ b/internal/pkg/conn/p2p/scorers/peer_status_test.go
@@ -5,195 +5,39 @@ import (
"testing"
"github.com/libp2p/go-libp2p/core/peer"
- "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/peers"
- "github.com/rumsystem/quorum/internal/pkg/conn/p2p/peerdata"
"github.com/rumsystem/quorum/internal/pkg/conn/p2p/scorers"
-
- p2ptypes "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/types"
- types "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives"
- pb "github.com/prysmaticlabs/prysm/v3/proto/prysm/v1alpha1"
- "github.com/prysmaticlabs/prysm/v3/testing/assert"
- "github.com/prysmaticlabs/prysm/v3/testing/require"
+ "github.com/stretchr/testify/assert"
)
func TestScorers_PeerStatus_Score(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- tests := []struct {
- name string
- update func(scorer *scorers.PeerStatusScorer)
- check func(scorer *scorers.PeerStatusScorer)
- }{
- {
- name: "nonexistent peer",
- update: func(scorer *scorers.PeerStatusScorer) {
- scorer.SetHeadSlot(64)
- },
- check: func(scorer *scorers.PeerStatusScorer) {
- assert.Equal(t, 0.0, scorer.Score("peer1"), "Unexpected score")
- },
- },
- {
- name: "existent bad peer",
- update: func(scorer *scorers.PeerStatusScorer) {
- scorer.SetHeadSlot(0)
- scorer.SetPeerStatus("peer1", &pb.Status{
- HeadRoot: make([]byte, 32),
- HeadSlot: 64,
- }, p2ptypes.ErrWrongForkDigestVersion)
- },
- check: func(scorer *scorers.PeerStatusScorer) {
- assert.Equal(t, scorers.BadPeerScore, scorer.Score("peer1"), "Unexpected score")
- },
- },
- {
- name: "existent peer no head slot for the host node is known",
- update: func(scorer *scorers.PeerStatusScorer) {
- scorer.SetHeadSlot(0)
- scorer.SetPeerStatus("peer1", &pb.Status{
- HeadRoot: make([]byte, 32),
- HeadSlot: 64,
- }, nil)
- },
- check: func(scorer *scorers.PeerStatusScorer) {
- assert.Equal(t, 1.0, scorer.Score("peer1"), "Unexpected score")
- },
- },
- {
- name: "existent peer head is before ours",
- update: func(scorer *scorers.PeerStatusScorer) {
- scorer.SetHeadSlot(128)
- scorer.SetPeerStatus("peer1", &pb.Status{
- HeadRoot: make([]byte, 32),
- HeadSlot: 64,
- }, nil)
- },
- check: func(scorer *scorers.PeerStatusScorer) {
- assert.Equal(t, 0.0, scorer.Score("peer1"), "Unexpected score")
- },
- },
- {
- name: "existent peer partial score",
- update: func(scorer *scorers.PeerStatusScorer) {
- headSlot := types.Slot(128)
- scorer.SetHeadSlot(headSlot)
- scorer.SetPeerStatus("peer1", &pb.Status{
- HeadRoot: make([]byte, 32),
- HeadSlot: headSlot + 64,
- }, nil)
- // Set another peer to a higher score.
- scorer.SetPeerStatus("peer2", &pb.Status{
- HeadRoot: make([]byte, 32),
- HeadSlot: headSlot + 128,
- }, nil)
- },
- check: func(scorer *scorers.PeerStatusScorer) {
- headSlot := uint64(128)
- assert.Equal(t, float64(headSlot+64)/float64(headSlot+128), scorer.Score("peer1"), "Unexpected score")
- },
- },
- {
- name: "existent peer full score",
- update: func(scorer *scorers.PeerStatusScorer) {
- headSlot := types.Slot(128)
- scorer.SetHeadSlot(headSlot)
- scorer.SetPeerStatus("peer1", &pb.Status{
- HeadRoot: make([]byte, 32),
- HeadSlot: headSlot + 64,
- }, nil)
- },
- check: func(scorer *scorers.PeerStatusScorer) {
- assert.Equal(t, 1.0, scorer.Score("peer1"), "Unexpected score")
- },
- },
- {
- name: "existent peer no max known slot",
- update: func(scorer *scorers.PeerStatusScorer) {
- scorer.SetHeadSlot(0)
- scorer.SetPeerStatus("peer1", &pb.Status{
- HeadRoot: make([]byte, 32),
- HeadSlot: 0,
- }, nil)
- },
- check: func(scorer *scorers.PeerStatusScorer) {
- assert.Equal(t, 0.0, scorer.Score("peer1"), "Unexpected score")
- },
- },
- }
+ peerStatuses := newTestPeerStatuses(ctx, 30, &scorers.Config{})
+ scorer := peerStatuses.Scorers().PeerStatusScorer()
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- ScorerParams: &scorers.Config{},
- })
- scorer := peerStatuses.Scorers().PeerStatusScorer()
- if tt.update != nil {
- tt.update(scorer)
- }
- tt.check(scorer)
- })
- }
-}
+ assert.Equal(t, 0.0, scorer.Score("peer1"), "Unexpected score for nonexistent peer")
-func TestScorers_PeerStatus_IsBadPeer(t *testing.T) {
- peerStatuses := peers.NewStatus(context.Background(), &peers.StatusConfig{
- ScorerParams: &scorers.Config{},
- })
- pid := peer.ID("peer1")
- assert.Equal(t, false, peerStatuses.Scorers().IsBadPeer(pid))
- assert.Equal(t, false, peerStatuses.Scorers().PeerStatusScorer().IsBadPeer(pid))
+ scorer.SetPeerStatus("peer1", nil)
+ assert.Equal(t, 0.0, scorer.Score("peer1"), "Unexpected score for valid peer")
- peerStatuses.Scorers().PeerStatusScorer().SetPeerStatus(pid, &pb.Status{}, p2ptypes.ErrWrongForkDigestVersion)
- assert.Equal(t, true, peerStatuses.Scorers().IsBadPeer(pid))
- assert.Equal(t, true, peerStatuses.Scorers().PeerStatusScorer().IsBadPeer(pid))
+ scorer.SetPeerStatus("peer2", scorers.ErrWrongForkDigestVersion)
+ assert.Equal(t, scorers.BadPeerScore, scorer.Score("peer2"), "Unexpected score for bad peer")
}
func TestScorers_PeerStatus_BadPeers(t *testing.T) {
- peerStatuses := peers.NewStatus(context.Background(), &peers.StatusConfig{
- ScorerParams: &scorers.Config{},
- })
- pid1 := peer.ID("peer1")
- pid2 := peer.ID("peer2")
- pid3 := peer.ID("peer3")
- assert.Equal(t, false, peerStatuses.Scorers().IsBadPeer(pid1))
- assert.Equal(t, false, peerStatuses.Scorers().PeerStatusScorer().IsBadPeer(pid1))
- assert.Equal(t, false, peerStatuses.Scorers().IsBadPeer(pid2))
- assert.Equal(t, false, peerStatuses.Scorers().PeerStatusScorer().IsBadPeer(pid2))
- assert.Equal(t, false, peerStatuses.Scorers().IsBadPeer(pid3))
- assert.Equal(t, false, peerStatuses.Scorers().PeerStatusScorer().IsBadPeer(pid3))
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
- peerStatuses.Scorers().PeerStatusScorer().SetPeerStatus(pid1, &pb.Status{}, p2ptypes.ErrWrongForkDigestVersion)
- peerStatuses.Scorers().PeerStatusScorer().SetPeerStatus(pid2, &pb.Status{}, nil)
- peerStatuses.Scorers().PeerStatusScorer().SetPeerStatus(pid3, &pb.Status{}, p2ptypes.ErrWrongForkDigestVersion)
- assert.Equal(t, true, peerStatuses.Scorers().IsBadPeer(pid1))
- assert.Equal(t, true, peerStatuses.Scorers().PeerStatusScorer().IsBadPeer(pid1))
- assert.Equal(t, false, peerStatuses.Scorers().IsBadPeer(pid2))
- assert.Equal(t, false, peerStatuses.Scorers().PeerStatusScorer().IsBadPeer(pid2))
- assert.Equal(t, true, peerStatuses.Scorers().IsBadPeer(pid3))
- assert.Equal(t, true, peerStatuses.Scorers().PeerStatusScorer().IsBadPeer(pid3))
- assert.Equal(t, 2, len(peerStatuses.Scorers().PeerStatusScorer().BadPeers()))
- assert.Equal(t, 2, len(peerStatuses.Scorers().BadPeers()))
-}
+ peerStatuses := newTestPeerStatuses(ctx, 30, &scorers.Config{})
+ scorer := peerStatuses.Scorers().PeerStatusScorer()
-func TestScorers_PeerStatus_PeerStatus(t *testing.T) {
- peerStatuses := peers.NewStatus(context.Background(), &peers.StatusConfig{
- ScorerParams: &scorers.Config{},
- })
- status, err := peerStatuses.Scorers().PeerStatusScorer().PeerStatus("peer1")
- require.ErrorContains(t, peerdata.ErrPeerUnknown.Error(), err)
- assert.Equal(t, (*pb.Status)(nil), status)
+ scorer.SetPeerStatus(peer.ID("peer1"), nil)
+ scorer.SetPeerStatus(peer.ID("peer2"), scorers.ErrInvalidRequest)
+ scorer.SetPeerStatus(peer.ID("peer3"), nil)
- peerStatuses.Scorers().PeerStatusScorer().SetPeerStatus("peer1", &pb.Status{
- HeadSlot: 128,
- }, nil)
- peerStatuses.Scorers().PeerStatusScorer().SetPeerStatus("peer2", &pb.Status{
- HeadSlot: 128,
- }, p2ptypes.ErrInvalidEpoch)
- status, err = peerStatuses.Scorers().PeerStatusScorer().PeerStatus("peer1")
- require.NoError(t, err)
- assert.Equal(t, types.Slot(128), status.HeadSlot)
- assert.Equal(t, nil, peerStatuses.Scorers().ValidationError("peer1"))
- assert.ErrorContains(t, p2ptypes.ErrInvalidEpoch.Error(), peerStatuses.Scorers().ValidationError("peer2"))
- assert.Equal(t, nil, peerStatuses.Scorers().ValidationError("peer3"))
+ assert.Equal(t, false, scorer.IsBadPeer("peer1"))
+ assert.Equal(t, true, scorer.IsBadPeer("peer2"))
+ assert.Equal(t, false, scorer.IsBadPeer("peer3"))
+ assert.Equal(t, []peer.ID{peer.ID("peer2")}, scorer.BadPeers())
}
diff --git a/internal/pkg/conn/p2p/scorers/scorers_test.go b/internal/pkg/conn/p2p/scorers/scorers_test.go
index e6e12fac..c0f3d935 100644
--- a/internal/pkg/conn/p2p/scorers/scorers_test.go
+++ b/internal/pkg/conn/p2p/scorers/scorers_test.go
@@ -1,12 +1,14 @@
package scorers_test
import (
+ "context"
"io"
"math"
"testing"
- "github.com/prysmaticlabs/prysm/v3/cmd/beacon-chain/flags"
- "github.com/prysmaticlabs/prysm/v3/config/features"
+ "github.com/libp2p/go-libp2p/core/network"
+ "github.com/libp2p/go-libp2p/core/peer"
+ "github.com/rumsystem/quorum/internal/pkg/conn/p2p/peerdata"
"github.com/rumsystem/quorum/internal/pkg/conn/p2p/scorers"
"github.com/sirupsen/logrus"
)
@@ -14,20 +16,6 @@ import (
func TestMain(m *testing.M) {
logrus.SetLevel(logrus.DebugLevel)
logrus.SetOutput(io.Discard)
-
- resetCfg := features.InitWithReset(&features.Flags{
- EnablePeerScorer: true,
- })
- defer resetCfg()
-
- resetFlags := flags.Get()
- flags.Init(&flags.GlobalFlags{
- BlockBatchLimit: 64,
- BlockBatchLimitBurstFactor: 10,
- })
- defer func() {
- flags.Init(resetFlags)
- }()
m.Run()
}
@@ -35,3 +23,30 @@ func TestMain(m *testing.M) {
func roundScore(score float64) float64 {
return math.Round(score*scorers.ScoreRoundingFactor) / scorers.ScoreRoundingFactor
}
+
+type testPeerStatuses struct {
+ store *peerdata.Store
+ scorers *scorers.Service
+}
+
+func newTestPeerStatuses(ctx context.Context, maxPeers int, config *scorers.Config) *testPeerStatuses {
+ if config == nil {
+ config = &scorers.Config{}
+ }
+ store := peerdata.NewStore(ctx, &peerdata.StoreConfig{MaxPeers: maxPeers})
+ return &testPeerStatuses{
+ store: store,
+ scorers: scorers.NewService(ctx, store, config),
+ }
+}
+
+func (p *testPeerStatuses) Scorers() *scorers.Service {
+ return p.scorers
+}
+
+func (p *testPeerStatuses) Add(_ interface{}, pid peer.ID, _ interface{}, direction network.Direction) {
+ p.store.Lock()
+ defer p.store.Unlock()
+ data := p.store.PeerDataGetOrCreate(pid)
+ data.Direction = direction
+}
diff --git a/internal/pkg/conn/p2p/scorers/service_test.go b/internal/pkg/conn/p2p/scorers/service_test.go
index fb96be0e..cb38b37b 100644
--- a/internal/pkg/conn/p2p/scorers/service_test.go
+++ b/internal/pkg/conn/p2p/scorers/service_test.go
@@ -7,30 +7,23 @@ import (
"github.com/libp2p/go-libp2p/core/network"
"github.com/libp2p/go-libp2p/core/peer"
- "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/peers"
-
- "github.com/prysmaticlabs/prysm/v3/cmd/beacon-chain/flags"
- "github.com/prysmaticlabs/prysm/v3/testing/assert"
"github.com/rumsystem/quorum/internal/pkg/conn/p2p/scorers"
+ "github.com/stretchr/testify/assert"
)
func TestScorers_Service_Init(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- batchSize := uint64(flags.Get().BlockBatchLimit)
+ batchSize := uint64(10)
t.Run("default config", func(t *testing.T) {
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- PeerLimit: 30,
- ScorerParams: &scorers.Config{},
- })
+ peerStatuses := newTestPeerStatuses(ctx, 30, &scorers.Config{})
t.Run("bad responses scorer", func(t *testing.T) {
params := peerStatuses.Scorers().BadResponsesScorer().Params()
assert.Equal(t, scorers.DefaultBadResponsesThreshold, params.Threshold, "Unexpected threshold value")
- assert.Equal(t, scorers.DefaultBadResponsesDecayInterval,
- params.DecayInterval, "Unexpected decay interval value")
+ assert.Equal(t, scorers.DefaultBadResponsesDecayInterval, params.DecayInterval, "Unexpected decay interval value")
})
t.Run("block providers scorer", func(t *testing.T) {
@@ -44,34 +37,31 @@ func TestScorers_Service_Init(t *testing.T) {
})
t.Run("explicit config", func(t *testing.T) {
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- PeerLimit: 30,
- ScorerParams: &scorers.Config{
- BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
- Threshold: 2,
- DecayInterval: 1 * time.Minute,
- },
- BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{
- ProcessedBatchWeight: 0.2,
- ProcessedBlocksCap: batchSize * 5,
- DecayInterval: 1 * time.Minute,
- Decay: 16,
- StalePeerRefreshInterval: 5 * time.Hour,
- },
+ peerStatuses := newTestPeerStatuses(ctx, 30, &scorers.Config{
+ BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
+ Threshold: 2,
+ DecayInterval: time.Minute,
+ },
+ BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{
+ ProcessedBatchWeight: 0.2,
+ ProcessedBlocksCap: batchSize * 5,
+ DecayInterval: time.Minute,
+ Decay: 16,
+ StalePeerRefreshInterval: 5 * time.Hour,
},
})
t.Run("bad responses scorer", func(t *testing.T) {
params := peerStatuses.Scorers().BadResponsesScorer().Params()
assert.Equal(t, 2, params.Threshold, "Unexpected threshold value")
- assert.Equal(t, 1*time.Minute, params.DecayInterval, "Unexpected decay interval value")
+ assert.Equal(t, time.Minute, params.DecayInterval, "Unexpected decay interval value")
})
t.Run("block provider scorer", func(t *testing.T) {
params := peerStatuses.Scorers().BlockProviderScorer().Params()
assert.Equal(t, 0.2, params.ProcessedBatchWeight)
assert.Equal(t, batchSize*5, params.ProcessedBlocksCap)
- assert.Equal(t, 1*time.Minute, params.DecayInterval)
+ assert.Equal(t, time.Minute, params.DecayInterval)
assert.Equal(t, uint64(16), params.Decay)
assert.Equal(t, 5*time.Hour, params.StalePeerRefreshInterval)
assert.Equal(t, 1.0, peerStatuses.Scorers().BlockProviderScorer().MaxScore())
@@ -83,7 +73,7 @@ func TestScorers_Service_Score(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
- batchSize := uint64(flags.Get().BlockBatchLimit)
+ batchSize := uint64(10)
peerScores := func(s *scorers.Service, pids []peer.ID) map[string]float64 {
scores := make(map[string]float64, len(pids))
@@ -101,7 +91,7 @@ func TestScorers_Service_Score(t *testing.T) {
return scores
}
- pack := func(scorer *scorers.Service, s1, s2, s3 float64) map[string]float64 {
+ pack := func(_ *scorers.Service, s1, s2, s3 float64) map[string]float64 {
return map[string]float64{
"peer1": roundScore(s1),
"peer2": roundScore(s2),
@@ -110,16 +100,9 @@ func TestScorers_Service_Score(t *testing.T) {
}
setupScorer := func() (*scorers.Service, []peer.ID) {
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- PeerLimit: 30,
- ScorerParams: &scorers.Config{
- BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
- Threshold: 5,
- },
- BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{
- Decay: 64,
- },
- },
+ peerStatuses := newTestPeerStatuses(ctx, 30, &scorers.Config{
+ BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{Threshold: 5},
+ BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{Decay: 64},
})
s := peerStatuses.Scorers()
pids := []peer.ID{"peer1", "peer2", "peer3"}
@@ -131,9 +114,7 @@ func TestScorers_Service_Score(t *testing.T) {
}
t.Run("no peer registered", func(t *testing.T) {
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- ScorerParams: &scorers.Config{},
- })
+ peerStatuses := newTestPeerStatuses(ctx, 0, &scorers.Config{})
s := peerStatuses.Scorers()
assert.Equal(t, 0.0, s.BadResponsesScorer().Score("peer1"))
assert.Equal(t, s.BlockProviderScorer().MaxScore(), s.BlockProviderScorer().Score("peer1"))
@@ -142,22 +123,22 @@ func TestScorers_Service_Score(t *testing.T) {
t.Run("bad responses score", func(t *testing.T) {
s, pids := setupScorer()
- // Peers start with boosted start score (new peers are boosted by block provider).
+ // Peers start at neutral score; bad responses add weighted penalties.
startScore := float64(0)
- penalty := (-10 / float64(s.BadResponsesScorer().Params().Threshold)) * 0.3
+ penalty := (-10 / float64(s.BadResponsesScorer().Params().Threshold)) * 0.5
// Update peers' stats and test the effect on peer order.
s.BadResponsesScorer().Increment("peer2")
- assert.DeepEqual(t, pack(s, startScore, startScore+penalty, startScore), peerScores(s, pids))
+ assert.Equal(t, pack(s, startScore, startScore+penalty, startScore), peerScores(s, pids))
s.BadResponsesScorer().Increment("peer1")
s.BadResponsesScorer().Increment("peer1")
- assert.DeepEqual(t, pack(s, startScore+2*penalty, startScore+penalty, startScore), peerScores(s, pids))
+ assert.Equal(t, pack(s, startScore+2*penalty, startScore+penalty, startScore), peerScores(s, pids))
// See how decaying affects order of peers.
s.BadResponsesScorer().Decay()
- assert.DeepEqual(t, pack(s, startScore+penalty, startScore, startScore), peerScores(s, pids))
+ assert.Equal(t, pack(s, startScore+penalty, startScore, startScore), peerScores(s, pids))
s.BadResponsesScorer().Decay()
- assert.DeepEqual(t, pack(s, startScore, startScore, startScore), peerScores(s, pids))
+ assert.Equal(t, pack(s, startScore, startScore, startScore), peerScores(s, pids))
})
t.Run("block providers score", func(t *testing.T) {
@@ -172,33 +153,33 @@ func TestScorers_Service_Score(t *testing.T) {
// Single batch.
s1.IncrementProcessedBlocks("peer1", batchSize)
- assert.DeepEqual(t, pack(s, batchWeight, startScore, startScore), blkProviderScorers(s, pids), "Unexpected scores")
+ assert.Equal(t, pack(s, batchWeight, startScore, startScore), blkProviderScorers(s, pids), "Unexpected scores")
// Multiple batches.
s1.IncrementProcessedBlocks("peer2", batchSize*4)
- assert.DeepEqual(t, pack(s, batchWeight, batchWeight*4, startScore), blkProviderScorers(s, pids), "Unexpected scores")
+ assert.Equal(t, pack(s, batchWeight, batchWeight*4, startScore), blkProviderScorers(s, pids), "Unexpected scores")
// Partial batch.
s1.IncrementProcessedBlocks("peer3", batchSize/2)
- assert.DeepEqual(t, pack(s, batchWeight, batchWeight*4, 0), blkProviderScorers(s, pids), "Unexpected scores")
+ assert.Equal(t, pack(s, batchWeight, batchWeight*4, 0), blkProviderScorers(s, pids), "Unexpected scores")
// See effect of decaying.
assert.Equal(t, batchSize+batchSize/4, s1.ProcessedBlocks("peer1"))
assert.Equal(t, batchSize*4, s1.ProcessedBlocks("peer2"))
assert.Equal(t, batchSize/2, s1.ProcessedBlocks("peer3"))
- assert.DeepEqual(t, pack(s, batchWeight, batchWeight*4, 0), blkProviderScorers(s, pids), "Unexpected scores")
+ assert.Equal(t, pack(s, batchWeight, batchWeight*4, 0), blkProviderScorers(s, pids), "Unexpected scores")
s1.Decay()
- assert.Equal(t, batchSize/4, s1.ProcessedBlocks("peer1"))
- assert.Equal(t, batchSize*3, s1.ProcessedBlocks("peer2"))
+ assert.Equal(t, uint64(0), s1.ProcessedBlocks("peer1"))
+ assert.Equal(t, uint64(0), s1.ProcessedBlocks("peer2"))
assert.Equal(t, uint64(0), s1.ProcessedBlocks("peer3"))
- assert.DeepEqual(t, pack(s, 0, batchWeight*3, 0), blkProviderScorers(s, pids), "Unexpected scores")
+ assert.Equal(t, pack(s, 0, 0, 0), blkProviderScorers(s, pids), "Unexpected scores")
})
t.Run("overall score", func(t *testing.T) {
s, _ := setupScorer()
s1 := s.BlockProviderScorer()
s2 := s.BadResponsesScorer()
- penalty := (-10 / float64(s.BadResponsesScorer().Params().Threshold)) * 0.3
+ penalty := (-10 / float64(s.BadResponsesScorer().Params().Threshold)) * 0.5
// Full score, no penalty.
s1.IncrementProcessedBlocks("peer1", batchSize*5)
@@ -217,17 +198,14 @@ func TestScorers_Service_loop(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
- peerStatuses := peers.NewStatus(ctx, &peers.StatusConfig{
- PeerLimit: 30,
- ScorerParams: &scorers.Config{
- BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
- Threshold: 5,
- DecayInterval: 50 * time.Millisecond,
- },
- BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{
- DecayInterval: 25 * time.Millisecond,
- Decay: 64,
- },
+ peerStatuses := newTestPeerStatuses(ctx, 30, &scorers.Config{
+ BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
+ Threshold: 5,
+ DecayInterval: 50 * time.Millisecond,
+ },
+ BlockProviderScorerConfig: &scorers.BlockProviderScorerConfig{
+ DecayInterval: 25 * time.Millisecond,
+ Decay: 64,
},
})
s1 := peerStatuses.Scorers().BadResponsesScorer()
@@ -253,7 +231,7 @@ func TestScorers_Service_loop(t *testing.T) {
for {
select {
case <-ticker.C:
- if s1.IsBadPeer(pid1) == false && s2.ProcessedBlocks("peer1") == 0 {
+ if !s1.IsBadPeer(pid1) && s2.ProcessedBlocks("peer1") == 0 {
return
}
case <-ctx.Done():
@@ -269,13 +247,10 @@ func TestScorers_Service_loop(t *testing.T) {
}
func TestScorers_Service_IsBadPeer(t *testing.T) {
- peerStatuses := peers.NewStatus(context.Background(), &peers.StatusConfig{
- PeerLimit: 30,
- ScorerParams: &scorers.Config{
- BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
- Threshold: 2,
- DecayInterval: 50 * time.Second,
- },
+ peerStatuses := newTestPeerStatuses(context.Background(), 30, &scorers.Config{
+ BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
+ Threshold: 2,
+ DecayInterval: 50 * time.Second,
},
})
@@ -286,13 +261,10 @@ func TestScorers_Service_IsBadPeer(t *testing.T) {
}
func TestScorers_Service_BadPeers(t *testing.T) {
- peerStatuses := peers.NewStatus(context.Background(), &peers.StatusConfig{
- PeerLimit: 30,
- ScorerParams: &scorers.Config{
- BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
- Threshold: 2,
- DecayInterval: 50 * time.Second,
- },
+ peerStatuses := newTestPeerStatuses(context.Background(), 30, &scorers.Config{
+ BadResponsesScorerConfig: &scorers.BadResponsesScorerConfig{
+ Threshold: 2,
+ DecayInterval: 50 * time.Second,
},
})
diff --git a/internal/pkg/storage/chain/consensusdb.go b/internal/pkg/storage/chain/consensusdb.go
index 23b25ed8..96351bfa 100644
--- a/internal/pkg/storage/chain/consensusdb.go
+++ b/internal/pkg/storage/chain/consensusdb.go
@@ -3,9 +3,9 @@ package chainstorage
import (
"errors"
- "github.com/golang/protobuf/proto"
s "github.com/rumsystem/quorum/internal/pkg/storage"
quorumpb "github.com/rumsystem/quorum/pkg/pb"
+ "google.golang.org/protobuf/proto"
)
func (cs *Storage) AddTrxHBB(trx *quorumpb.Trx, queueId string) error {
diff --git a/main_test.go b/main_test.go
index bb1cd089..d8762c63 100644
--- a/main_test.go
+++ b/main_test.go
@@ -75,6 +75,11 @@ func TestMain(m *testing.M) {
return
}
+ unlock, err := testnode.AcquireIntegrationTestLock()
+ if err != nil {
+ panic(err)
+ }
+
logger.Debugf("Setup test env")
logger.Debugf(">>> full nodes: <%d>", fullnodes)
logger.Debugf(">>> producer nodes: <%d>", producernodes)
@@ -115,6 +120,7 @@ func TestMain(m *testing.M) {
exitVal := m.Run()
logger.Debug("all tests finished, clean up:", tempdatadir)
testnode.Cleanup(tempdatadir, nodelist)
+ unlock()
os.Exit(exitVal)
}
diff --git a/makefile b/makefile
index e996801c..d6f4201e 100644
--- a/makefile
+++ b/makefile
@@ -1,35 +1,52 @@
PROTOC_GEN_GO = $(GOPATH)/bin/protoc-gen-go
PROTOC = $(shell which protoc)
+APP_NAME ?= quorum
+DIST_DIR ?= dist
+GIT_COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo devel)
+LDFLAGS ?= -s -w -X main.GitCommit=$(GIT_COMMIT)
+CGO_ENABLED ?= 0
+GORELEASER_VERSION ?= v2.17.0-d9421c5f-nightly
+SWAG_VERSION ?= v1.16.6
+
+.PHONY: build linux windows freebsd darwin buildall install-goreleaser goreleaser-build goreleaser-build-all release install-swag gen-doc serve-doc test-main test-main-rex test-api test all
install-goreleaser:
- go install github.com/goreleaser/goreleaser@v1.18.2
+ go install github.com/goreleaser/goreleaser/v2@$(GORELEASER_VERSION)
-linux: install-goreleaser
- GOOS=linux GOARCH=amd64 goreleaser build --snapshot --clean --single-target
+build:
+ GOOS= GOARCH= CGO_ENABLED=$(CGO_ENABLED) go build -ldflags "$(LDFLAGS)" -o $(DIST_DIR)/$(APP_NAME) .
+
+linux:
+ GOOS=linux GOARCH=amd64 CGO_ENABLED=$(CGO_ENABLED) go build -ldflags "$(LDFLAGS)" -o $(DIST_DIR)/$(APP_NAME)_linux_amd64/$(APP_NAME) .
-windows: install-goreleaser
- GOOS=windows GOARCH=amd64 goreleaser build --snapshot --clean --single-target
+windows:
+ GOOS=windows GOARCH=amd64 CGO_ENABLED=$(CGO_ENABLED) go build -ldflags "$(LDFLAGS)" -o $(DIST_DIR)/$(APP_NAME)_windows_amd64/$(APP_NAME).exe .
-freebsd: install-goreleaser
- GOOS=freebsd GOARCH=amd64 goreleaser build --snapshot --clean --single-target
+freebsd:
+ GOOS=freebsd GOARCH=amd64 CGO_ENABLED=$(CGO_ENABLED) go build -ldflags "$(LDFLAGS)" -o $(DIST_DIR)/$(APP_NAME)_freebsd_amd64/$(APP_NAME) .
-darwin: install-goreleaser
- GOOS=darwin GOARCH=amd64 goreleaser build --snapshot --clean --single-target
+darwin:
+ GOOS=darwin GOARCH=amd64 CGO_ENABLED=$(CGO_ENABLED) go build -ldflags "$(LDFLAGS)" -o $(DIST_DIR)/$(APP_NAME)_darwin_amd64/$(APP_NAME) .
+
+buildall: linux windows freebsd darwin
+
+goreleaser-build: install-goreleaser
+ GOOS=linux GOARCH=amd64 goreleaser build --snapshot --clean --single-target
-buildall: install-goreleaser
+goreleaser-build-all: install-goreleaser
goreleaser build --snapshot --clean
release: install-goreleaser
goreleaser release --clean
install-swag:
- go install github.com/swaggo/swag/cmd/swag@v1.8.4
+ go install github.com/swaggo/swag/cmd/swag@$(SWAG_VERSION)
gen-doc: install-swag
$(shell which swag) init -g main.go --parseDependency --parseInternal --parseDepth 3 --parseGoList=true
serve-doc: gen-doc
- go run ./docs.go
+ go run -tags docs ./docs.go
test-main:
go test -timeout 99999s main_test.go -v
diff --git a/pkg/chainapi/api/fixture_test.go b/pkg/chainapi/api/fixture_test.go
index f34b4333..ea6a9589 100644
--- a/pkg/chainapi/api/fixture_test.go
+++ b/pkg/chainapi/api/fixture_test.go
@@ -37,6 +37,11 @@ var (
func TestMain(m *testing.M) {
fullnodes = 2
+ unlock, err := testnode.AcquireIntegrationTestLock()
+ if err != nil {
+ panic(err)
+ }
+
pidch := make(chan int)
go func() {
@@ -56,7 +61,6 @@ func TestMain(m *testing.M) {
ctx := context.Background()
cliargs := testnode.Nodecliargs{Rextest: false}
var nodeInfos []*testnode.NodeInfo
- var err error
nodeInfos, tempdatadir, err = testnode.RunNodesWithBootstrap(ctx, cliargs, pidch, fullnodes, 2)
if err != nil {
panic(err)
@@ -86,6 +90,7 @@ func TestMain(m *testing.M) {
exitVal := m.Run()
logger.Debug("after tests clean:", tempdatadir)
testnode.Cleanup(tempdatadir, nodeInfos)
+ unlock()
os.Exit(exitVal)
}
diff --git a/pkg/chainapi/api/getbootstrapnodeinfo.go b/pkg/chainapi/api/getbootstrapnodeinfo.go
index 8a9effdd..da0696b3 100644
--- a/pkg/chainapi/api/getbootstrapnodeinfo.go
+++ b/pkg/chainapi/api/getbootstrapnodeinfo.go
@@ -17,6 +17,6 @@ func (h *Handler) GetBootstrapNodeInfo(c echo.Context) (err error) {
output := make(map[string]interface{})
output[NODE_STATUS] = "NODE_ONLINE"
output[NODETYPE] = "bootstrap"
- output[NODE_ID] = nodectx.GetNodeCtx().PeerId.Pretty()
+ output[NODE_ID] = nodectx.GetNodeCtx().PeerId.String()
return c.JSON(http.StatusOK, output)
}
diff --git a/pkg/chainapi/api/joingroup_v2.go b/pkg/chainapi/api/joingroup_v2.go
index 4d5fff3e..b1c5bc91 100644
--- a/pkg/chainapi/api/joingroup_v2.go
+++ b/pkg/chainapi/api/joingroup_v2.go
@@ -57,7 +57,7 @@ func (h *Handler) JoinGroupV2() echo.HandlerFunc {
}
genesisBlockBytes, err := json.Marshal(seed.GenesisBlock)
if err != nil {
- msg := fmt.Sprintf("unmarshal genesis block failed with msg: %s" + err.Error())
+ msg := fmt.Sprintf("unmarshal genesis block failed with msg: %s", err.Error())
return rumerrors.NewBadRequestError(msg)
}
diff --git a/pkg/chainapi/api/server.go b/pkg/chainapi/api/server.go
index 7cfb2929..e9abcb39 100644
--- a/pkg/chainapi/api/server.go
+++ b/pkg/chainapi/api/server.go
@@ -6,8 +6,8 @@ import (
"os"
"syscall"
+ echojwt "github.com/labstack/echo-jwt/v4"
"github.com/labstack/echo/v4"
- "github.com/labstack/echo/v4/middleware"
"github.com/rumsystem/ip-cert/pkg/zerossl"
"github.com/rumsystem/quorum/internal/pkg/conn/p2p"
rummiddleware "github.com/rumsystem/quorum/internal/pkg/middleware"
@@ -33,7 +33,7 @@ func StartBootstrapNodeServer(config StartServerParam, signalch chan os.Signal,
quitch = signalch
e := utils.NewEcho(config.IsDebug)
customJWTConfig := appapi.CustomJWTConfig(nodeopt.JWT.Key)
- e.Use(middleware.JWTWithConfig(customJWTConfig))
+ e.Use(echojwt.WithConfig(customJWTConfig))
e.Use(rummiddleware.OpaWithConfig(rummiddleware.OpaConfig{
Skipper: rummiddleware.LocalhostSkipper,
Policy: policyStr,
@@ -68,7 +68,7 @@ func StartProducerServer(config StartServerParam, signalch chan os.Signal, h *Ha
quitch = signalch
e := utils.NewEcho(config.IsDebug)
customJWTConfig := appapi.CustomJWTConfig(nodeopt.JWT.Key)
- e.Use(middleware.JWTWithConfig(customJWTConfig))
+ e.Use(echojwt.WithConfig(customJWTConfig))
e.Use(rummiddleware.OpaWithConfig(rummiddleware.OpaConfig{
Skipper: rummiddleware.LocalhostSkipper,
Policy: policyStr,
@@ -126,7 +126,7 @@ func StartFullNodeServer(config StartServerParam, signalch chan os.Signal, h *Ha
quitch = signalch
e := utils.NewEcho(config.IsDebug)
customJWTConfig := appapi.CustomJWTConfig(nodeopt.JWT.Key)
- e.Use(middleware.JWTWithConfig(customJWTConfig))
+ e.Use(echojwt.WithConfig(customJWTConfig))
e.Use(rummiddleware.OpaWithConfig(rummiddleware.OpaConfig{
Skipper: rummiddleware.JWTSkipper,
Policy: policyStr,
diff --git a/pkg/chainapi/appapi/jwt.go b/pkg/chainapi/appapi/jwt.go
index 08a6197f..1c675a04 100644
--- a/pkg/chainapi/appapi/jwt.go
+++ b/pkg/chainapi/appapi/jwt.go
@@ -8,8 +8,8 @@ import (
"time"
"github.com/golang-jwt/jwt/v4"
+ echojwt "github.com/labstack/echo-jwt/v4"
"github.com/labstack/echo/v4"
- "github.com/labstack/echo/v4/middleware"
rumerrors "github.com/rumsystem/quorum/internal/pkg/errors"
"github.com/rumsystem/quorum/internal/pkg/logging"
rummiddleware "github.com/rumsystem/quorum/internal/pkg/middleware"
@@ -57,14 +57,13 @@ func getJWTKey() (string, error) {
return nodeOpt.JWT.Key, nil
}
-func CustomJWTConfig(jwtKey string) middleware.JWTConfig {
- config := middleware.JWTConfig{
+func CustomJWTConfig(jwtKey string) echojwt.Config {
+ config := echojwt.Config{
SigningMethod: "HS256",
SigningKey: []byte(jwtKey),
- AuthScheme: "Bearer",
- TokenLookup: "header:" + echo.HeaderAuthorization,
+ TokenLookup: "header:" + echo.HeaderAuthorization + ":Bearer ",
ContextKey: jwtContextKey,
- ParseTokenFunc: func(auth string, c echo.Context) (interface{}, error) {
+ ParseTokenFunc: func(c echo.Context, auth string) (interface{}, error) {
return utils.ParseJWTToken(auth, jwtKey)
},
Skipper: rummiddleware.JWTSkipper,
@@ -283,14 +282,10 @@ func (h *Handler) ListToken(c echo.Context) error {
}
func jwtFromHeader(c echo.Context) (string, error) {
- config := CustomJWTConfig("")
- header := config.TokenLookup
- authScheme := config.AuthScheme
- parts := strings.Split(header, ":")
- auth := c.Request().Header.Get(parts[1])
- l := len(authScheme)
- if len(auth) > l+1 && auth[:l] == authScheme {
- return auth[l+1:], nil
+ auth := c.Request().Header.Get(echo.HeaderAuthorization)
+ const bearerPrefix = "Bearer "
+ if token, ok := strings.CutPrefix(auth, bearerPrefix); ok {
+ return token, nil
}
return "", errors.New("missing jwt token")
}
diff --git a/pkg/chainapi/handlers/getnetwork.go b/pkg/chainapi/handlers/getnetwork.go
index 0d1d0ee6..44a1bdd2 100644
--- a/pkg/chainapi/handlers/getnetwork.go
+++ b/pkg/chainapi/handlers/getnetwork.go
@@ -64,7 +64,7 @@ func GetNetwork(nodehost *host.Host, nodeinfo *p2p.NodeInfo, nodeopt *options.No
groupnetwork.Peers = nodectx.GetNodeCtx().ListGroupPeers(group.Item.GroupId)
groupnetworklist = append(groupnetworklist, groupnetwork)
}
- result.Peerid = (*nodehost).ID().Pretty()
+ result.Peerid = (*nodehost).ID().String()
result.Ethaddr = ethaddr
result.NatType = nodeinfo.NATType.String()
result.NatEnabled = nodeopt.EnableNat
diff --git a/pkg/chainapi/handlers/getnodeinfo.go b/pkg/chainapi/handlers/getnodeinfo.go
index 7d2268ee..92dc2bf7 100644
--- a/pkg/chainapi/handlers/getnodeinfo.go
+++ b/pkg/chainapi/handlers/getnodeinfo.go
@@ -90,7 +90,7 @@ func GetNodeInfo(networkName string) (*NodeInfo, error) {
}
info.NodePublickey = p2pcrypto.ConfigEncodeKey(pubkeybytes)
- info.NodeID = nodectx.GetNodeCtx().PeerId.Pretty()
+ info.NodeID = nodectx.GetNodeCtx().PeerId.String()
peers := nodectx.GetNodeCtx().PeersProtocol()
info.Peers = *peers
diff --git a/pkg/consensus/trxbft.go b/pkg/consensus/trxbft.go
index c791a5d4..0ec0de1d 100644
--- a/pkg/consensus/trxbft.go
+++ b/pkg/consensus/trxbft.go
@@ -5,13 +5,13 @@ import (
"sort"
"time"
- "github.com/golang/protobuf/proto"
"github.com/rumsystem/quorum/internal/pkg/conn"
"github.com/rumsystem/quorum/internal/pkg/logging"
"github.com/rumsystem/quorum/internal/pkg/nodectx"
localcrypto "github.com/rumsystem/quorum/pkg/crypto"
rumchaindata "github.com/rumsystem/quorum/pkg/data"
quorumpb "github.com/rumsystem/quorum/pkg/pb"
+ "google.golang.org/protobuf/proto"
)
var trx_bft_log = logging.Logger("tbft")
diff --git a/pkg/crypto/dirkeystore_test.go b/pkg/crypto/dirkeystore_test.go
index 4570fe83..88880e60 100644
--- a/pkg/crypto/dirkeystore_test.go
+++ b/pkg/crypto/dirkeystore_test.go
@@ -1,5 +1,5 @@
-//go:build !js
-// +build !js
+//go:build !js && legacy_tests
+// +build !js,legacy_tests
package crypto
diff --git a/pkg/crypto/keystore_test.go b/pkg/crypto/keystore_test.go
index e4b46b20..bed4330f 100644
--- a/pkg/crypto/keystore_test.go
+++ b/pkg/crypto/keystore_test.go
@@ -1,3 +1,6 @@
+//go:build legacy_tests
+// +build legacy_tests
+
package crypto
import (
diff --git a/pkg/data/trx_test.go b/pkg/data/trx_test.go
index 768a9f73..58e119b6 100644
--- a/pkg/data/trx_test.go
+++ b/pkg/data/trx_test.go
@@ -1,3 +1,6 @@
+//go:build legacy_tests
+// +build legacy_tests
+
package data
import (
diff --git a/testnode/integration_lock_unix.go b/testnode/integration_lock_unix.go
new file mode 100644
index 00000000..abb6eaaf
--- /dev/null
+++ b/testnode/integration_lock_unix.go
@@ -0,0 +1,27 @@
+//go:build !windows
+// +build !windows
+
+package testnode
+
+import (
+ "os"
+ "path/filepath"
+ "syscall"
+)
+
+func AcquireIntegrationTestLock() (func(), error) {
+ lockPath := filepath.Join(os.TempDir(), "quorum-integration-test.lock")
+ lockFile, err := os.OpenFile(lockPath, os.O_CREATE|os.O_RDWR, 0o600)
+ if err != nil {
+ return nil, err
+ }
+ if err := syscall.Flock(int(lockFile.Fd()), syscall.LOCK_EX); err != nil {
+ _ = lockFile.Close()
+ return nil, err
+ }
+
+ return func() {
+ _ = syscall.Flock(int(lockFile.Fd()), syscall.LOCK_UN)
+ _ = lockFile.Close()
+ }, nil
+}
diff --git a/testnode/integration_lock_windows.go b/testnode/integration_lock_windows.go
new file mode 100644
index 00000000..4694be6b
--- /dev/null
+++ b/testnode/integration_lock_windows.go
@@ -0,0 +1,8 @@
+//go:build windows
+// +build windows
+
+package testnode
+
+func AcquireIntegrationTestLock() (func(), error) {
+ return func() {}, nil
+}