repos / pico

pico services - prose.sh, pastes.sh, imgs.sh, feeds.sh, pgs.sh
git clone https://github.com/picosh/pico.git

commit
4cef657
parent
429d656
author
Antonio Mika
date
2023-11-09 02:07:02 +0000 UTC
Merge pull request #50 from picosh/am/update-sftp

Fixed issues with sftp file listing and downloading from minio
46 files changed,  +471, -385
M go.mod
M go.sum
M .github/actions/build/action.yml
+18, -2
 1@@ -8,14 +8,24 @@ inputs:
 2     required: true
 3   platforms:
 4     description: The docker platforms to build for
 5-    required: false
 6+    required: true
 7     default: |
 8       linux/amd64
 9       linux/arm64
10   registry:
11     description: The docker registry to use
12-    required: false
13+    required: true
14     default: ghcr.io
15+  web:
16+    description: Whether or not to build the web image
17+    required: true
18+    default: true
19+    type: boolean
20+  ssh:
21+    description: Whether or not to build the ssh image
22+    required: true
23+    default: true
24+    type: boolean
25 
26 runs:
27   using: composite
28@@ -31,6 +41,7 @@ runs:
29       with:
30         images: ${{ inputs.REGISTRY }}/${{ github.repository }}/${{ inputs.app }}-ssh
31     - name: Build and push web
32+      if: inputs.web == 'true'
33       uses: docker/build-push-action@v3
34       with:
35         context: .
36@@ -39,9 +50,12 @@ runs:
37         labels: ${{ steps.webmeta.outputs.labels }}
38         target: release-web
39         platforms: ${{ inputs.platforms }}
40+        cache-from: type=gha
41+        cache-to: type=gha,mode=max
42         build-args: |
43           APP=${{ inputs.app }}
44     - name: Build and push ssh
45+      if: inputs.ssh == 'true'
46       uses: docker/build-push-action@v3
47       with:
48         context: .
49@@ -50,5 +64,7 @@ runs:
50         labels: ${{ steps.sshmeta.outputs.labels }}
51         target: release-ssh
52         platforms: ${{ inputs.platforms }}
53+        cache-from: type=gha
54+        cache-to: type=gha,mode=max
55         build-args: |
56           APP=${{ inputs.app }}
A .github/actions/setup/action.yml
+34, -0
 1@@ -0,0 +1,34 @@
 2+name: Setup main action
 3+
 4+description: Runs the setup required for docker building
 5+
 6+inputs:
 7+  registry:
 8+    description: The docker registry to use
 9+    required: true
10+    default: ghcr.io
11+  username:
12+    description: The docker registry to use
13+    required: true
14+  password:
15+    description: The docker registry to use
16+    required: true
17+
18+runs:
19+  using: composite
20+  steps:
21+    - name: Set up QEMU
22+      uses: docker/setup-qemu-action@v2
23+      with:
24+        platforms: all
25+    - name: Set up Docker Buildx
26+      id: buildx
27+      uses: docker/setup-buildx-action@v2
28+      with:
29+        version: latest
30+    - name: Login to Docker Hub
31+      uses: docker/login-action@v2
32+      with:
33+        registry: ${{ inputs.registry }}
34+        username: ${{ inputs.username }}
35+        password: ${{ inputs.password }}
M .github/workflows/build.yml
+51, -48
  1@@ -39,86 +39,87 @@ jobs:
  2       run: |
  3         go test -v ./... -cover -race -coverprofile=coverage.out
  4         go tool cover -func=coverage.out -o=coverage.out
  5-  build:
  6+  build-main:
  7     runs-on: ubuntu-22.04
  8     needs: test
  9+    strategy:
 10+      matrix:
 11+        APP: [lists, prose, pastes, imgs, pgs, feeds]
 12     steps:
 13     - name: Checkout repo
 14       uses: actions/checkout@v3
 15-    - name: Set up QEMU
 16-      uses: docker/setup-qemu-action@v2
 17-      with:
 18-        platforms: all
 19-    - name: Set up Docker Buildx
 20-      id: buildx
 21-      uses: docker/setup-buildx-action@v2
 22-      with:
 23-        version: latest
 24-    - name: Login to Docker Hub
 25-      uses: docker/login-action@v2
 26+    - name: Setup docker
 27+      uses: ./.github/actions/setup
 28       with:
 29         registry: ${{ env.REGISTRY }}
 30         username: ${{ github.actor }}
 31         password: ${{ secrets.GITHUB_TOKEN }}
 32-    - name: Run docker build for lists
 33+    - name: Run docker build for ${{ matrix.APP }}
 34       uses: ./.github/actions/build
 35       with:
 36-        app: lists
 37+        app: ${{ matrix.APP }}
 38         platforms: ${{ env.PLATFORMS }}
 39         registry: ${{ env.REGISTRY }}
 40-    - name: Run docker build for prose
 41-      uses: ./.github/actions/build
 42+  build-auth:
 43+    runs-on: ubuntu-22.04
 44+    needs: test
 45+    steps:
 46+    - name: Checkout repo
 47+      uses: actions/checkout@v3
 48+    - name: Setup docker
 49+      uses: ./.github/actions/setup
 50       with:
 51-        app: prose
 52-        platforms: ${{ env.PLATFORMS }}
 53         registry: ${{ env.REGISTRY }}
 54-    - name: Run docker build for pastes
 55+        username: ${{ github.actor }}
 56+        password: ${{ secrets.GITHUB_TOKEN }}
 57+    - name: Run docker build for auth
 58       uses: ./.github/actions/build
 59       with:
 60-        app: pastes
 61+        app: auth
 62         platforms: ${{ env.PLATFORMS }}
 63         registry: ${{ env.REGISTRY }}
 64-    - name: Run docker build for imgs
 65-      uses: ./.github/actions/build
 66+        ssh: false
 67+  build-bouncer:
 68+    runs-on: ubuntu-22.04
 69+    needs: test
 70+    steps:
 71+    - name: Checkout repo
 72+      uses: actions/checkout@v3
 73+    - name: Setup docker
 74+      uses: ./.github/actions/setup
 75       with:
 76-        app: imgs
 77-        platforms: ${{ env.PLATFORMS }}
 78         registry: ${{ env.REGISTRY }}
 79-    - name: Run docker build for pgs
 80-      uses: ./.github/actions/build
 81+        username: ${{ github.actor }}
 82+        password: ${{ secrets.GITHUB_TOKEN }}
 83+    - name: Collect bouncer image metadata
 84+      id: bouncermeta
 85+      uses: docker/metadata-action@v4
 86       with:
 87-        app: pgs
 88-        platforms: ${{ env.PLATFORMS }}
 89-        registry: ${{ env.REGISTRY }}
 90-    - name: Run docker build for feeds
 91-      uses: ./.github/actions/build
 92+        images: ${{ env.REGISTRY }}/${{ github.repository }}/bouncer
 93+    - name: Build and push
 94+      uses: docker/build-push-action@v3
 95       with:
 96-        app: feeds
 97+        context: ./bouncer
 98+        push: true
 99+        tags: ${{ steps.bouncermeta.outputs.tags }}
100+        labels: ${{ steps.bouncermeta.outputs.labels }}
101         platforms: ${{ env.PLATFORMS }}
102-        registry: ${{ env.REGISTRY }}
103+        cache-from: type=gha
104+        cache-to: type=gha,mode=max
105   build-caddy:
106     runs-on: ubuntu-22.04
107     needs: test
108     steps:
109     - name: Checkout repo
110       uses: actions/checkout@v3
111-    - name: Set up QEMU
112-      uses: docker/setup-qemu-action@v2
113-      with:
114-        platforms: all
115-    - name: Set up Docker Buildx
116-      id: buildx
117-      uses: docker/setup-buildx-action@v2
118-      with:
119-        version: latest
120-    - name: Login to Docker Hub
121-      uses: docker/login-action@v2
122+    - name: Setup docker
123+      uses: ./.github/actions/setup
124       with:
125         registry: ${{ env.REGISTRY }}
126         username: ${{ github.actor }}
127         password: ${{ secrets.GITHUB_TOKEN }}
128-    - name: Collect image metadata
129-      id: meta
130+    - name: Collect caddy image metadata
131+      id: caddymeta
132       uses: docker/metadata-action@v4
133       with:
134         images: ${{ env.REGISTRY }}/${{ github.repository }}/caddy
135@@ -127,6 +128,8 @@ jobs:
136       with:
137         context: ./caddy
138         push: true
139-        tags: ${{ steps.meta.outputs.tags }}
140-        labels: ${{ steps.meta.outputs.labels }}
141+        tags: ${{ steps.caddymeta.outputs.tags }}
142+        labels: ${{ steps.caddymeta.outputs.labels }}
143         platforms: ${{ env.PLATFORMS }}
144+        cache-from: type=gha
145+        cache-to: type=gha,mode=max
M Makefile
+2, -2
 1@@ -30,7 +30,7 @@ bp-setup:
 2 .PHONY: bp-setup
 3 
 4 bp-caddy: bp-setup
 5-	$(DOCKER_BUILDX_BUILD) -t ghcr.io/picosh/pico/caddy:$(DOCKER_TAG) -f caddy/Dockerfile .
 6+	$(DOCKER_BUILDX_BUILD) -t ghcr.io/picosh/pico/caddy:$(DOCKER_TAG) ./caddy
 7 .PHONY: bp-caddy
 8 
 9 bp-auth: bp-setup
