From 8bf1637bf8217cde3fab745e2a89d3c2349ef9ef Mon Sep 17 00:00:00 2001 From: houmkh <1119644616@qq.com> Date: Tue, 1 Nov 2022 20:46:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=87=AA=E5=8A=A8=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E6=A8=A1=E5=9D=97=E8=B7=AF=E7=94=B1=EF=BC=8C=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E9=A1=B9=E7=9B=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmn/service-context.go | 10 +- dao/db-connect.go | 31 ++ go.mod | 19 + go.sum | 432 ++++++++++++++++++++++- main.go | 39 +- serve/file_management/file-management.go | 22 +- serve/login/login.go | 10 +- serve/register/register.go | 6 +- serve/reply_msg/reply-msg.go | 45 ++- serve/test/test.go | 35 ++ serve/user_management/user-management.go | 40 ++- service/service-enroll-generate.go | 14 +- service/services-generated.go | 20 +- service/web-serve.go | 164 +++++++++ user-files/1_1667306071750758900.jpg | Bin 0 -> 38031 bytes 15 files changed, 804 insertions(+), 83 deletions(-) create mode 100644 dao/db-connect.go create mode 100644 serve/test/test.go create mode 100644 user-files/1_1667306071750758900.jpg diff --git a/cmn/service-context.go b/cmn/service-context.go index 960a29d..b514602 100644 --- a/cmn/service-context.go +++ b/cmn/service-context.go @@ -3,6 +3,9 @@ package cmn import ( "errors" "fmt" + "github.com/jackc/pgx/v4" + "net/http" + "strings" "sync" ) @@ -13,6 +16,7 @@ type ModuleAuthor struct { Addi string `json:"addi"` } type ServeEndPoint struct { + Fn func(w http.ResponseWriter, r *http.Request, dbConn *pgx.Conn) Path string Name string Developer *ModuleAuthor @@ -55,9 +59,9 @@ func AddService(ep *ServeEndPoint) (err error) { // break // } // - // if !rIsAPI.MatchString(ep.Path) { - // ep.Path = strings.ReplaceAll("/api/"+ep.Path, "//", "/") - // } + //if !rIsAPI.MatchString(ep.Path) { + ep.Path = strings.ReplaceAll("/api/"+ep.Path, "//", "/") + //} //} if ep.Name == "" { diff --git a/dao/db-connect.go b/dao/db-connect.go new file mode 100644 index 0000000..8f0baac --- /dev/null +++ b/dao/db-connect.go @@ -0,0 +1,31 @@ +package dao + +import ( + "context" + "fmt" + "github.com/jackc/pgx/v4" +) + +const ( + host = "localhost" + port = 5432 + user = "postgres" + password = "021020" + dbname = "chatroom" +) + +var dbConn *pgx.Conn + +func ConnDB() *pgx.Conn { + var err error + dbConnParam := fmt.Sprintf(`%s://%s:%s@%s:%d/%s`, user, user, password, host, port, dbname) + dbConn, err = pgx.Connect(context.Background(), dbConnParam) + if err != nil { + fmt.Println("failed to connect database") + //panic(err.Error()) + return nil + } else { + fmt.Println("connect database successfully") + } + return dbConn +} diff --git a/go.mod b/go.mod index e2deef4..7705872 100644 --- a/go.mod +++ b/go.mod @@ -3,11 +3,17 @@ module chatroom go 1.17 require ( + github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.5.0 github.com/jackc/pgx/v4 v4.17.2 + github.com/spf13/cobra v1.6.1 + github.com/spf13/viper v1.13.0 ) require ( + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.13.0 // indirect github.com/jackc/pgio v1.0.0 // indirect @@ -15,6 +21,19 @@ require ( github.com/jackc/pgproto3/v2 v2.3.1 // indirect github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect github.com/jackc/pgtype v1.12.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.5 // 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.4.1 // indirect golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect golang.org/x/text v0.3.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 3f8d6b9..f80aec0 100644 --- a/go.sum +++ b/go.sum @@ -1,22 +1,145 @@ +cloud.google.com/go v0.26.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.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= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +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/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= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +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/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= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +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= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/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/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= 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/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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +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-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +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/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= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +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/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= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +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/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/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/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= 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/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +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/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +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.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -37,7 +160,6 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= @@ -65,37 +187,67 @@ github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0f github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +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/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 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.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= 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/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +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/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.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= 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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +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.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= 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.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -108,7 +260,19 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +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/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +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= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -123,65 +287,327 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= 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-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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/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-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +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= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +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/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-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= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +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/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= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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/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-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-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-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-20190813141303-74dc4d7220e7/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= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +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/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= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +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/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/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-20190403152447-81d4e9dc473e/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-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/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-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-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= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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-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-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-20210225134936-a50acf3fe073/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-20210615035016-665e8c7367d1/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-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +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= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +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/tools v0.0.0-20180917221912-90fa682c2a6e/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= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 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-20190823170909-c4a336ef6a2f/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-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= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +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-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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.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= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +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/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +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-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= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +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/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= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +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/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/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= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +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= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 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= +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= diff --git a/main.go b/main.go index a4a835f..217437a 100644 --- a/main.go +++ b/main.go @@ -6,7 +6,7 @@ import ( "chatroom/serve/login" "chatroom/serve/register" "chatroom/serve/user_management" - "context" + "chatroom/service" "encoding/json" "fmt" "github.com/gorilla/websocket" @@ -63,6 +63,7 @@ func schedule() { } } +//TODO 要测试的函数!! //只实现一次只给一个人发消息 func handleBroadcastData(data serve.BroadcastData) { //把消息队列里面的消息 塞到对应用户的管道中 @@ -235,28 +236,30 @@ func serveHome(w http.ResponseWriter, r *http.Request) { } -const ( - host = "localhost" - port = 5432 - user = "postgres" - password = "021020" - dbname = "chatroom" -) +//const ( +// host = "localhost" +// port = 5432 +// user = "postgres" +// password = "021020" +// dbname = "chatroom" +//) var dbConn *pgx.Conn func main() { - var err error - dbConnParam := fmt.Sprintf(`%s://%s:%s@%s:%d/%s`, user, user, password, host, port, dbname) - dbConn, err = pgx.Connect(context.Background(), dbConnParam) - if err != nil { - fmt.Println("failed to connect database") - //panic(err.Error()) - } else { - fmt.Println("connect database successfully") - } + //var err error + //dbConnParam := fmt.Sprintf(`%s://%s:%s@%s:%d/%s`, user, user, password, host, port, dbname) + //dbConn, err = pgx.Connect(context.Background(), dbConnParam) + //if err != nil { + // fmt.Println("failed to connect database") + // //panic(err.Error()) + //} else { + // fmt.Println("connect database successfully") + //} + //dbConn = dao.ConnDB() go schedule() - http.HandleFunc("/", serveHome) + service.WebServe() + //http.HandleFunc("/", serveHome) http.HandleFunc("/chat", func(writer http.ResponseWriter, request *http.Request) { serveWs(writer, request) }) diff --git a/serve/file_management/file-management.go b/serve/file_management/file-management.go index 5c44725..cdf39c2 100644 --- a/serve/file_management/file-management.go +++ b/serve/file_management/file-management.go @@ -32,10 +32,26 @@ func Enroll(author string) { } cmn.AddService(&cmn.ServeEndPoint{ - //Fn: user, + Fn: UploadFile, - Path: "/file_management", - Name: "file_management", + Path: "/user/upload_file", + Name: "user/upload_file", + + Developer: developer, + }) + cmn.AddService(&cmn.ServeEndPoint{ + Fn: ShowFiles, + + Path: "/user/show_files", + Name: "user/show_files", + + Developer: developer, + }) + cmn.AddService(&cmn.ServeEndPoint{ + Fn: DownloadFile, + + Path: "/user/download_file", + Name: "user/download_file", Developer: developer, }) diff --git a/serve/login/login.go b/serve/login/login.go index 3122ba4..55e1665 100644 --- a/serve/login/login.go +++ b/serve/login/login.go @@ -18,7 +18,6 @@ import ( func Enroll(author string) { var developer *cmn.ModuleAuthor - if author != "" { var d cmn.ModuleAuthor err := json.Unmarshal([]byte(author), &d) @@ -29,17 +28,20 @@ func Enroll(author string) { } cmn.AddService(&cmn.ServeEndPoint{ - //Fn: user, + Fn: Login, - Path: "/login", - Name: "login", + Path: "/user/login", + Name: "/user/login", Developer: developer, }) + } func Login(w http.ResponseWriter, r *http.Request, dbConn *pgx.Conn) { + fmt.Println("func login begin") + var err error buf, err := ioutil.ReadAll(r.Body) if err != nil { diff --git a/serve/register/register.go b/serve/register/register.go index 63e07ce..8df2393 100644 --- a/serve/register/register.go +++ b/serve/register/register.go @@ -28,10 +28,10 @@ func Enroll(author string) { } cmn.AddService(&cmn.ServeEndPoint{ - //Fn: user, + Fn: Register, - Path: "/register", - Name: "register", + Path: "/user/register", + Name: "/user/register", Developer: developer, }) diff --git a/serve/reply_msg/reply-msg.go b/serve/reply_msg/reply-msg.go index 7a5095a..7a7ca97 100644 --- a/serve/reply_msg/reply-msg.go +++ b/serve/reply_msg/reply-msg.go @@ -1,37 +1,34 @@ package reply_msg import ( - "chatroom/cmn" "chatroom/serve" "encoding/json" "fmt" "net/http" ) -//annotation:reply_msg-service -//author:{"name":"reply_msg","tel":"15521212871","email":"jiaying.hou@qq.com"} +//func Enroll(author string) { +// var developer *cmn.ModuleAuthor +// +// if author != "" { +// var d cmn.ModuleAuthor +// err := json.Unmarshal([]byte(author), &d) +// if err != nil { +// return +// } +// developer = &d +// } +// +// cmn.AddService(&cmn.ServeEndPoint{ +// Fn: Response, +// +// Path: "/reply_msg", +// Name: "reply_msg", +// +// Developer: developer, +// }) +//} -func Enroll(author string) { - var developer *cmn.ModuleAuthor - - if author != "" { - var d cmn.ModuleAuthor - err := json.Unmarshal([]byte(author), &d) - if err != nil { - return - } - developer = &d - } - - cmn.AddService(&cmn.ServeEndPoint{ - //Fn: user, - - Path: "/reply_msg", - Name: "reply_msg", - - Developer: developer, - }) -} func Response(w http.ResponseWriter, msg *serve.ReplyMsg) { buf, err := json.Marshal(&msg) if err != nil { diff --git a/serve/test/test.go b/serve/test/test.go new file mode 100644 index 0000000..61cbf29 --- /dev/null +++ b/serve/test/test.go @@ -0,0 +1,35 @@ +package test + +import ( + "chatroom/cmn" + "encoding/json" + "github.com/jackc/pgx/v4" + "net/http" +) + +//annotation:user_management-service +//author:{"name":"user_management","tel":"15521212871","email":"jiaying.hou@qq.com"} +func Enroll(author string) { + var developer *cmn.ModuleAuthor + + if author != "" { + var d cmn.ModuleAuthor + err := json.Unmarshal([]byte(author), &d) + if err != nil { + return + } + developer = &d + } + + cmn.AddService(&cmn.ServeEndPoint{ + Fn: test, + + Path: "/test", + Name: "test", + + Developer: developer, + }) +} +func test(w http.ResponseWriter, r *http.Request, dbConn *pgx.Conn) { + println("hello") +} diff --git a/serve/user_management/user-management.go b/serve/user_management/user-management.go index 078c797..0e4a54e 100644 --- a/serve/user_management/user-management.go +++ b/serve/user_management/user-management.go @@ -27,25 +27,47 @@ func Enroll(author string) { } cmn.AddService(&cmn.ServeEndPoint{ - //Fn: user, + Fn: ShowUsersInfo, - Path: "/user_management", - Name: "user_management", + Path: "/admin/show_users", + Name: "/admin/show_users", + + Developer: developer, + }) + cmn.AddService(&cmn.ServeEndPoint{ + Fn: DeleteUser, + + Path: "/admin/delete_user", + Name: "/admin/delete_user", + + Developer: developer, + }) + cmn.AddService(&cmn.ServeEndPoint{ + Fn: ChangeUserInfo, + + Path: "/admin/change_user_info", + Name: "/admin/change_user_info", Developer: developer, }) } func ShowUsersInfo(w http.ResponseWriter, r *http.Request, dbConn *pgx.Conn) { fmt.Println("func show users begin") - var err error - if err != nil { - fmt.Println(err.Error()) - msg := serve.ReplyMsg{ServeStatus: -200, ResponseMessage: "read msg failed"} - reply_msg.Response(w, &msg) + //var err error + //if err != nil { + // fmt.Println(err.Error()) + // msg := serve.ReplyMsg{ServeStatus: -200, ResponseMessage: "read msg failed"} + // reply_msg.Response(w, &msg) + //} + if dbConn == nil { + fmt.Println("nil") } userArray := make([]serve.UserInfo, 0) sqlstr := `select uid, username from userinfo where privilege = 1` - result, _ := dbConn.Query(context.Background(), sqlstr) + result, err := dbConn.Query(context.Background(), sqlstr) + if err != nil { + fmt.Println(err.Error()) + } defer result.Close() for result.Next() { var user serve.UserInfo diff --git a/service/service-enroll-generate.go b/service/service-enroll-generate.go index c9f0fa8..39c66ec 100644 --- a/service/service-enroll-generate.go +++ b/service/service-enroll-generate.go @@ -38,7 +38,7 @@ Invalid service developer information, please specify func main() { - fmt.Printf("hello\n") + //fmt.Printf("hello\n") type service struct { ServiceName string `json:"serviceName"` @@ -59,7 +59,7 @@ func main() { moduleName := strings.ReplaceAll(strings.ReplaceAll(string(s), "\n", ""), "\r", "") //----------------- - fmt.Printf("ReadDir\n") + //fmt.Printf("ReadDir\n") directories, err := ioutil.ReadDir("../serve") if err != nil { @@ -162,7 +162,7 @@ func main() { continue } } - fmt.Printf("end loap1\n") + //fmt.Printf("end loap1\n") if len(services) == 0 { fmt.Println("len service = 0") @@ -179,20 +179,20 @@ func main() { ServiceName: v.ServiceName, Author: d, } } - fmt.Printf("end loap2\n") + //fmt.Printf("end loap2\n") tmplArg := templateArg{ ModuleName: string(moduleName), Services: services, } - fmt.Printf("ParseFiles\n") + //fmt.Printf("ParseFiles\n") t, err := template.ParseFiles("services.go.tmpl") if err != nil { fmt.Println(err.Error()) return } - fmt.Printf("Create\n") + //fmt.Printf("Create\n") f, err := os.Create("services-generated.go") if err != nil { @@ -200,7 +200,7 @@ func main() { return } defer f.Close() - fmt.Printf("run services.go.tmpl\n") + //fmt.Printf("run services.go.tmpl\n") err = t.ExecuteTemplate(f, "services.go.tmpl", tmplArg) if err != nil { diff --git a/service/services-generated.go b/service/services-generated.go index 14fca55..e63ac1c 100644 --- a/service/services-generated.go +++ b/service/services-generated.go @@ -3,18 +3,20 @@ package service import ( + "chatroom/serve/file_management" //file_management , file_management, 15521212871, jiaying.hou@qq.com - "chatroom/serve/login" //login , login, 15521212871, jiaying.hou@qq.com - "chatroom/serve/register" //register , register, 15521212871, jiaying.hou@qq.com - "chatroom/serve/reply_msg" //reply_msg , reply_msg, 15521212871, jiaying.hou@qq.com + "chatroom/serve/login" //login , login, 15521212871, jiaying.hou@qq.com + "chatroom/serve/register" //register , register, 15521212871, jiaying.hou@qq.com + "chatroom/serve/test" //user_management , user_management, 15521212871, jiaying.hou@qq.com "chatroom/serve/user_management" //user_management , user_management, 15521212871, jiaying.hou@qq.com ) //Enroll will be called from serve cmd -func Enroll() { - file_management.Enroll(`{"name":"file_management","tel":"15521212871","email":"jiaying.hou@qq.com"}`) - login.Enroll(`{"name":"login","tel":"15521212871","email":"jiaying.hou@qq.com"}`) - register.Enroll(`{"name":"register","tel":"15521212871","email":"jiaying.hou@qq.com"}`) - reply_msg.Enroll(`{"name":"reply_msg","tel":"15521212871","email":"jiaying.hou@qq.com"}`) - user_management.Enroll(`{"name":"user_management","tel":"15521212871","email":"jiaying.hou@qq.com"}`) +func Enroll(){ + + file_management.Enroll(`{"name":"file_management","tel":"15521212871","email":"jiaying.hou@qq.com"}`) + login.Enroll(`{"name":"login","tel":"15521212871","email":"jiaying.hou@qq.com"}`) + register.Enroll(`{"name":"register","tel":"15521212871","email":"jiaying.hou@qq.com"}`) + test.Enroll(`{"name":"user_management","tel":"15521212871","email":"jiaying.hou@qq.com"}`) + user_management.Enroll(`{"name":"user_management","tel":"15521212871","email":"jiaying.hou@qq.com"}`) } diff --git a/service/web-serve.go b/service/web-serve.go index 21fdca1..c5c7944 100644 --- a/service/web-serve.go +++ b/service/web-serve.go @@ -1,3 +1,167 @@ package service +import ( + "chatroom/cmn" + "chatroom/dao" + "fmt" + "net/http" + "sort" +) + //go:generate go run service-enroll-generate.go -a=annotation:(?P.*)-service +var dbConn = dao.ConnDB() + +//func reqProc(reqPath string, w http.ResponseWriter, r *http.Request) { +// cmn.Services[reqPath].Fn(w, r, dbConn) +//} + +func WebServe() { + Enroll() + + //router := mux.NewRouter() + + var rootExists bool + var pathList []string + //pathList = append(pathList, "/") + for k := range cmn.Services { + if k == "/" { + fmt.Println("root") + rootExists = true + continue + } + pathList = append(pathList, k) + } + sort.Strings(pathList) + if rootExists { + pathList = append(pathList, "/") + } + //fmt.Println(pathList) + for _, k := range pathList { + reqPath := k + + //fmt.Println(reqPath) + http.HandleFunc(reqPath, func(writer http.ResponseWriter, request *http.Request) { + //reqProc(k, writer, request) + //fmt.Println(request, dbConn) + cmn.Services[reqPath].Fn(writer, request, dbConn) + }) + + //router.HandleFunc(k, func(w http.ResponseWriter, r *http.Request) { + // reqProc(k, w, r) + //}) + } + //fmt.Println("end") + //serv := &http.Server{ + // Addr: strconv.Itoa(8082), + // Handler: GzipHandler(router), + //} + + //err := http.ListenAndServe(":8082", nil) + //if err != nil { + // fmt.Println("listen port failed") + // return + //} + + //host := "qnear.cn" + //if viper.IsSet("webServe.serverName") { + // host = viper.GetString("webServe.serverName") + //} + + //appLaunchPath, err := filepath.Abs(filepath.Dir(os.Args[0])) + //if err != nil { + // //z.Fatal(err.Error()) + // return + //} + + //certPath := appLaunchPath + "/certs" + //var hostWhiteList string103.17 + //if viper.IsSet("webServe.hostWhiteList") { + // hostWhiteList = viper.GetString("webServe.hostWhiteList") + // names := strings.Split(hostWhiteList, ",") + // host := "qnear.cn" + // if viper.IsSet("webServe.serverName") { + // host = viper.GetString("webServe.serverName") + // } + // var exists bool + // for _, v := range names { + // if v == host { + // exists = true + // break + // } + // } + // if !exists { + // log.Fatal(fmt.Sprintf("webServe.serverName:%s must exists in webServe.hostWhiteList: %s", + // host, hostWhiteList)) + // } + //} + + //if hostWhiteList == "" { + // hostWhiteList = host + //} + //certManager := autocert.Manager{ + // Prompt: autocert.AcceptTOS, + // + // HostPolicy: autocert.HostWhitelist( + // strings.Split(hostWhiteList, ",")...), //Your domain here + // + // Cache: autocert.DirCache(certPath), //Folder for storing certificates + //} + + //getWxAccessToken(2) + + //httpListenPort := 8080 + //if viper.IsSet("webServe.httpListenPort") { + // httpListenPort = viper.GetInt("webServe.httpListenPort") + //} + + //httpsListenPort := 8443 + //if viper.IsSet("webServe.httpsListenPort") { + // httpsListenPort = viper.GetInt("webServe.httpsListenPort") + //} + + //var autoCert bool + //if viper.IsSet("webServe.autoCert") { + // autoCert = viper.GetBool("webServe.autoCert") + //} + + //var ep string + //if autoCert { + // ep = fmt.Sprintf(":%v", httpsListenPort) + //} else { + //ep = fmt.Sprintf(":%v", httpListenPort) + //} + + //s1 := "***********************************************************" + //s2 := " ************ app started ****************************" + //s3 := fmt.Sprintf(" db: %s@%s:%d/%s", viper.GetString("dbms.postgresql.user"), + // viper.GetString("dbms.postgresql.addr"), + // viper.GetInt32("dbms.postgresql.port"), + // viper.GetString("dbms.postgresql.db")) + //s8 := fmt.Sprintf(" version: %s", cmn.GetBuildVer()) + //s4 := fmt.Sprintf(" redis: %s:%d", viper.GetString("dbms.redis.addr"), + // viper.GetInt32("dbms.redis.port")) + // + //s5 := " web serve on *" + ep + // + //s6 := " *****************************************************" + //s7 := "***********************************************************" + + //z.Info(fmt.Sprintf("\n\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", s1, s2, s3, s4, s5, s8, s6, s7)) + + //serv := &http.Server{ + // Addr: ep, + // Handler: GzipHandler(router), + //} + + //if autoCert { + // serv.TLSConfig = &tls.Config{GetCertificate: certManager.GetCertificate} + // go func() { _ = http.ListenAndServe(":http", certManager.HTTPHandler(nil)) }() + // _ = serv.ListenAndServeTLS("", "") + // return + //} + + //cmn.AppStartTime = time.Now() + + //z.Info(cmn.AppStartTime.Format(cmn.AppStartTimeLayout)) + //_ = serv.ListenAndServe() +} diff --git a/user-files/1_1667306071750758900.jpg b/user-files/1_1667306071750758900.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54cb997cadc085e4b0df2910a652d17bfd087e4c GIT binary patch literal 38031 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

=iIg23bR{x=K>D8Q+Dw1!6uQ3mOC5z$z3fL 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 N4sav9OMl}(|Je#+HM;-+ literal 0 HcmV?d00001