10@@ -38,7 +38,7 @@ bp-auth: bp-setup
11 .PHONY: bp-auth
12 
13 bp-bouncer: bp-setup
14-	$(DOCKER_BUILDX_BUILD) -t ghcr.io/picosh/pico/bouncer:$(DOCKER_TAG) -f bouncer/Dockerfile ./bouncer
15+	$(DOCKER_BUILDX_BUILD) -t ghcr.io/picosh/pico/bouncer:$(DOCKER_TAG) ./bouncer
16 .PHONY: bp-bouncer
17 
18 bp-%: bp-setup
M cmd/feeds/ssh/main.go
+1, -1
 1@@ -9,10 +9,10 @@ import (
 2 	"time"
 3 
 4 	"github.com/charmbracelet/promwish"
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7 	bm "github.com/charmbracelet/wish/bubbletea"
 8 	lm "github.com/charmbracelet/wish/logging"
 9-	"github.com/gliderlabs/ssh"
10 	"github.com/picosh/pico/db/postgres"
11 	"github.com/picosh/pico/feeds"
12 	"github.com/picosh/pico/filehandlers"
M cmd/imgs/ssh/main.go
+1, -1
 1@@ -9,10 +9,10 @@ import (
 2 	"time"
 3 
 4 	"github.com/charmbracelet/promwish"
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7 	bm "github.com/charmbracelet/wish/bubbletea"
 8 	lm "github.com/charmbracelet/wish/logging"
 9-	"github.com/gliderlabs/ssh"
10 	"github.com/picosh/pico/db/postgres"
11 	uploadimgs "github.com/picosh/pico/filehandlers/imgs"
12 	"github.com/picosh/pico/imgs"
M cmd/lists/ssh/main.go
+1, -1
 1@@ -9,10 +9,10 @@ import (
 2 	"time"
 3 
 4 	"github.com/charmbracelet/promwish"
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7 	bm "github.com/charmbracelet/wish/bubbletea"
 8 	lm "github.com/charmbracelet/wish/logging"
 9-	"github.com/gliderlabs/ssh"
10 	"github.com/picosh/pico/db/postgres"
11 	"github.com/picosh/pico/filehandlers"
12 	"github.com/picosh/pico/lists"
M cmd/prose/ssh/main.go
+1, -1
 1@@ -9,10 +9,10 @@ import (
 2 	"time"
 3 
 4 	"github.com/charmbracelet/promwish"
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7 	bm "github.com/charmbracelet/wish/bubbletea"
 8 	lm "github.com/charmbracelet/wish/logging"
 9-	"github.com/gliderlabs/ssh"
10 	"github.com/picosh/pico/db/postgres"
11 	"github.com/picosh/pico/filehandlers"
12 	"github.com/picosh/pico/prose"
M filehandlers/assets/handler.go
+5, -3
 1@@ -9,7 +9,7 @@ import (
 2 	"strings"
 3 	"time"
 4 
 5-	"github.com/gliderlabs/ssh"
 6+	"github.com/charmbracelet/ssh"
 7 	"github.com/picosh/pico/db"
 8 	"github.com/picosh/pico/shared"
 9 	"github.com/picosh/pico/shared/storage"
10@@ -82,7 +82,7 @@ func (h *UploadAssetHandler) Read(s ssh.Session, entry *utils.FileEntry) (os.Fil
11 	fileInfo := &utils.VirtualFile{
12 		FName:    filepath.Base(entry.Filepath),
13 		FIsDir:   false,
14-		FSize:    int64(entry.Size),
15+		FSize:    entry.Size,
16 		FModTime: time.Unix(entry.Mtime, 0),
17 	}
18 
19@@ -97,7 +97,9 @@ func (h *UploadAssetHandler) Read(s ssh.Session, entry *utils.FileEntry) (os.Fil
20 		return nil, nil, err
21 	}
22 
23-	return fileInfo, contents, nil
24+	reader := utils.NewAllReaderAt(contents)
25+
26+	return fileInfo, reader, nil
27 }
28 
29 func (h *UploadAssetHandler) List(s ssh.Session, fpath string) ([]os.FileInfo, error) {
M filehandlers/imgs/handler.go
+4, -2
 1@@ -9,7 +9,7 @@ import (
 2 	"path/filepath"
 3 	"time"
 4 
 5-	"github.com/gliderlabs/ssh"
 6+	"github.com/charmbracelet/ssh"
 7 	exifremove "github.com/neurosnap/go-exif-remove"
 8 	"github.com/picosh/pico/db"
 9 	"github.com/picosh/pico/shared"
10@@ -106,7 +106,9 @@ func (h *UploadImgHandler) Read(s ssh.Session, entry *utils.FileEntry) (os.FileI
11 		return nil, nil, err
12 	}
13 
14-	return fileInfo, contents, nil
15+	reader := utils.NewAllReaderAt(contents)
16+
17+	return fileInfo, reader, nil
18 }
19 
20 func (h *UploadImgHandler) List(s ssh.Session, fpath string) ([]os.FileInfo, error) {
M filehandlers/imgs/img.go
+1, -1
1@@ -6,7 +6,7 @@ import (
2 	"fmt"
3 	"strings"
4 
5-	"github.com/gliderlabs/ssh"
6+	"github.com/charmbracelet/ssh"
7 	"github.com/picosh/pico/db"
8 	"github.com/picosh/pico/shared"
9 	"github.com/picosh/pico/shared/storage"
M filehandlers/post_handler.go
+4, -2
 1@@ -10,7 +10,7 @@ import (
 2 	"strings"
 3 	"time"
 4 
 5-	"github.com/gliderlabs/ssh"
 6+	"github.com/charmbracelet/ssh"
 7 	"github.com/picosh/pico/db"
 8 	"github.com/picosh/pico/imgs"
 9 	"github.com/picosh/pico/shared"
10@@ -84,7 +84,9 @@ func (h *ScpUploadHandler) Read(s ssh.Session, entry *utils.FileEntry) (os.FileI
11 		FModTime: *post.UpdatedAt,
12 	}
13 
14-	return fileInfo, strings.NewReader(post.Text), nil
15+	reader := strings.NewReader(post.Text)
16+
17+	return fileInfo, reader, nil
18 }
19 
20 func (h *ScpUploadHandler) List(s ssh.Session, fpath string) ([]os.FileInfo, error) {
M go.mod
+71, -68
  1@@ -6,113 +6,116 @@ require (
  2 	github.com/alecthomas/chroma v0.10.0
  3 	github.com/antoniomika/go-rsync-receiver v0.0.0-20220901010427-e6494124f0c8
  4 	github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de
  5-	github.com/charmbracelet/bubbles v0.14.0
  6-	github.com/charmbracelet/bubbletea v0.23.1
  7-	github.com/charmbracelet/lipgloss v0.6.0
  8-	github.com/charmbracelet/promwish v0.3.0
  9-	github.com/charmbracelet/wish v0.7.0
 10+	github.com/charmbracelet/bubbles v0.16.1
 11+	github.com/charmbracelet/bubbletea v0.24.2
 12+	github.com/charmbracelet/lipgloss v0.9.1
 13+	github.com/charmbracelet/promwish v0.7.0
 14+	github.com/charmbracelet/ssh v0.0.0-20230822194956-1a051f898e09
 15+	github.com/charmbracelet/wish v1.2.0
 16 	github.com/disintegration/imaging v1.6.2
 17-	github.com/gliderlabs/ssh v0.3.5
 18-	github.com/google/go-cmp v0.5.9
 19-	github.com/gorilla/feeds v1.1.1
 20+	github.com/google/go-cmp v0.6.0
 21+	github.com/gorilla/feeds v1.1.2
 22 	github.com/kolesa-team/go-webp v1.0.4
 23-	github.com/lib/pq v1.10.7
 24-	github.com/matryer/is v1.4.0
 25-	github.com/microcosm-cc/bluemonday v1.0.21
 26-	github.com/minio/madmin-go/v3 v3.0.5
 27-	github.com/minio/minio-go/v7 v7.0.49
 28-	github.com/mmcdole/gofeed v1.1.3
 29+	github.com/lib/pq v1.10.9
 30+	github.com/matryer/is v1.4.1
 31+	github.com/microcosm-cc/bluemonday v1.0.26
 32+	github.com/minio/madmin-go/v3 v3.0.29
 33+	github.com/minio/minio-go/v7 v7.0.63
 34+	github.com/mmcdole/gofeed v1.2.1
 35 	github.com/muesli/reflow v0.3.0
 36 	github.com/neurosnap/go-exif-remove v0.0.0-20221010134343-50d1e3c35577
 37 	github.com/patrickmn/go-cache v2.1.0+incompatible
 38-	github.com/pkg/sftp v1.13.5
 39-	github.com/sendgrid/sendgrid-go v3.12.0+incompatible
 40-	github.com/yuin/goldmark v1.5.3
 41+	github.com/pkg/sftp v1.13.6
 42+	github.com/sendgrid/sendgrid-go v3.13.0+incompatible
 43+	github.com/yuin/goldmark v1.6.0
 44 	github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594
 45 	github.com/yuin/goldmark-meta v1.1.0
 46 	go.abhg.dev/goldmark/anchor v0.1.1
 47-	go.uber.org/zap v1.24.0
 48-	golang.org/x/crypto v0.6.0
 49-	golang.org/x/exp v0.0.0-20221211140036-ad323defaf05
 50+	go.uber.org/zap v1.26.0
 51+	golang.org/x/crypto v0.15.0
 52+	golang.org/x/exp v0.0.0-20231006140011-7918f672742d
 53 	gopkg.in/yaml.v2 v2.4.0
 54 )
 55 
 56 require (
 57-	github.com/DavidGamba/go-getoptions v0.26.0 // indirect
 58-	github.com/PuerkitoBio/goquery v1.5.1 // indirect
 59-	github.com/andybalholm/cascadia v1.1.0 // indirect
 60+	github.com/DavidGamba/go-getoptions v0.29.0 // indirect
 61+	github.com/PuerkitoBio/goquery v1.8.1 // indirect
 62+	github.com/andybalholm/cascadia v1.3.2 // indirect
 63 	github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
 64 	github.com/atotto/clipboard v0.1.4 // indirect
 65-	github.com/aymanbagabas/go-osc52 v1.2.1 // indirect
 66+	github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
 67 	github.com/aymerick/douceur v0.2.0 // indirect
 68 	github.com/beorn7/perks v1.0.1 // indirect
 69-	github.com/caarlos0/sshmarshal v0.1.0 // indirect
 70 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 71-	github.com/charmbracelet/keygen v0.3.0 // indirect
 72-	github.com/containerd/console v1.0.3 // indirect
 73-	github.com/dlclark/regexp2 v1.7.0 // indirect
 74-	github.com/dsoprea/go-exif v0.0.0-20221012082141-d21ac8e2de85 // indirect
 75-	github.com/dsoprea/go-exif/v2 v2.0.0-20221012082141-d21ac8e2de85 // indirect
 76+	github.com/charmbracelet/keygen v0.5.0 // indirect
 77+	github.com/charmbracelet/log v0.3.0 // indirect
 78+	github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect
 79+	github.com/dlclark/regexp2 v1.10.0 // indirect
 80+	github.com/dsoprea/go-exif v0.0.0-20230826092837-6579e82b732d // indirect
 81+	github.com/dsoprea/go-exif/v2 v2.0.0-20230826092837-6579e82b732d // indirect
 82 	github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413 // indirect
 83 	github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect
 84 	github.com/dsoprea/go-photoshop-info-format v0.0.0-20200610045659-121dd752914d // indirect
 85 	github.com/dsoprea/go-png-image-structure v0.0.0-20210512210324-29b889a6093d // indirect
 86 	github.com/dsoprea/go-utility v0.0.0-20221003172846-a3e1774ef349 // indirect
 87 	github.com/dustin/go-humanize v1.0.1 // indirect
 88-	github.com/go-errors/errors v1.4.2 // indirect
 89-	github.com/go-ole/go-ole v1.2.6 // indirect
 90+	github.com/go-errors/errors v1.5.1 // indirect
 91+	github.com/go-logfmt/logfmt v0.6.0 // indirect
 92+	github.com/go-ole/go-ole v1.3.0 // indirect
 93 	github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect
 94-	github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 // indirect
 95-	github.com/golang/protobuf v1.5.2 // indirect
 96+	github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
 97+	github.com/golang/geo v0.0.0-20230421003525-6adc56603217 // indirect
 98+	github.com/golang/protobuf v1.5.3 // indirect
 99 	github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
100-	github.com/google/uuid v1.3.0 // indirect
101-	github.com/gorilla/css v1.0.0 // indirect
102+	github.com/google/uuid v1.4.0 // indirect
103+	github.com/gorilla/css v1.0.1 // indirect
104 	github.com/json-iterator/go v1.1.12 // indirect
105-	github.com/klauspost/compress v1.15.15 // indirect
106-	github.com/klauspost/cpuid/v2 v2.2.4 // indirect
107+	github.com/klauspost/compress v1.17.2 // indirect
108+	github.com/klauspost/cpuid/v2 v2.2.6 // indirect
109 	github.com/kr/fs v0.1.0 // indirect
110-	github.com/kr/pretty v0.3.0 // indirect
111 	github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
112-	github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de // indirect
113-	github.com/mattn/go-isatty v0.0.16 // indirect
114+	github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed // indirect
115+	github.com/mattn/go-isatty v0.0.20 // indirect
116 	github.com/mattn/go-localereader v0.0.1 // indirect
117-	github.com/mattn/go-runewidth v0.0.14 // indirect
118+	github.com/mattn/go-runewidth v0.0.15 // indirect
119 	github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
120+	github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
121 	github.com/minio/md5-simd v1.1.2 // indirect
122-	github.com/minio/sha256-simd v1.0.0 // indirect
123-	github.com/mitchellh/go-homedir v1.1.0 // indirect
124-	github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf // indirect
125+	github.com/minio/sha256-simd v1.0.1 // indirect
126+	github.com/mmcdole/goxpp v1.1.0 // indirect
127 	github.com/mmcloughlin/md4 v0.1.2 // indirect
128 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
129 	github.com/modern-go/reflect2 v1.0.2 // indirect
130-	github.com/muesli/ansi v0.0.0-20221106050444-61f0cd9a192a // indirect
131+	github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
132 	github.com/muesli/cancelreader v0.2.2 // indirect
133-	github.com/muesli/termenv v0.13.0 // indirect
134+	github.com/muesli/termenv v0.15.2 // indirect
135 	github.com/neurosnap/go-jpeg-image-structure v0.0.0-20221010133817-70b1c1ff679e // indirect
136 	github.com/philhofer/fwd v1.1.2 // indirect
137 	github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect
138-	github.com/prometheus/client_golang v1.14.0 // indirect
139-	github.com/prometheus/client_model v0.3.0 // indirect
140-	github.com/prometheus/common v0.38.0 // indirect
141-	github.com/prometheus/procfs v0.9.0 // indirect
142-	github.com/rivo/uniseg v0.4.3 // indirect
143-	github.com/rs/xid v1.4.0 // indirect
144+	github.com/prometheus/client_golang v1.17.0 // indirect
145+	github.com/prometheus/client_model v0.5.0 // indirect
146+	github.com/prometheus/common v0.45.0 // indirect
147+	github.com/prometheus/procfs v0.12.0 // indirect
148+	github.com/prometheus/prom2json v1.3.3 // indirect
149+	github.com/rivo/uniseg v0.4.4 // indirect
150+	github.com/rs/xid v1.5.0 // indirect
151+	github.com/safchain/ethtool v0.3.0 // indirect
152 	github.com/secure-io/sio-go v0.3.1 // indirect
153 	github.com/sendgrid/rest v2.6.9+incompatible // indirect
154-	github.com/shirou/gopsutil/v3 v3.23.1 // indirect
155-	github.com/sirupsen/logrus v1.9.0 // indirect
156-	github.com/tinylib/msgp v1.1.8 // indirect
157-	github.com/tklauser/go-sysconf v0.3.11 // indirect
158-	github.com/tklauser/numcpus v0.6.0 // indirect
159-	github.com/yusufpapurcu/wmi v1.2.2 // indirect
160-	go.uber.org/atomic v1.10.0 // indirect
161-	go.uber.org/multierr v1.8.0 // indirect
162-	golang.org/x/image v0.2.0 // indirect
163-	golang.org/x/net v0.7.0 // indirect
164-	golang.org/x/sync v0.1.0 // indirect
165-	golang.org/x/sys v0.5.0 // indirect
166-	golang.org/x/term v0.5.0 // indirect
167-	golang.org/x/text v0.7.0 // indirect
168-	google.golang.org/protobuf v1.28.1 // indirect
169+	github.com/shirou/gopsutil/v3 v3.23.10 // indirect
170+	github.com/shoenig/go-m1cpu v0.1.6 // indirect
171+	github.com/sirupsen/logrus v1.9.3 // indirect
172+	github.com/tinylib/msgp v1.1.9 // indirect
173+	github.com/tklauser/go-sysconf v0.3.12 // indirect
174+	github.com/tklauser/numcpus v0.6.1 // indirect
175+	github.com/yusufpapurcu/wmi v1.2.3 // indirect
176+	go.uber.org/multierr v1.11.0 // indirect
177+	golang.org/x/image v0.14.0 // indirect
178+	golang.org/x/net v0.18.0 // indirect
179+	golang.org/x/sync v0.5.0 // indirect
180+	golang.org/x/sys v0.14.0 // indirect
181+	golang.org/x/term v0.14.0 // indirect
182+	golang.org/x/text v0.14.0 // indirect
183+	google.golang.org/protobuf v1.31.0 // indirect
184 	gopkg.in/ini.v1 v1.67.0 // indirect
185 )
M go.sum
+170, -194
  1@@ -1,12 +1,12 @@
  2-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
  3-github.com/DavidGamba/go-getoptions v0.26.0 h1:3Hy0o6xTYs9icM5uPNqqck5PyZm5lZWRIDH/n5SV2uw=
  4-github.com/DavidGamba/go-getoptions v0.26.0/go.mod h1:qLaLSYeQ8sUVOfKuu5JT5qKKS3OCwyhkYSJnoG+ggmo=
  5-github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE=
  6-github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
  7+github.com/DavidGamba/go-getoptions v0.29.0 h1:cU8MjOyfAyPZke4hrgEuiGBJHS9PFYPAHve2fhDhdDk=
  8+github.com/DavidGamba/go-getoptions v0.29.0/go.mod h1:zE97E3PR9P3BI/HKyNYgdMlYxodcuiC6W68KIgeYT84=
  9+github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM=
 10+github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ=
 11 github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek=
 12 github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s=
 13-github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo=
 14-github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
 15+github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
 16+github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
 17+github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
 18 github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
 19 github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
 20 github.com/antoniomika/go-rsync-receiver v0.0.0-20220901010427-e6494124f0c8 h1:gR27C6N8s5b+ciBRymi0zhUx8TylKFO755z6yrBuMiI=
 21@@ -15,52 +15,46 @@ github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhP
 22 github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw=
 23 github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
 24 github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
 25-github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4=
 26-github.com/aymanbagabas/go-osc52 v1.2.1 h1:q2sWUyDcozPLcLabEMd+a+7Ea2DitxZVN9hTxab9L4E=
 27-github.com/aymanbagabas/go-osc52 v1.2.1/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4=
 28+github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
 29+github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
 30 github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
 31 github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
 32-github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 33-github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 34 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 35 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 36-github.com/caarlos0/sshmarshal v0.1.0 h1:zTCZrDORFfWh526Tsb7vCm3+Yg/SfW/Ub8aQDeosk0I=
 37-github.com/caarlos0/sshmarshal v0.1.0/go.mod h1:7Pd/0mmq9x/JCzKauogNjSQEhivBclCQHfr9dlpDIyA=
 38 github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
 39 github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 40-github.com/charmbracelet/bubbles v0.14.0 h1:DJfCwnARfWjZLvMglhSQzo76UZ2gucuHPy9jLWX45Og=
 41-github.com/charmbracelet/bubbles v0.14.0/go.mod h1:bbeTiXwPww4M031aGi8UK2HT9RDWoiNibae+1yCMtcc=
 42-github.com/charmbracelet/bubbletea v0.21.0/go.mod h1:GgmJMec61d08zXsOhqRC/AiOx4K4pmz+VIcRIm1FKr4=
 43-github.com/charmbracelet/bubbletea v0.23.1 h1:CYdteX1wCiCzKNUlwm25ZHBIc1GXlYFyUIte8WPvhck=
 44-github.com/charmbracelet/bubbletea v0.23.1/go.mod h1:JAfGK/3/pPKHTnAS8JIE2u9f61BjWTQY57RbT25aMXU=
 45-github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao=
 46-github.com/charmbracelet/keygen v0.3.0 h1:mXpsQcH7DDlST5TddmXNXjS0L7ECk4/kLQYyBcsan2Y=
 47-github.com/charmbracelet/keygen v0.3.0/go.mod h1:1ukgO8806O25lUZ5s0IrNur+RlwTBERlezdgW71F5rM=
 48-github.com/charmbracelet/lipgloss v0.5.0/go.mod h1:EZLha/HbzEt7cYqdFPovlqy5FZPj0xFhg5SaqxScmgs=
 49-github.com/charmbracelet/lipgloss v0.6.0 h1:1StyZB9vBSOyuZxQUcUwGr17JmojPNm87inij9N3wJY=
 50-github.com/charmbracelet/lipgloss v0.6.0/go.mod h1:tHh2wr34xcHjC2HCXIlGSG1jaDF0S0atAUvBMP6Ppuk=
 51-github.com/charmbracelet/promwish v0.3.0 h1:qRIwx1GgPwIXanf868lEPZ4pQ6NT0ltaZJw+lkiok20=
 52-github.com/charmbracelet/promwish v0.3.0/go.mod h1:Qxm2h8DDuCR4SLoOM4+O1O67gKCsM5GovAHT7makJvU=
 53-github.com/charmbracelet/wish v0.7.0 h1:rdfacCWaKCQpCMPbOKfi68GYqsb+9CnUzN1Ov/INZJ0=
 54-github.com/charmbracelet/wish v0.7.0/go.mod h1:16EQz7k3hEgPkPENghcpEddvlrmucIudE0jnczKr+k4=
 55-github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw=
 56-github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
 57-github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 58-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 59+github.com/charmbracelet/bubbles v0.16.1 h1:6uzpAAaT9ZqKssntbvZMlksWHruQLNxg49H5WdeuYSY=
 60+github.com/charmbracelet/bubbles v0.16.1/go.mod h1:2QCp9LFlEsBQMvIYERr7Ww2H2bA7xen1idUDIzm/+Xc=
 61+github.com/charmbracelet/bubbletea v0.24.2 h1:uaQIKx9Ai6Gdh5zpTbGiWpytMU+CfsPp06RaW2cx/SY=
 62+github.com/charmbracelet/bubbletea v0.24.2/go.mod h1:XdrNrV4J8GiyshTtx3DNuYkR1FDaJmO3l2nejekbsgg=
 63+github.com/charmbracelet/keygen v0.5.0 h1:XY0fsoYiCSM9axkrU+2ziE6u6YjJulo/b9Dghnw6MZc=
 64+github.com/charmbracelet/keygen v0.5.0/go.mod h1:DfvCgLHxZ9rJxdK0DGw3C/LkV4SgdGbnliHcObV3L+8=
 65+github.com/charmbracelet/lipgloss v0.9.1 h1:PNyd3jvaJbg4jRHKWXnCj1akQm4rh8dbEzN1p/u1KWg=
 66+github.com/charmbracelet/lipgloss v0.9.1/go.mod h1:1mPmG4cxScwUQALAAnacHaigiiHB9Pmr+v1VEawJl6I=
 67+github.com/charmbracelet/log v0.3.0 h1:u5aB2KJDgNZo4WOfOC8C+KvGIkJ2rCFNlPWDu6xhnqI=
 68+github.com/charmbracelet/log v0.3.0/go.mod h1:OR4E1hutLsax3ZKpXbgUqPtTjQfrh1pG3zwHGWuuq8g=
 69+github.com/charmbracelet/promwish v0.7.0 h1:oaMH+ey6W4DDIv1xucS8jL1ik/Q46qxjNXlh6XxEm+s=
 70+github.com/charmbracelet/promwish v0.7.0/go.mod h1:WbRJN9irg8LmsBU8G2rFF8md9O3rSg63qrnqquP/+cs=
 71+github.com/charmbracelet/ssh v0.0.0-20230822194956-1a051f898e09 h1:ZDIQmTtohv0S/AAYE//w8mYTxCzqphhF1+4ACPDMiLU=
 72+github.com/charmbracelet/ssh v0.0.0-20230822194956-1a051f898e09/go.mod h1:F1vgddWsb/Yr/OZilFeRZEh5sE/qU0Dt1mKkmke6Zvg=
 73+github.com/charmbracelet/wish v1.2.0 h1:h5Wj9pr97IQz/l4gM5Xep2lXcY/YM+6O2RC2o3x0JIQ=
 74+github.com/charmbracelet/wish v1.2.0/go.mod h1:JX3fC+178xadJYAhPu6qWtVDpJTwpnFvpdjz9RKJlUE=
 75+github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY=
 76+github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk=
 77 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 78 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 79 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 80 github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
 81 github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
 82 github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
 83-github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo=
 84-github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
 85-github.com/dsoprea/go-exif v0.0.0-20221012082141-d21ac8e2de85 h1:+wKSjK8wh5Ybb63Fx1QvTSIfWU/n1nmqEzZy+82pqbQ=
 86-github.com/dsoprea/go-exif v0.0.0-20221012082141-d21ac8e2de85/go.mod h1:lOaOt7+UEppOgyvRy749v3do836U/hw0YVJNjoyPaEs=
 87+github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0=
 88+github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
 89+github.com/dsoprea/go-exif v0.0.0-20230826092837-6579e82b732d h1:ygcRCGNKuEiA98k7X35hknEN8RIRUF1jrz7k1rZCvsk=
 90+github.com/dsoprea/go-exif v0.0.0-20230826092837-6579e82b732d/go.mod h1:lOaOt7+UEppOgyvRy749v3do836U/hw0YVJNjoyPaEs=
 91 github.com/dsoprea/go-exif/v2 v2.0.0-20200321225314-640175a69fe4/go.mod h1:Lm2lMM2zx8p4a34ZemkaUV95AnMl4ZvLbCUbwOvLC2E=
 92 github.com/dsoprea/go-exif/v2 v2.0.0-20200604193436-ca8584a0e1c4/go.mod h1:9EXlPeHfblFFnwu5UOqmP2eoZfJyAZ2Ri/Vki33ajO0=
 93-github.com/dsoprea/go-exif/v2 v2.0.0-20221012082141-d21ac8e2de85 h1:sgMOHQHMiddteUitH9QYgaRTwAcqqr5X9z5j4yNXDuY=
 94-github.com/dsoprea/go-exif/v2 v2.0.0-20221012082141-d21ac8e2de85/go.mod h1:oKrjk2kb3rAR5NbtSTLUMvMSbc+k8ZosI3MaVH47noc=
 95+github.com/dsoprea/go-exif/v2 v2.0.0-20230826092837-6579e82b732d h1:yeH8wrJa3+8uKKDAdURHUK1ds2UvKhMqX2MiOdVeKPs=
 96+github.com/dsoprea/go-exif/v2 v2.0.0-20230826092837-6579e82b732d/go.mod h1:oKrjk2kb3rAR5NbtSTLUMvMSbc+k8ZosI3MaVH47noc=
 97 github.com/dsoprea/go-exif/v3 v3.0.0-20200717053412-08f1b6708903/go.mod h1:0nsO1ce0mh5czxGeLo4+OCZ/C6Eo6ZlMWsz7rH/Gxv8=
 98 github.com/dsoprea/go-exif/v3 v3.0.0-20210512043655-120bcdb2a55e/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk=
 99 github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb/go.mod h1:kYIdx9N9NaOyD7U6D+YtExN7QhRm+5kq7//yOsRXQtM=
100@@ -81,120 +75,109 @@ github.com/dsoprea/go-utility v0.0.0-20221003172846-a3e1774ef349/go.mod h1:KVK+/
101 github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e/go.mod h1:uAzdkPTub5Y9yQwXe8W4m2XuP0tK4a9Q/dantD0+uaU=
102 github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
103 github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
104-github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY=
105-github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4=
106 github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
107 github.com/go-errors/errors v1.0.2/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs=
108 github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs=
109-github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
110-github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
111-github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
112+github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk=
113+github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
114+github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
115+github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
116 github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
117+github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
118+github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
119 github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
120 github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U=
121 github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
122+github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
123+github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
124 github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
125 github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
126-github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 h1:gtexQ/VGyN+VVFRXSFiguSNcXmS6rkKT+X7FdIrTtfo=
127-github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
128+github.com/golang/geo v0.0.0-20230421003525-6adc56603217 h1:HKlyj6in2JV6wVkmQ4XmG/EIm+SCYlPZ+V4GWit7Z+I=
129+github.com/golang/geo v0.0.0-20230421003525-6adc56603217/go.mod h1:8wI0hitZ3a1IxZfeH3/5I97CI8i5cLGsYe7xNhQGs9U=
130 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
131-github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
132 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
133-github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
134-github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
135+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
136+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
137 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
138 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
139-github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
140 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
141+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
142+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
143 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
144 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
145 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
146-github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
147-github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
148-github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
149-github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
150-github.com/gorilla/feeds v1.1.1 h1:HwKXxqzcRNg9to+BbvJog4+f3s/xzvtZXICcQGutYfY=
151-github.com/gorilla/feeds v1.1.1/go.mod h1:Nk0jZrvPFZX1OBe5NPiddPw7CfwF6Q9eqzaBbaightA=
152+github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
153+github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
154+github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8=
155+github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0=
156+github.com/gorilla/feeds v1.1.2 h1:pxzZ5PD3RJdhFH2FsJJ4x6PqMqbgFk1+Vez4XWBW8Iw=
157+github.com/gorilla/feeds v1.1.2/go.mod h1:WMib8uJP3BbY+X8Szd1rA5Pzhdfh+HCCAYT2z7Fza6Y=
158 github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
159-github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
160 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
161 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
162-github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
163-github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4=
164+github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
165+github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
166 github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
167-github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
168-github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
169-github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
170+github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
171+github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
172 github.com/kolesa-team/go-webp v1.0.4 h1:wQvU4PLG/X7RS0vAeyhiivhLRoxfLVRlDq4I3frdxIQ=
173 github.com/kolesa-team/go-webp v1.0.4/go.mod h1:oMvdivD6K+Q5qIIkVC2w4k2ZUnI1H+MyP7inwgWq9aA=
174 github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
175 github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
176-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
177-github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
178-github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
179-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
180-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
181+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
182+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
183 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
184 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
185-github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
186-github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
187-github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
188+github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
189+github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
190 github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
191 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
192 github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
193-github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de h1:V53FWzU6KAZVi1tPp5UIsMoUWJ2/PNwYIDXnu7QuBCE=
194-github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE=
195-github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
196-github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
197-github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
198-github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
199-github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
200+github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed h1:036IscGBfJsFIgJQzlui7nK1Ncm0tp2ktmPj8xO4N/0=
201+github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
202+github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ=
203+github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
204+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
205+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
206 github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4=
207 github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
208 github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
209 github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
210-github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
211-github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=
212-github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
213+github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
214+github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
215 github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
216 github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
217-github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg=
218-github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM=
219-github.com/minio/madmin-go/v3 v3.0.5 h1:ynWTsnszHnQVJWRL2OE4ysCvCNG0uHgdTvJpdLazf9c=
220-github.com/minio/madmin-go/v3 v3.0.5/go.mod h1:lPrMoc1aeiIWmmrxBthkDqzMPQwC/Lu9ByuyM2wenJk=
221+github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
222+github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
223+github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58=
224+github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs=
225+github.com/minio/madmin-go/v3 v3.0.29 h1:3bNLArtxIFud5wyb5/DnF5DGLBvcSJyzCA44EclX1Ow=
226+github.com/minio/madmin-go/v3 v3.0.29/go.mod h1:4QN2NftLSV7MdlT50dkrenOMmNVHluxTvlqJou3hte8=
227 github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
228 github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
229-github.com/minio/minio-go/v7 v7.0.49 h1:dE5DfOtnXMXCjr/HWI6zN9vCrY6Sv666qhhiwUMvGV4=
230-github.com/minio/minio-go/v7 v7.0.49/go.mod h1:UI34MvQEiob3Cf/gGExGMmzugkM/tNgbFypNDy5LMVc=
231-github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
232-github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
233-github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
234-github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
235-github.com/mmcdole/gofeed v1.1.3 h1:pdrvMb18jMSLidGp8j0pLvc9IGziX4vbmvVqmLH6z8o=
236-github.com/mmcdole/gofeed v1.1.3/go.mod h1:QQO3maftbOu+hiVOGOZDRLymqGQCos4zxbA4j89gMrE=
237-github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf h1:sWGE2v+hO0Nd4yFU/S/mDBM5plIU8v/Qhfz41hkDIAI=
238-github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf/go.mod h1:pasqhqstspkosTneA62Nc+2p9SOBBYAPbnmRRWPQ0V8=
239+github.com/minio/minio-go/v7 v7.0.63 h1:GbZ2oCvaUdgT5640WJOpyDhhDxvknAJU2/T3yurwcbQ=
240+github.com/minio/minio-go/v7 v7.0.63/go.mod h1:Q6X7Qjb7WMhvG65qKf4gUgA5XaiSox74kR1uAEjxRS4=
241+github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
242+github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
243+github.com/mmcdole/gofeed v1.2.1 h1:tPbFN+mfOLcM1kDF1x2c/N68ChbdBatkppdzf/vDe1s=
244+github.com/mmcdole/gofeed v1.2.1/go.mod h1:2wVInNpgmC85q16QTTuwbuKxtKkHLCDDtf0dCmnrNr4=
245+github.com/mmcdole/goxpp v1.1.0 h1:WwslZNF7KNAXTFuzRtn/OKZxFLJAAyOA9w82mDz2ZGI=
246+github.com/mmcdole/goxpp v1.1.0/go.mod h1:v+25+lT2ViuQ7mVxcncQ8ch1URund48oH+jhjiwEgS8=
247 github.com/mmcloughlin/md4 v0.1.2 h1:kGYl+iNbxhyz4u76ka9a+0TXP9KWt/LmnM0QhZwhcBo=
248 github.com/mmcloughlin/md4 v0.1.2/go.mod h1:AAxFX59fddW0IguqNzWlf1lazh1+rXeIt/Bj49cqDTQ=
249 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
250 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
251 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
252-github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
253 github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
254 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
255-github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho=
256-github.com/muesli/ansi v0.0.0-20221106050444-61f0cd9a192a h1:jlDOeO5TU0pYlbc/y6PFguab5IjANI0Knrpg3u/ton4=
257-github.com/muesli/ansi v0.0.0-20221106050444-61f0cd9a192a/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
258-github.com/muesli/cancelreader v0.2.0/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
259+github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
260+github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
261 github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
262 github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
263-github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ=
264 github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
265 github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
266-github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs=
267-github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs=
268-github.com/muesli/termenv v0.13.0 h1:wK20DRpJdDX8b7Ek2QfhvqhRQFZ237RGRO0RQ/Iqdy0=
269-github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc=
270+github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
271+github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
272 github.com/neurosnap/go-exif-remove v0.0.0-20221010134343-50d1e3c35577 h1:hVmVNttSLNloGsbFKVXAUHonXTd8KKrv30U/8UkloKI=
273 github.com/neurosnap/go-exif-remove v0.0.0-20221010134343-50d1e3c35577/go.mod h1:G3Cu1AW+dmRLDFpOi8eUAfc3cGoRHUjTkGjeRcndgl4=
274 github.com/neurosnap/go-jpeg-image-structure v0.0.0-20221010133817-70b1c1ff679e h1:76Dng5ms0fR+26doKZAvNqhi2UPfnLxGfPIDEr+BBlM=
275@@ -203,46 +186,49 @@ github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaR
276 github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
277 github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw=
278 github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0=
279-github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
280-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
281-github.com/pkg/sftp v1.13.5 h1:a3RLUqkyjYRtBTZJZ1VRrKbN3zhuPLlUc3sphVz81go=
282-github.com/pkg/sftp v1.13.5/go.mod h1:wHDZ0IZX6JcBYRK1TH9bcVq8G7TLpVHYIGJRFnmPfxg=
283+github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo=
284+github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk=
285 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
286 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
287 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
288 github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
289 github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig=
290 github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
291-github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=
292-github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=
293-github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
294-github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
295-github.com/prometheus/common v0.38.0 h1:VTQitp6mXTdUoCmDMugDVOJ1opi6ADftKfp/yeqTR/E=
296-github.com/prometheus/common v0.38.0/go.mod h1:MBXfmBQZrK5XpbCkjofnXs96LD2QQ7fEq4C0xjC/yec=
297-github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
298-github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
299+github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=
300+github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=
301+github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
302+github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
303+github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=
304+github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=
305+github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
306+github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
307+github.com/prometheus/prom2json v1.3.3 h1:IYfSMiZ7sSOfliBoo89PcufjWO4eAR0gznGcETyaUgo=
308+github.com/prometheus/prom2json v1.3.3/go.mod h1:Pv4yIPktEkK7btWsrUTWDDDrnpUrAELaOCj+oFwlgmc=
309 github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
310 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
311-github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw=
312-github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
313-github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
314-github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
315-github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY=
316-github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
317-github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
318-github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y=
319+github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
320+github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
321+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
322+github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
323+github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
324+github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
325+github.com/safchain/ethtool v0.3.0 h1:gimQJpsI6sc1yIqP/y8GYgiXn/NjgvpM0RNoWLVVmP0=
326+github.com/safchain/ethtool v0.3.0/go.mod h1:SA9BwrgyAqNo7M+uaL6IYbxpm5wk3L7Mm6ocLW+CJUs=
327 github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg=
328 github.com/secure-io/sio-go v0.3.1 h1:dNvY9awjabXTYGsTF1PiCySl9Ltofk9GA3VdWlo7rRc=
329 github.com/secure-io/sio-go v0.3.1/go.mod h1:+xbkjDzPjwh4Axd07pRKSNriS9SCiYksWnZqdnfpQxs=
330 github.com/sendgrid/rest v2.6.9+incompatible h1:1EyIcsNdn9KIisLW50MKwmSRSK+ekueiEMJ7NEoxJo0=
331 github.com/sendgrid/rest v2.6.9+incompatible/go.mod h1:kXX7q3jZtJXK5c5qK83bSGMdV6tsOE70KbHoqJls4lE=
332-github.com/sendgrid/sendgrid-go v3.12.0+incompatible h1:/N2vx18Fg1KmQOh6zESc5FJB8pYwt5QFBDflYPh1KVg=
333-github.com/sendgrid/sendgrid-go v3.12.0+incompatible/go.mod h1:QRQt+LX/NmgVEvmdRw0VT/QgUn499+iza2FnDca9fg8=
334-github.com/shirou/gopsutil/v3 v3.23.1 h1:a9KKO+kGLKEvcPIs4W62v0nu3sciVDOOOPUD0Hz7z/4=
335-github.com/shirou/gopsutil/v3 v3.23.1/go.mod h1:NN6mnm5/0k8jw4cBfCnJtr5L7ErOTg18tMNpgFkn0hA=
336-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
337-github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
338-github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
339+github.com/sendgrid/sendgrid-go v3.13.0+incompatible h1:HZrzc06/QfBGesY9o3n1lvBrRONA+57rbDRKet7plos=
340+github.com/sendgrid/sendgrid-go v3.13.0+incompatible/go.mod h1:QRQt+LX/NmgVEvmdRw0VT/QgUn499+iza2FnDca9fg8=
341+github.com/shirou/gopsutil/v3 v3.23.10 h1:/N42opWlYzegYaVkWejXWJpbzKv2JDy3mrgGzKsh9hM=
342+github.com/shirou/gopsutil/v3 v3.23.10/go.mod h1:JIE26kpucQi+innVlAUnIEOSBhBUkirr5b44yr55+WE=
343+github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
344+github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
345+github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
346+github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
347+github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
348+github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
349 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
350 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
351 github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
352@@ -250,73 +236,70 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
353 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
354 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
355 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
356-github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
357-github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
358-github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0=
359-github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw=
360-github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
361-github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
362-github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms=
363-github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
364-github.com/urfave/cli v1.22.3/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
365+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
366+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
367+github.com/tinylib/msgp v1.1.9 h1:SHf3yoO2sGA0veCJeCBYLHuttAVFHGm2RHgNodW7wQU=
368+github.com/tinylib/msgp v1.1.9/go.mod h1:BCXGB54lDD8qUEPmiG0cQQUANC4IUQyB2ItS2UDlO/k=
369+github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
370+github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
371+github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
372+github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
373 github.com/yuin/goldmark v1.4.5/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg=
374 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
375-github.com/yuin/goldmark v1.5.3 h1:3HUJmBFbQW9fhQOzMgseU134xfi6hU+mjWywx5Ty+/M=
376-github.com/yuin/goldmark v1.5.3/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
377+github.com/yuin/goldmark v1.6.0 h1:boZcn2GTjpsynOsC0iJHnBWa4Bi0qzfJjthwauItG68=
378+github.com/yuin/goldmark v1.6.0/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
379 github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594 h1:yHfZyN55+5dp1wG7wDKv8HQ044moxkyGq12KFFMFDxg=
380 github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594/go.mod h1:U9ihbh+1ZN7fR5Se3daSPoz1CGF9IYtSvWwVQtnzGHU=
381 github.com/yuin/goldmark-meta v1.1.0 h1:pWw+JLHGZe8Rk0EGsMVssiNb/AaPMHfSRszZeUeiOUc=
382 github.com/yuin/goldmark-meta v1.1.0/go.mod h1:U4spWENafuA7Zyg+Lj5RqK/MF+ovMYtBvXi1lBb2VP0=
383-github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
384-github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
385+github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
386+github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
387 go.abhg.dev/goldmark/anchor v0.1.1 h1:NUH3hAzhfeymRqZKOkSoFReZlEAmfXBZlbXEzpD2Qgc=
388 go.abhg.dev/goldmark/anchor v0.1.1/go.mod h1:zYKiaHXTdugwVJRZqInVdmNGQRM3ZRJ6AGBC7xP7its=
389-go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
390-go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
391-go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
392-go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
393-go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
394-go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
395-go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
396-go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
397-go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
398+go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
399+go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
400+go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
401+go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
402+go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
403+go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
404 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
405 golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
406 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
407-golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
408 golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
409-golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc=
410-golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
411-golang.org/x/exp v0.0.0-20221211140036-ad323defaf05 h1:T8EldfGCcveFMewH5xAYxxoX3PSQMrsechlUGVFlQBU=
412-golang.org/x/exp v0.0.0-20221211140036-ad323defaf05/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
413+golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
414+golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA=
415+golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g=
416+golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
417+golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
418 golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
419 golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
420-golang.org/x/image v0.2.0 h1:/DcQ0w3VHKCC5p0/P2B0JpAZ9Z++V2KOo2fyU89CXBQ=
421-golang.org/x/image v0.2.0/go.mod h1:la7oBXb9w3YFjBqaAwtynVioc1ZvOnNteUNrifGNmAI=
422+golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4=
423+golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
424 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
425-golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
426-golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
427+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
428 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
429 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
430 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
431-golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
432-golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
433 golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
434 golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
435 golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
436 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
437 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
438+golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
439 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
440 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
441-golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
442-golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
443-golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
444+golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
445+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
446 golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
447+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
448+golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg=
449+golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
450 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
451 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
452 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
453-golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
454 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
455+golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
456+golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
457 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
458 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
459 golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
460@@ -324,62 +307,55 @@ golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7w
461 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
462 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
463 golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
464-golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
465 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
466 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
467-golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
468-golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
469-golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
470-golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
471 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
472-golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
473 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
474 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
475-golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
476-golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
477-golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
478-golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
479-golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
480-golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
481-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
482+golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
483 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
484+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
485+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
486+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
487+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
488+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
489+golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
490+golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
491 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
492 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
493-golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
494-golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
495-golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
496+golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
497 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
498+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
499+golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8=
500+golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww=
501 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
502-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
503 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
504 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
505 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
506-golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
507-golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
508+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
509 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
510+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
511+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
512+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
513 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
514 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
515 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
516-golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
517+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
518 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
519 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
520 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
521 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
522-google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
523-google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
524+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
525+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
526 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
527-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
528 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
529 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
530-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
531 gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
532 gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
533-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
534 gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
535 gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
536 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
537 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
538 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
539-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
540 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
541 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
M imgs/client.go
+1, -1
1@@ -1,7 +1,7 @@
2 package imgs
3 
4 import (
5-	"github.com/gliderlabs/ssh"
6+	"github.com/charmbracelet/ssh"
7 	"github.com/picosh/pico/db"
8 	uploadimgs "github.com/picosh/pico/filehandlers/imgs"
9 	"github.com/picosh/pico/shared"
M pastes/cms.go
+1, -1
 1@@ -9,10 +9,10 @@ import (
 2 	"time"
 3 
 4 	"github.com/charmbracelet/promwish"
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7 	bm "github.com/charmbracelet/wish/bubbletea"
 8 	lm "github.com/charmbracelet/wish/logging"
 9-	"github.com/gliderlabs/ssh"
10 	"github.com/picosh/pico/db/postgres"
11 	"github.com/picosh/pico/filehandlers"
12 	"github.com/picosh/pico/shared"
M pgs/cli.go
+2, -2
 1@@ -4,7 +4,7 @@ import (
 2 	"errors"
 3 	"fmt"
 4 
 5-	"github.com/gliderlabs/ssh"
 6+	"github.com/charmbracelet/ssh"
 7 	"github.com/picosh/pico/db"
 8 	"github.com/picosh/pico/shared"
 9 	"github.com/picosh/pico/shared/storage"
10@@ -42,7 +42,7 @@ type Cmd struct {
11 }
12 
13 func (c *Cmd) output(out string) {
14-	_, _ = c.session.Write([]byte(out + "\n"))
15+	_, _ = c.session.Write([]byte(out + "\r\n"))
16 }
17 
18 func (c *Cmd) bail(err error) {
M pgs/cms.go
+3, -3
 1@@ -7,8 +7,8 @@ import (
 2 	"github.com/charmbracelet/bubbles/spinner"
 3 	tea "github.com/charmbracelet/bubbletea"
 4 	"github.com/charmbracelet/lipgloss"
 5+	"github.com/charmbracelet/ssh"
 6 	bm "github.com/charmbracelet/wish/bubbletea"
 7-	"github.com/gliderlabs/ssh"
 8 	"github.com/muesli/reflow/indent"
 9 	"github.com/muesli/reflow/wordwrap"
10 	"github.com/muesli/reflow/wrap"
11@@ -70,7 +70,7 @@ var (
12 )
13 
14 func NewSpinner() spinner.Model {
15-	s := spinner.NewModel()
16+	s := spinner.New()
17 	s.Spinner = spinner.Dot
18 	s.Style = spinnerStyle
19 	return s
20@@ -154,7 +154,7 @@ type model struct {
21 }
22 
23 func (m model) Init() tea.Cmd {
24-	return spinner.Tick
25+	return m.spinner.Tick
26 }
27 
28 func (m model) findUser() (*db.User, error) {
M pgs/ssh.go
+1, -1
 1@@ -9,10 +9,10 @@ import (
 2 	"time"
 3 
 4 	"github.com/charmbracelet/promwish"
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7 	bm "github.com/charmbracelet/wish/bubbletea"
 8 	lm "github.com/charmbracelet/wish/logging"
 9-	"github.com/gliderlabs/ssh"
10 	"github.com/picosh/pico/db/postgres"
11 	uploadassets "github.com/picosh/pico/filehandlers/assets"
12 	"github.com/picosh/pico/shared"
M pgs/wish.go
+1, -1
 1@@ -4,8 +4,8 @@ import (
 2 	"fmt"
 3 	"strings"
 4 
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7-	"github.com/gliderlabs/ssh"
 8 	"github.com/picosh/pico/db"
 9 	uploadassets "github.com/picosh/pico/filehandlers/assets"
10 	"github.com/picosh/pico/wish/cms/util"
M shared/util.go
+1, -1
1@@ -15,7 +15,7 @@ import (
2 	"unicode"
3 	"unicode/utf8"
4 
5-	"github.com/gliderlabs/ssh"
6+	"github.com/charmbracelet/ssh"
7 	"golang.org/x/exp/slices"
8 )
9 
M wish/cmd/server/main.go
+1, -1
 1@@ -8,8 +8,8 @@ import (
 2 	"strings"
 3 	"time"
 4 
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7-	"github.com/gliderlabs/ssh"
 8 	"github.com/picosh/pico/wish/send"
 9 	"github.com/picosh/pico/wish/send/utils"
10 )
M wish/cms/cms.go
+3, -3
 1@@ -7,8 +7,8 @@ import (
 2 	"github.com/charmbracelet/bubbles/spinner"
 3 	tea "github.com/charmbracelet/bubbletea"
 4 	"github.com/charmbracelet/lipgloss"
 5+	"github.com/charmbracelet/ssh"
 6 	bm "github.com/charmbracelet/wish/bubbletea"
 7-	"github.com/gliderlabs/ssh"
 8 	"github.com/muesli/reflow/indent"
 9 	"github.com/muesli/reflow/wordwrap"
10 	"github.com/muesli/reflow/wrap"
11@@ -79,7 +79,7 @@ var (
12 )
13 
14 func NewSpinner() spinner.Model {
15-	s := spinner.NewModel()
16+	s := spinner.New()
17 	s.Spinner = spinner.Dot
18 	s.Style = spinnerStyle
19 	return s
20@@ -165,7 +165,7 @@ type model struct {
21 }
22 
23 func (m model) Init() tea.Cmd {
24-	return spinner.Tick
25+	return m.spinner.Tick
26 }
27 
28 func (m model) findUser() (*db.User, error) {
M wish/cms/ui/account/create.go
+3, -3
 1@@ -94,8 +94,8 @@ func (m *CreateModel) indexBackward() {
 2 func NewCreateModel(cfg *config.ConfigCms, dbpool db.DB, publicKey string) CreateModel {
 3 	st := common.DefaultStyles()
 4 
 5-	im := input.NewModel()
 6-	im.CursorStyle = st.Cursor
 7+	im := input.New()
 8+	im.Cursor.Style = st.Cursor
 9 	im.Placeholder = "erock"
10 	im.Prompt = st.FocusedPrompt.String()
11 	im.CharLimit = 50
12@@ -176,7 +176,7 @@ func Update(msg tea.Msg, m CreateModel) (CreateModel, tea.Cmd) {
13 
14 					return m, tea.Batch(
15 						createAccount(m), // fire off the command, too
16-						spinner.Tick,
17+						m.spinner.Tick,
18 					)
19 				case cancelButton: // Exit
20 					m.Quit = true
M wish/cms/ui/common/views.go
+1, -1
1@@ -77,7 +77,7 @@ func KeyValueView(stuff ...string) string {
2 
3 // NewSpinner returns a spinner model.
4 func NewSpinner() spinner.Model {
5-	s := spinner.NewModel()
6+	s := spinner.New()
7 	s.Spinner = spinner.Dot
8 	s.Style = spinnerStyle
9 	return s
M wish/cms/ui/createkey/create.go
+3, -3
 1@@ -88,8 +88,8 @@ func (m *Model) indexBackward() {
 2 func NewModel(cfg *config.ConfigCms, dbpool db.DB, user *db.User) Model {
 3 	st := common.DefaultStyles()
 4 
 5-	im := input.NewModel()
 6-	im.CursorStyle = st.Cursor
 7+	im := input.New()
 8+	im.Cursor.Style = st.Cursor
 9 	im.Placeholder = "ssh-ed25519 AAAA..."
10 	im.Prompt = st.FocusedPrompt.String()
11 	im.CharLimit = 2049
12@@ -164,7 +164,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
13 
14 					return m, tea.Batch(
15 						addPublicKey(m), // fire off the command, too
16-						spinner.Tick,
17+						m.spinner.Tick,
18 					)
19 				case cancelButton: // Exit this mini-app
20 					m.Done = true
M wish/cms/ui/createtoken/create.go
+3, -3
 1@@ -92,8 +92,8 @@ func (m *Model) indexBackward() {
 2 func NewModel(cfg *config.ConfigCms, dbpool db.DB, user *db.User) Model {
 3 	st := common.DefaultStyles()
 4 
 5-	im := input.NewModel()
 6-	im.CursorStyle = st.Cursor
 7+	im := input.New()
 8+	im.Cursor.Style = st.Cursor
 9 	im.Placeholder = "A name used for your reference"
10 	im.Prompt = st.FocusedPrompt.String()
11 	im.CharLimit = 256
12@@ -176,7 +176,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
13 
14 					return m, tea.Batch(
15 						addToken(m), // fire off the command, too
16-						spinner.Tick,
17+						m.spinner.Tick,
18 					)
19 				case cancelButton: // Exit this mini-app
20 					m.Done = true
M wish/cms/ui/keys/keys.go
+3, -3
 1@@ -85,7 +85,7 @@ func (m *Model) UpdatePaging(msg tea.Msg) {
 2 func NewModel(cfg *config.ConfigCms, dbpool db.DB, user *db.User) Model {
 3 	st := common.DefaultStyles()
 4 
 5-	p := pager.NewModel()
 6+	p := pager.New()
 7 	p.PerPage = keysPerPage
 8 	p.Type = pager.Dots
 9 	p.InactiveDot = st.InactivePagination.Render("•")
10@@ -110,7 +110,7 @@ func NewModel(cfg *config.ConfigCms, dbpool db.DB, user *db.User) Model {
11 // Init is the Tea initialization function.
12 func (m Model) Init() tea.Cmd {
13 	return tea.Batch(
14-		spinner.Tick,
15+		m.spinner.Tick,
16 	)
17 }
18 
19@@ -381,7 +381,7 @@ func (m Model) promptView(prompt string) string {
20 func LoadKeys(m Model) tea.Cmd {
21 	return tea.Batch(
22 		fetchKeys(m.dbpool, m.user),
23-		spinner.Tick,
24+		m.spinner.Tick,
25 	)
26 }
27 
M wish/cms/ui/posts/posts.go
+3, -3
 1@@ -88,7 +88,7 @@ func NewModel(cfg *config.ConfigCms, urls config.ConfigURL, dbpool db.DB, user *
 2 	logger := cfg.Logger
 3 	st := common.DefaultStyles()
 4 
 5-	p := pager.NewModel()
 6+	p := pager.New()
 7 	p.PerPage = keysPerPage
 8 	p.Type = pager.Dots
 9 	p.InactiveDot = st.InactivePagination.Render("•")
10@@ -115,7 +115,7 @@ func NewModel(cfg *config.ConfigCms, urls config.ConfigURL, dbpool db.DB, user *
11 // Init is the Tea initialization function.
12 func (m Model) Init() tea.Cmd {
13 	return tea.Batch(
14-		spinner.Tick,
15+		m.spinner.Tick,
16 	)
17 }
18 
19@@ -315,7 +315,7 @@ func LoadPosts(m Model) tea.Cmd {
20 
21 	return tea.Batch(
22 		m.fetchPosts(m.user.ID),
23-		spinner.Tick,
24+		m.spinner.Tick,
25 	)
26 }
27 
M wish/cms/ui/tokens/tokens.go
+3, -3
 1@@ -83,7 +83,7 @@ func (m *Model) UpdatePaging(msg tea.Msg) {
 2 func NewModel(cfg *config.ConfigCms, dbpool db.DB, user *db.User) Model {
 3 	st := common.DefaultStyles()
 4 
 5-	p := pager.NewModel()
 6+	p := pager.New()
 7 	p.PerPage = keysPerPage
 8 	p.Type = pager.Dots
 9 	p.InactiveDot = st.InactivePagination.Render("•")
10@@ -108,7 +108,7 @@ func NewModel(cfg *config.ConfigCms, dbpool db.DB, user *db.User) Model {
11 // Init is the Tea initialization function.
12 func (m Model) Init() tea.Cmd {
13 	return tea.Batch(
14-		spinner.Tick,
15+		m.spinner.Tick,
16 	)
17 }
18 
19@@ -349,7 +349,7 @@ func (m Model) promptView(prompt string) string {
20 func LoadKeys(m Model) tea.Cmd {
21 	return tea.Batch(
22 		fetchKeys(m.dbpool, m.user),
23-		spinner.Tick,
24+		m.spinner.Tick,
25 	)
26 }
27 
M wish/cms/ui/username/username.go
+3, -3
 1@@ -94,8 +94,8 @@ func (m *Model) indexBackward() {
 2 func NewModel(dbpool db.DB, user *db.User, sshUser string) Model {
 3 	st := common.DefaultStyles()
 4 
 5-	im := input.NewModel()
 6-	im.CursorStyle = st.Cursor
 7+	im := input.New()
 8+	im.Cursor.Style = st.Cursor
 9 	im.Placeholder = sshUser
10 	im.Prompt = st.FocusedPrompt.String()
11 	im.CharLimit = 50
12@@ -178,7 +178,7 @@ func Update(msg tea.Msg, m Model) (Model, tea.Cmd) {
13 
14 					return m, tea.Batch(
15 						setName(m), // fire off the command, too
16-						spinner.Tick,
17+						m.spinner.Tick,
18 					)
19 				case cancelButton: // Exit this mini-app
20 					m.Done = true
M wish/cms/util/util.go
+1, -1
1@@ -4,7 +4,7 @@ import (
2 	"encoding/base64"
3 	"fmt"
4 
5-	"github.com/gliderlabs/ssh"
6+	"github.com/charmbracelet/ssh"
7 )
8 
9 func KeyText(s ssh.Session) (string, error) {
M wish/list/list.go
+2, -2
 1@@ -4,8 +4,8 @@ import (
 2 	"sort"
 3 	"strings"
 4 
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7-	"github.com/gliderlabs/ssh"
 8 	"github.com/picosh/pico/wish/send/utils"
 9 )
10 
11@@ -36,7 +36,7 @@ func Middleware(writeHandler utils.CopyFromClientHandler) wish.Middleware {
12 
13 			sort.Strings(data)
14 
15-			_, err = session.Write([]byte(strings.Join(data, "\n")))
16+			_, err = session.Write([]byte(strings.Join(data, "\r\n")))
17 			if err != nil {
18 				utils.ErrorHandler(session, err)
19 			}
M wish/pipe/pipe.go
+2, -2
 1@@ -7,8 +7,8 @@ import (
 2 	"strings"
 3 	"time"
 4 
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7-	"github.com/gliderlabs/ssh"
 8 	"github.com/picosh/pico/wish/send/utils"
 9 )
10 
11@@ -43,7 +43,7 @@ func Middleware(writeHandler utils.CopyFromClientHandler, ext string) wish.Middl
12 			}
13 
14 			if result != "" {
15-				_, err = session.Write([]byte(fmt.Sprintf("%s\n", result)))
16+				_, err = session.Write([]byte(fmt.Sprintf("%s\r\n", result)))
17 				if err != nil {
18 					utils.ErrorHandler(session, err)
19 				}
M wish/proxy/middleware.go
+1, -1
 1@@ -1,8 +1,8 @@
 2 package proxy
 3 
 4 import (
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7-	"github.com/gliderlabs/ssh"
 8 )
 9 
10 type Router func(sh ssh.Handler, s ssh.Session) []wish.Middleware
M wish/send/auth/auth.go
+1, -1
 1@@ -1,8 +1,8 @@
 2 package auth
 3 
 4 import (
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7-	"github.com/gliderlabs/ssh"
 8 	"github.com/picosh/pico/wish/send/utils"
 9 )
10 
M wish/send/rsync/rsync.go
+3, -3
 1@@ -11,8 +11,8 @@ import (
 2 	"github.com/antoniomika/go-rsync-receiver/rsyncreceiver"
 3 	"github.com/antoniomika/go-rsync-receiver/rsyncsender"
 4 	rsyncutils "github.com/antoniomika/go-rsync-receiver/utils"
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7-	"github.com/gliderlabs/ssh"
 8 	"github.com/picosh/pico/wish/send/utils"
 9 )
10 
11@@ -57,11 +57,11 @@ func (h *handler) Put(fileName string, content io.Reader, fileSize int64, mTime
12 
13 	msg, err := h.writeHandler.Write(h.session, fileEntry)
14 	if err != nil {
15-		errMsg := fmt.Sprintf("%s\n", err.Error())
16+		errMsg := fmt.Sprintf("%s\r\n", err.Error())
17 		_, err = h.session.Stderr().Write([]byte(errMsg))
18 	}
19 	if msg != "" {
20-		nMsg := fmt.Sprintf("%s\n", msg)
21+		nMsg := fmt.Sprintf("%s\r\n", msg)
22 		_, err = h.session.Stderr().Write([]byte(nMsg))
23 	}
24 	return 0, err
M wish/send/scp/copy_from_client.go
+1, -1
1@@ -10,7 +10,7 @@ import (
2 	"regexp"
3 	"strconv"
4 
5-	"github.com/gliderlabs/ssh"
6+	"github.com/charmbracelet/ssh"
7 	"github.com/picosh/pico/wish/send/utils"
8 )
9 
M wish/send/scp/copy_to_client.go
+1, -1
1@@ -3,7 +3,7 @@ package scp
2 import (
3 	"errors"
4 
5-	"github.com/gliderlabs/ssh"
6+	"github.com/charmbracelet/ssh"
7 	"github.com/picosh/pico/wish/send/utils"
8 )
9 
M wish/send/scp/scp.go
+1, -1
 1@@ -3,8 +3,8 @@ package scp
 2 import (
 3 	"fmt"
 4 
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7-	"github.com/gliderlabs/ssh"
 8 	"github.com/picosh/pico/wish/send/utils"
 9 )
10 
M wish/send/send.go
+1, -1
 1@@ -1,8 +1,8 @@
 2 package send
 3 
 4 import (
 5+	"github.com/charmbracelet/ssh"
 6 	"github.com/charmbracelet/wish"
 7-	"github.com/gliderlabs/ssh"
 8 	"github.com/picosh/pico/wish/pipe"
 9 	"github.com/picosh/pico/wish/send/auth"
10 	"github.com/picosh/pico/wish/send/rsync"
M wish/send/sftp/handler.go
+17, -2
 1@@ -1,13 +1,15 @@
 2 package sftp
 3 
 4 import (
 5+	"bytes"
 6 	"errors"
 7 	"io"
 8 	"os"
 9 
10-	"github.com/gliderlabs/ssh"
11+	"github.com/charmbracelet/ssh"
12 	"github.com/picosh/pico/wish/send/utils"
13 	"github.com/pkg/sftp"
14+	"golang.org/x/exp/slices"
15 )
16 
17 type listerat []os.FileInfo
18@@ -30,7 +32,16 @@ type handler struct {
19 }
20 
21 func (f *handler) Filecmd(r *sftp.Request) error {
22-	return nil
23+	switch r.Method {
24+	case "Remove":
25+		entry := toFileEntry(r)
26+		entry.Reader = bytes.NewReader(nil)
27+
28+		_, err := f.writeHandler.Write(f.session, entry)
29+
30+		return err
31+	}
32+	return errors.New("unsupported")
33 }
34 
35 func (f *handler) Filelist(r *sftp.Request) (sftp.ListerAt, error) {
36@@ -43,6 +54,10 @@ func (f *handler) Filelist(r *sftp.Request) (sftp.ListerAt, error) {
37 			return nil, err
38 		}
39 
40+		listData = slices.DeleteFunc(listData, func(f os.FileInfo) bool {
41+			return f.Name() == "/"
42+		})
43+
44 		return listerat(listData), nil
45 	}
46 
M wish/send/sftp/sftp.go
+1, -1
1@@ -5,7 +5,7 @@ import (
2 	"io"
3 	"log"
4 
5-	"github.com/gliderlabs/ssh"
6+	"github.com/charmbracelet/ssh"
7 	"github.com/picosh/pico/wish/send/utils"
8 	"github.com/pkg/sftp"
9 )
M wish/send/sftp/writer.go
+2, -2
 1@@ -58,11 +58,11 @@ func (f fakeWrite) WriteAt(p []byte, off int64) (int, error) {
 2 func (f fakeWrite) Close() error {
 3 	msg, err := f.handler.writeHandler.Write(f.handler.session, f.fileEntry)
 4 	if err != nil {
 5-		errMsg := fmt.Sprintf("%s\n", err.Error())
 6+		errMsg := fmt.Sprintf("%s\r\n", err.Error())
 7 		_, err = f.handler.session.Stderr().Write([]byte(errMsg))
 8 	}
 9 	if msg != "" {
10-		nMsg := fmt.Sprintf("%s\n", msg)
11+		nMsg := fmt.Sprintf("%s\r\n", msg)
12 		_, err = f.handler.session.Stderr().Write([]byte(nMsg))
13 	}
14 	return err
A wish/send/utils/allreaderat.go
+33, -0
 1@@ -0,0 +1,33 @@
 2+package utils
 3+
 4+import (
 5+	"errors"
 6+	"io"
 7+	"net/http"
 8+
 9+	"github.com/minio/minio-go/v7"
10+)
11+
12+type AllReaderAt struct {
13+	Reader io.ReaderAt
14+}
15+
16+func NewAllReaderAt(reader io.ReaderAt) *AllReaderAt {
17+	return &AllReaderAt{reader}
18+}
19+
20+func (a *AllReaderAt) ReadAt(p []byte, off int64) (n int, err error) {
21+	n, err = a.Reader.ReadAt(p, off)
22+
23+	if errors.Is(err, io.EOF) {
24+		return
25+	}
26+
27+	resp := minio.ToErrorResponse(err)
28+
29+	if resp.StatusCode == http.StatusRequestedRangeNotSatisfiable {
30+		err = io.EOF
31+	}
32+
33+	return
34+}
M wish/send/utils/utils.go
+4, -4
 1@@ -9,7 +9,7 @@ import (
 2 	"path/filepath"
 3 	"strconv"
 4 
 5-	"github.com/gliderlabs/ssh"
 6+	"github.com/charmbracelet/ssh"
 7 )
 8 
 9 // NULL is an array with a single NULL byte.
10@@ -71,7 +71,7 @@ func KeyText(session ssh.Session) (string, error) {
11 }
12 
13 func ErrorHandler(session ssh.Session, err error) {
14-	_, _ = fmt.Fprintln(session.Stderr(), err)
15+	_, _ = fmt.Fprint(session.Stderr(), err, "\r\n")
16 	_ = session.Exit(1)
17 	_ = session.Close()
18 }
19@@ -81,7 +81,7 @@ func PrintMsg(session ssh.Session, stdout []string, stderr []error) {
20 	if len(stdout) > 0 {
21 		for _, msg := range stdout {
22 			if msg != "" {
23-				output += fmt.Sprintf("%s\n", msg)
24+				output += fmt.Sprintf("%s\r\n", msg)
25 			}
26 		}
27 		_, _ = fmt.Fprintln(session.Stderr(), output)
28@@ -90,7 +90,7 @@ func PrintMsg(session ssh.Session, stdout []string, stderr []error) {
29 	outputErr := ""
30 	if len(stderr) > 0 {
31 		for _, err := range stderr {
32-			outputErr += fmt.Sprintf("%v\n", err)
33+			outputErr += fmt.Sprintf("%v\r\n", err)
34 		}
35 		_, _ = fmt.Fprintln(session.Stderr(), outputErr)
36 	}