diff --git a/README.md b/README.md
index 0d0871a..58c67d2 100644
--- a/README.md
+++ b/README.md
@@ -17,4 +17,7 @@ HUSKY=0 pnpm bootstrap
pnpm dev
+# tokenizer
+docker build -t tokenizer:1.0.0 .
+
```
\ No newline at end of file
diff --git a/ai-chat-service/Dockerfile b/ai-chat-service/Dockerfile
new file mode 100644
index 0000000..5bda655
--- /dev/null
+++ b/ai-chat-service/Dockerfile
@@ -0,0 +1,18 @@
+# 编译阶段
+FROM quay.io/0voice/golang:1.20 as stage0
+RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
+ADD ./ /src/ai-chat-service
+WORKDIR /src/ai-chat-service
+RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ai-chat-service ./chat-server
+
+FROM quay.io/0voice/alpine:3.18 as stage1
+ADD ./grpc_health_probe-linux-amd64 /usr/bin/grpc_health_probe
+RUN chmod +x /usr/bin/grpc_health_probe
+MAINTAINER nick
+WORKDIR /app/
+ADD ./dev.config.yaml /app/config.yaml
+COPY --from=stage0 /src/ai-chat-service/ai-chat-service ./
+# 指定入口程序
+ENTRYPOINT ["./ai-chat-service"]
+# 指定容器的启动命令或者入口程序的参数
+CMD ["--config=config.yaml"]
diff --git a/ai-chat-service/chat-server/chat-context/chat_context.go b/ai-chat-service/chat-server/chat-context/chat_context.go
new file mode 100644
index 0000000..8b47270
--- /dev/null
+++ b/ai-chat-service/chat-server/chat-context/chat_context.go
@@ -0,0 +1,20 @@
+package chat_context
+
+import "github.com/sashabaranov/go-openai"
+
+type ChatMessage struct {
+ //当前记录ID
+ ID string `json:"id,omitempty"`
+ //上一条记录ID
+ PID string `json:"pid,omitempty"`
+ //消息内容
+ Message openai.ChatCompletionMessage `json:"message"`
+ //该消息tokens数
+ Tokens int `json:"tokens,omitempty"`
+}
+
+type ContextCache interface {
+ Get(key string) (*ChatMessage, error)
+ Set(key string, value *ChatMessage, ttl int) error
+ Close()
+}
diff --git a/ai-chat-service/chat-server/chat-context/redis.go b/ai-chat-service/chat-server/chat-context/redis.go
new file mode 100644
index 0000000..15afdcd
--- /dev/null
+++ b/ai-chat-service/chat-server/chat-context/redis.go
@@ -0,0 +1,50 @@
+package chat_context
+
+import (
+ predis "ai-chat-service/pkg/db/redis"
+ "context"
+ "encoding/json"
+ "github.com/redis/go-redis/v9"
+ "time"
+)
+
+type redisCache struct {
+ redisClient *redis.Client
+}
+
+func NewRedisCache() ContextCache {
+ pool := predis.GetPool()
+ return &redisCache{
+ redisClient: pool.Get(),
+ }
+}
+func getRedisKey(key string) string {
+ return predis.GetKey(key)
+}
+
+func (c *redisCache) Get(key string) (*ChatMessage, error) {
+ key = getRedisKey(key)
+ str, err := c.redisClient.Get(context.Background(), key).Result()
+ if err == redis.Nil {
+ return nil, nil
+ }
+ if err != nil {
+ return nil, err
+ }
+ value := &ChatMessage{}
+ err = json.Unmarshal([]byte(str), value)
+ return value, err
+}
+func (c *redisCache) Set(key string, value *ChatMessage, ttl int) error {
+ key = getRedisKey(key)
+ bytes, err := json.Marshal(value)
+ if err != nil {
+ return err
+ }
+ str := string(bytes)
+ return c.redisClient.SetEx(context.Background(), key, str, time.Duration(ttl)*time.Second).Err()
+}
+func (c *redisCache) Close() {
+ pool := predis.GetPool()
+ pool.Put(c.redisClient)
+}
diff --git a/ai-chat-service/chat-server/data/chat_records.go b/ai-chat-service/chat-server/data/chat_records.go
new file mode 100644
index 0000000..70daa0a
--- /dev/null
+++ b/ai-chat-service/chat-server/data/chat_records.go
@@ -0,0 +1,54 @@
+package data
+
+import (
+ "database/sql"
+ "strings"
+)
+
+type IChatRecordsData interface {
+ Add(record *ChatRecord) error
+ GetById(id int64) (record *ChatRecord, err error)
+}
+
+type ChatRecord struct {
+ ID int64 `json:"id"`
+ UserMsg string `json:"user_msg"`
+ UserMsgTokens int `json:"user_msg_tokens"`
+ UserMsgKeywords []string `json:"user_msg_keywords"`
+ AIMsg string `json:"ai_msg"`
+ AIMsgTokens int `json:"ai_msg_tokens"`
+ ReqTokens int `json:"req_tokens"`
+ CreateAt int64 `json:"create_at"`
+}
+
+type chatRecordsData struct {
+ db *sql.DB
+}
+
+func NewChatRecordsData(db *sql.DB) IChatRecordsData {
+ return &chatRecordsData{
+ db: db,
+ }
+}
+
+func (data *chatRecordsData) Add(cr *ChatRecord) (err error) {
+ sqlStr := "insert into chat_records(user_msg,user_msg_tokens,user_msg_keywords,ai_msg,ai_msg_tokens,req_tokens,create_at)values(?,?,?,?,?,?,?)"
+ res, err := data.db.Exec(sqlStr, cr.UserMsg, cr.UserMsgTokens, strings.Join(cr.UserMsgKeywords, ","), cr.AIMsg, cr.AIMsgTokens, cr.ReqTokens, cr.CreateAt)
+ if err != nil {
+ return
+ }
+ cr.ID, _ = res.LastInsertId()
+ return
+}
+func (data *chatRecordsData) GetById(id int64) (cr *ChatRecord, err error) {
+ sqlStr := "select id,user_msg,user_msg_tokens,user_msg_keywords,ai_msg,ai_msg_tokens,req_tokens,create_at from chat_records where id = ?"
+ row := data.db.QueryRow(sqlStr, id)
+ cr = &ChatRecord{}
+ var keywords string
+ err = row.Scan(&cr.ID, &cr.UserMsg, &cr.UserMsgTokens, &keywords, &cr.AIMsg, &cr.AIMsgTokens, &cr.ReqTokens, &cr.CreateAt)
+ if err != nil {
+ return nil, err
+ }
+ cr.UserMsgKeywords = strings.Split(keywords, ",")
+ return cr, err
+}
diff --git a/ai-chat-service/chat-server/main.go b/ai-chat-service/chat-server/main.go
new file mode 100644
index 0000000..6dcea98
--- /dev/null
+++ b/ai-chat-service/chat-server/main.go
@@ -0,0 +1,78 @@
+package main
+
+import (
+ "ai-chat-service/chat-server/data"
+ metrics_app "ai-chat-service/chat-server/metrics-app"
+ metrics_bus "ai-chat-service/chat-server/metrics-bus"
+ "ai-chat-service/chat-server/server"
+ vector_data "ai-chat-service/chat-server/vector-data"
+ "ai-chat-service/interceptor"
+ "ai-chat-service/pkg/config"
+ "ai-chat-service/pkg/db/mysql"
+ "ai-chat-service/pkg/db/redis"
+ "ai-chat-service/pkg/db/vector"
+ "ai-chat-service/pkg/log"
+ "ai-chat-service/proto"
+ "flag"
+ "fmt"
+ "github.com/prometheus/client_golang/prometheus"
+ "github.com/prometheus/client_golang/prometheus/collectors"
+ "github.com/prometheus/client_golang/prometheus/promhttp"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/health"
+ "google.golang.org/grpc/health/grpc_health_v1"
+ "net/http"
+
+ "net"
+)
+
+var (
+ configFile = flag.String("config", "dev.config.yaml", "")
+)
+
+func main() {
+ flag.Parse()
+ registry := prometheus.NewRegistry()
+ registry.MustRegister(collectors.NewGoCollector(), collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}))
+ busMetrics := metrics_bus.NewBusMetrics(registry)
+
+ http.Handle("/metrics", promhttp.HandlerFor(registry, promhttp.HandlerOpts{}))
+ go http.ListenAndServe(":8080", nil)
+
+ //初始化配置文件
+ config.InitConfig(*configFile)
+ cnf := config.GetConfig()
+ //初始化日志
+ log.SetLevel(cnf.Log.Level)
+ log.SetOutput(log.GetRotateWriter(cnf.Log.LogPath))
+ log.SetPrintCaller(true)
+
+ logger := log.NewLogger()
+ logger.SetLevel(cnf.Log.Level)
+ logger.SetOutput(log.GetRotateWriter(cnf.Log.LogPath))
+ logger.SetPrintCaller(true)
+
+ // 初始化Mysql
+ mysql.InitMysql(cnf)
+ // 初始化redis
+ redis.InitRedisPool(cnf)
+ // 初始化向量数据库
+ vector.InitDB(cnf)
+
+ recordsData := data.NewChatRecordsData(mysql.GetDB())
+
+ lis, err := net.Listen("tcp", fmt.Sprintf("%s:%d", cnf.Server.IP, cnf.Server.Port))
+ if err != nil {
+ log.Fatal(err)
+ }
+ s := grpc.NewServer(grpc.UnaryInterceptor(interceptor.UnaryAuthInterceptor), grpc.StreamInterceptor(metrics_app.NewStreamMiddleware(registry).WrapHandler()))
+ service := server.NewChatService(recordsData, vector_data.NewChatRecordsData(cnf, vector.GetVdb()), cnf, logger, busMetrics)
+ proto.RegisterChatServer(s, service)
+
+ healthCheckSrv := health.NewServer()
+ grpc_health_v1.RegisterHealthServer(s, healthCheckSrv)
+
+ if err = s.Serve(lis); err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/ai-chat-service/chat-server/metrics-app/metrics_app.go b/ai-chat-service/chat-server/metrics-app/metrics_app.go
new file mode 100644
index 0000000..c9671f8
--- /dev/null
+++ b/ai-chat-service/chat-server/metrics-app/metrics_app.go
@@ -0,0 +1,82 @@
+package metrics_app
+
+import (
+ "github.com/prometheus/client_golang/prometheus"
+ "google.golang.org/grpc"
+ "runtime"
+ "time"
+)
+
+type StreamMiddleware interface {
+ WrapHandler() grpc.StreamServerInterceptor
+}
+type streamMiddleware struct {
+ registry *prometheus.Registry
+ handlerCounter *prometheus.CounterVec
+ handlerDuration *prometheus.SummaryVec
+ handlerAtHour *prometheus.HistogramVec
+}
+
+const (
+ NAMESPACE = "ai_chat"
+ SUBSYSTEM = "chat_service"
+)
+
+func NewStreamMiddleware(registry *prometheus.Registry) StreamMiddleware {
+ counter := prometheus.NewCounterVec(prometheus.CounterOpts{
+ Namespace: NAMESPACE,
+ Subsystem: SUBSYSTEM,
+ Name: "requests_total",
+ ConstLabels: map[string]string{"app": "ai_chat"},
+ Help: "用于累计请求次数",
+ }, []string{"full_method"})
+ gauge := prometheus.NewGaugeFunc(prometheus.GaugeOpts{
+ Namespace: NAMESPACE,
+ Subsystem: SUBSYSTEM,
+ Name: "curr_num_goroutine",
+ ConstLabels: map[string]string{"app": "ai_chat"},
+ Help: "当前存在的goroutine数量",
+ }, func() float64 {
+ return float64(runtime.NumGoroutine())
+ })
+ histogram := prometheus.NewHistogramVec(prometheus.HistogramOpts{
+ Namespace: NAMESPACE,
+ Subsystem: SUBSYSTEM,
+ Name: "request_hour",
+ ConstLabels: map[string]string{"app": "ai_chat"},
+ Help: "http请求发生在一天之中的哪个小时",
+ Buckets: []float64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23},
+ }, []string{"full_method"})
+ summary := prometheus.NewSummaryVec(prometheus.SummaryOpts{
+ Namespace: NAMESPACE,
+ Subsystem: SUBSYSTEM,
+ Name: "request_duration_ms",
+ ConstLabels: map[string]string{"app": "ai_chat"},
+ Help: "请求时长分布",
+ Objectives: map[float64]float64{0.1: 0.01, 0.5: 0.01, 0.9: 0.01, 0.99: 0.01},
+ }, []string{"full_method"})
+ registry.MustRegister(counter, gauge, histogram, summary)
+ return &streamMiddleware{
+ registry: registry,
+ handlerCounter: counter,
+ handlerDuration: summary,
+ handlerAtHour: histogram,
+ }
+}
+
+func (s *streamMiddleware) WrapHandler() grpc.StreamServerInterceptor {
+ return func(srv any, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
+ label := map[string]string{
+ "full_method": info.FullMethod,
+ }
+ s.handlerCounter.With(label).Inc()
+ hour := time.Now().Hour()
+ s.handlerAtHour.With(label).Observe(float64(hour))
+ start := time.Now()
+ defer func() {
+ s.handlerDuration.With(label).Observe(float64(time.Since(start).Milliseconds()))
+ }()
+ err := handler(srv, ss)
+ return err
+ }
+}
diff --git a/ai-chat-service/chat-server/metrics-bus/metrics_bus.go b/ai-chat-service/chat-server/metrics-bus/metrics_bus.go
new file mode 100644
index 0000000..711a899
--- /dev/null
+++ b/ai-chat-service/chat-server/metrics-bus/metrics_bus.go
@@ -0,0 +1,53 @@
+package metrics_bus
+
+import "github.com/prometheus/client_golang/prometheus"
+
+type BusMetrics struct {
+ QuestionsTotalCounter prometheus.Counter
+ KeywordsQuestionsTotalCounter prometheus.Counter
+ SensitiveQuestionsTotalCounter prometheus.Counter
+ ErrQuestionsTotalCounter prometheus.Counter
+}
+
+const (
+ NAMESPACE = "ai_chat"
+ SUBSYSTEM = "chat_service"
+)
+
+func NewBusMetrics(registry *prometheus.Registry) *BusMetrics {
+ questionsTotalCounter := prometheus.NewCounter(prometheus.CounterOpts{
+ Namespace: NAMESPACE,
+ Subsystem: SUBSYSTEM,
+ Name: "questions_total",
+ ConstLabels: map[string]string{"app": "ai_chat"},
+ Help: "记录用户提交问题的总数,仅包含记录到DB的问题数量",
+ })
+ keywordsQuestionsTotalCounter := prometheus.NewCounter(prometheus.CounterOpts{
+ Namespace: NAMESPACE,
+ Subsystem: SUBSYSTEM,
+ Name: "keywords_questions_total",
+ ConstLabels: map[string]string{"app": "ai_chat"},
+ Help: "记录用户提交的包含关键词的问题总数",
+ })
+ sensitiveQuestionsTotalCounter := prometheus.NewCounter(prometheus.CounterOpts{
+ Namespace: NAMESPACE,
+ Subsystem: SUBSYSTEM,
+ Name: "sensitive_questions_total",
+ ConstLabels: map[string]string{"app": "ai_chat"},
+ Help: "记录用户提交的触发敏感词的问题总数",
+ })
+ errQuestionsTotalCounter := prometheus.NewCounter(prometheus.CounterOpts{
+ Namespace: NAMESPACE,
+ Subsystem: SUBSYSTEM,
+ Name: "err_questions_total",
+ ConstLabels: map[string]string{"app": "ai_chat"},
+ Help: "记录用户提交问题时报错的总数",
+ })
+ registry.MustRegister(questionsTotalCounter, keywordsQuestionsTotalCounter, sensitiveQuestionsTotalCounter, errQuestionsTotalCounter)
+ return &BusMetrics{
+ QuestionsTotalCounter: questionsTotalCounter,
+ KeywordsQuestionsTotalCounter: keywordsQuestionsTotalCounter,
+ SensitiveQuestionsTotalCounter: sensitiveQuestionsTotalCounter,
+ ErrQuestionsTotalCounter: errQuestionsTotalCounter,
+ }
+}
diff --git a/ai-chat-service/chat-server/server/app.go b/ai-chat-service/chat-server/server/app.go
new file mode 100644
index 0000000..81a9112
--- /dev/null
+++ b/ai-chat-service/chat-server/server/app.go
@@ -0,0 +1,293 @@
+package server
+
+import (
+ chat_context "ai-chat-service/chat-server/chat-context"
+ "ai-chat-service/pkg/config"
+ "ai-chat-service/pkg/log"
+ "ai-chat-service/pkg/zerror"
+ "ai-chat-service/proto"
+ "ai-chat-service/services"
+ keywords_filter "ai-chat-service/services/keywords-filter"
+ keywords_proto "ai-chat-service/services/keywords-filter/proto"
+ "ai-chat-service/services/tokenizer"
+ "context"
+ "github.com/google/uuid"
+ "github.com/sashabaranov/go-openai"
+ "time"
+)
+
+const ChatPrimedTokens = 2
+
+type openaiConf struct {
+ ApiKey string
+ BaseUrl string
+ Model string
+ MaxTokens int
+ Temperature float32
+ TopP float32
+ PresencePenalty float32
+ FrequencyPenalty float32
+ BotDesc string
+ ContextTTL int
+ ContextLen int
+ MinResponseTokens int
+}
+type app struct {
+ openaiConf *openaiConf
+ log log.ILogger
+ // TODO 内容上下文对象
+ contextCache chat_context.ContextCache
+}
+
+func (s *chatService) newApp(in *proto.ChatCompletionRequest, contextCache chat_context.ContextCache) *app {
+ conf := &openaiConf{
+ ApiKey: s.config.Chat.ApiKey,
+ BaseUrl: s.config.Chat.BaseUrl,
+ Model: s.config.Chat.Model,
+ MaxTokens: s.config.Chat.MaxTokens,
+ Temperature: s.config.Chat.Temperature,
+ TopP: s.config.Chat.TopP,
+ PresencePenalty: s.config.Chat.PresencePenalty,
+ FrequencyPenalty: s.config.Chat.FrequencyPenalty,
+ BotDesc: s.config.Chat.BotDesc,
+ ContextTTL: s.config.Chat.ContextTTL,
+ ContextLen: s.config.Chat.ContextLen,
+ MinResponseTokens: s.config.Chat.MinResponseTokens,
+ }
+ if in.ChatParam != nil {
+ if in.ChatParam.Model != "" {
+ conf.Model = in.ChatParam.Model
+ }
+ if in.ChatParam.TopP != 0 {
+ conf.TopP = in.ChatParam.TopP
+ }
+ if in.ChatParam.FrequencyPenalty != 0 {
+ conf.FrequencyPenalty = in.ChatParam.FrequencyPenalty
+ }
+ if in.ChatParam.PresencePenalty != 0 {
+ conf.PresencePenalty = in.ChatParam.PresencePenalty
+ }
+ if in.ChatParam.Temperature != 0 {
+ conf.Temperature = in.ChatParam.Temperature
+ }
+ if in.ChatParam.BotDesc != "" {
+ conf.BotDesc = in.ChatParam.BotDesc
+ }
+ if in.ChatParam.MaxTokens != 0 {
+ conf.MaxTokens = int(in.ChatParam.MaxTokens)
+ }
+ if in.ChatParam.ContextTTL != 0 {
+ conf.ContextTTL = int(in.ChatParam.ContextTTL)
+ }
+ if in.ChatParam.ContextLen != 0 {
+ conf.ContextLen = int(in.ChatParam.ContextLen)
+ }
+ if in.ChatParam.MinResponseTokens != 0 {
+ conf.MinResponseTokens = int(in.ChatParam.MinResponseTokens)
+ }
+ }
+ return &app{
+ openaiConf: conf,
+ log: s.log,
+ contextCache: contextCache,
+ }
+}
+func (a *app) getOpenaiClient() *openai.Client {
+ accessToken := a.openaiConf.ApiKey
+ config := openai.DefaultConfig(accessToken)
+ config.BaseURL = a.openaiConf.BaseUrl
+ client := openai.NewClientWithConfig(config)
+ return client
+}
+func (a *app) buildChatCompletionRequest(in *proto.ChatCompletionRequest, stream bool) (req openai.ChatCompletionRequest, tokens, currTokens int, currMessage openai.ChatCompletionMessage, err error) {
+ //当前消息
+ currMessage = openai.ChatCompletionMessage{
+ Role: openai.ChatMessageRoleUser,
+ Content: in.Message,
+ }
+ req = openai.ChatCompletionRequest{
+ Model: a.openaiConf.Model,
+ Messages: []openai.ChatCompletionMessage{
+ currMessage,
+ },
+ MaxTokens: a.openaiConf.MinResponseTokens,
+ Temperature: a.openaiConf.Temperature,
+ TopP: a.openaiConf.TopP,
+ PresencePenalty: a.openaiConf.PresencePenalty,
+ FrequencyPenalty: a.openaiConf.FrequencyPenalty,
+ Stream: stream,
+ }
+ contextList := make([]*chat_context.ChatMessage, 0)
+ if in.EnableContext {
+ //从缓存中获取上下文信息
+ contextList = a.getContext(in.Pid)
+ }
+ //重构req.Messages
+ tokens, currTokens, req.Messages, err = a.rebuildMessages(contextList, currMessage)
+ if err != nil {
+ a.log.Error(err)
+ return
+ }
+ req.MaxTokens = a.openaiConf.MaxTokens - tokens
+ return
+}
+func (a *app) rebuildMessages(contextList []*chat_context.ChatMessage, currMessage openai.ChatCompletionMessage) (tokens, currTokens int, messages []openai.ChatCompletionMessage, err error) {
+ var sysMessage openai.ChatCompletionMessage
+ botTokens := 0
+ if a.openaiConf.BotDesc != "" {
+ sysMessage = openai.ChatCompletionMessage{
+ Role: openai.ChatMessageRoleSystem,
+ Content: a.openaiConf.BotDesc,
+ }
+ botTokens, err = tokenizer.GetTokens(&sysMessage, a.openaiConf.Model)
+ if err != nil {
+ a.log.Error(err)
+ return
+ }
+ }
+ messages = []openai.ChatCompletionMessage{currMessage}
+ currTokens, err = tokenizer.GetTokens(&currMessage, a.openaiConf.Model)
+ if err != nil {
+ a.log.Error(err)
+ return
+ }
+ if currTokens > a.openaiConf.MaxTokens-a.openaiConf.MinResponseTokens-botTokens-ChatPrimedTokens {
+ err = zerror.NewByMsg("请求消息超限")
+ a.log.Error(err)
+ return
+ }
+ tokens = currTokens + botTokens + ChatPrimedTokens
+ if contextList != nil {
+ for _, item := range contextList {
+ if tokens+item.Tokens+ChatPrimedTokens > a.openaiConf.MaxTokens-a.openaiConf.MinResponseTokens {
+ break
+ }
+ messages = append(messages, item.Message)
+ tokens += item.Tokens + ChatPrimedTokens
+ }
+ }
+ for i, j := 0, len(messages)-1; i < j; i, j = i+1, j-1 {
+ messages[i], messages[j] = messages[j], messages[i]
+ }
+ if botTokens > 0 {
+ messages = append([]openai.ChatCompletionMessage{sysMessage}, messages...)
+ }
+ return
+}
+func (a *app) buildChatCompletionResponse(msg string) *proto.ChatCompletionResponse {
+ res := &proto.ChatCompletionResponse{
+ Id: uuid.New().String(),
+ Object: "chat.completion",
+ Created: time.Now().Unix(),
+ Model: a.openaiConf.Model,
+ Choices: []*proto.ChatCompletionChoice{
+ {
+ Message: &proto.ChatCompletionMessage{
+ Role: openai.ChatMessageRoleAssistant,
+ Content: msg,
+ },
+ FinishReason: "stop",
+ },
+ },
+ Usage: &proto.Usage{
+ PromptTokens: 0,
+ CompletionTokens: 0,
+ TotalTokens: 0,
+ },
+ }
+ return res
+}
+
+func (a *app) buildChatCompletionStreamResponse(id, delta, finishReason string) *proto.ChatCompletionStreamResponse {
+ res := &proto.ChatCompletionStreamResponse{
+ Id: id,
+ Object: "chat.completion.chunk",
+ Created: time.Now().Unix(),
+ Model: a.openaiConf.Model,
+ Choices: []*proto.ChatCompletionStreamChoice{
+ {
+ Index: 0,
+ Delta: &proto.ChatCompletionStreamChoiceDelta{
+ Content: delta,
+ Role: openai.ChatMessageRoleAssistant,
+ },
+ FinishReason: finishReason,
+ },
+ },
+ }
+ return res
+}
+
+func (a *app) buildChatCompletionStreamResponseList(id, msg string) []*proto.ChatCompletionStreamResponse {
+ list := make([]*proto.ChatCompletionStreamResponse, 0)
+ for _, delta := range msg {
+ list = append(list, a.buildChatCompletionStreamResponse(id, string(delta), ""))
+ }
+ return list
+}
+
+func (a *app) getContext(id string) []*chat_context.ChatMessage {
+ maxLen := a.openaiConf.ContextLen
+ list := make([]*chat_context.ChatMessage, 0, maxLen)
+ key := id
+ for i := 0; i < maxLen; i++ {
+ value, err := a.contextCache.Get(key)
+ if err != nil {
+ a.log.Error(err)
+ return nil
+ }
+ if value == nil {
+ break
+ }
+ list = append(list, value)
+ key = value.PID
+ }
+ return list
+}
+func (a *app) saveContext(value *chat_context.ChatMessage) error {
+ err := a.contextCache.Set(value.ID, value, a.openaiConf.ContextTTL)
+ if err != nil {
+ a.log.Error(err)
+ return err
+ }
+ return nil
+}
+func (a *app) keywords(in *proto.ChatCompletionRequest) []string {
+ pool := keywords_filter.GetKeywordsClientPool()
+ conn := pool.Get()
+ defer pool.Put(conn)
+ accessToken := config.GetConfig().DependOn.Keywords.AccessToken
+ client := keywords_proto.NewFilterClient(conn)
+ ctx := services.AppendBearerTokenToContext(context.Background(), accessToken)
+ req := &keywords_proto.FilterReq{
+ Text: in.Message,
+ }
+ res, err := client.FindAll(ctx, req)
+ if err != nil {
+ a.log.Error(err)
+ return []string{}
+ }
+ return res.Keywords
+
+}
+func (a *app) sensitive(in *proto.ChatCompletionRequest) (ok bool, msg string, err error) {
+ pool := keywords_filter.GetSensitiveClientPool()
+ conn := pool.Get()
+ defer pool.Put(conn)
+ accessToken := config.GetConfig().DependOn.Sensitive.AccessToken
+ client := keywords_proto.NewFilterClient(conn)
+ ctx := services.AppendBearerTokenToContext(context.Background(), accessToken)
+ req := &keywords_proto.FilterReq{
+ Text: in.Message,
+ }
+ res, err := client.Validate(ctx, req)
+ if err != nil {
+ a.log.Error(err)
+ return false, "", err
+ }
+ ok = res.Ok
+ if !ok {
+ msg = "触发到了知识盲区,请换个问题再问"
+ }
+ return
+}
diff --git a/ai-chat-service/chat-server/server/server.go b/ai-chat-service/chat-server/server/server.go
new file mode 100644
index 0000000..84be41e
--- /dev/null
+++ b/ai-chat-service/chat-server/server/server.go
@@ -0,0 +1,352 @@
+package server
+
+import (
+ chat_context "ai-chat-service/chat-server/chat-context"
+ "ai-chat-service/chat-server/data"
+ metrics_bus "ai-chat-service/chat-server/metrics-bus"
+ vector_data "ai-chat-service/chat-server/vector-data"
+ "ai-chat-service/pkg/config"
+ "ai-chat-service/pkg/log"
+ "ai-chat-service/proto"
+ "ai-chat-service/services/tokenizer"
+ "context"
+ "encoding/json"
+ "github.com/golang/protobuf/jsonpb"
+ "github.com/google/uuid"
+ "github.com/sashabaranov/go-openai"
+ "io"
+ "strconv"
+ "strings"
+ "time"
+)
+
+type chatService struct {
+ proto.UnimplementedChatServer
+ config *config.Config
+ log log.ILogger
+ data data.IChatRecordsData
+ vectorData vector_data.IChatRecordsData
+ busMetrics *metrics_bus.BusMetrics
+}
+
+func NewChatService(data data.IChatRecordsData, vectorData vector_data.IChatRecordsData, config *config.Config, log log.ILogger, busMetrics *metrics_bus.BusMetrics) proto.ChatServer {
+ return &chatService{
+ config: config,
+ log: log,
+ data: data,
+ vectorData: vectorData,
+ busMetrics: busMetrics,
+ }
+}
+
+func (s *chatService) ChatCompletion(ctx context.Context, in *proto.ChatCompletionRequest) (*proto.ChatCompletionResponse, error) {
+ redisContextCache := chat_context.NewRedisCache()
+ defer redisContextCache.Close()
+
+ app := s.newApp(in, redisContextCache)
+ //敏感词过滤
+ ok, msg, err := app.sensitive(in)
+ if err != nil {
+ s.log.Error(err)
+ return nil, err
+ }
+ if !ok {
+ res := app.buildChatCompletionResponse(msg)
+ return res, nil
+ }
+
+ //关键词提取
+ keywords := app.keywords(in)
+ if len(keywords) > 0 {
+ idStr, score, err := s.vectorData.QueryData(context.Background(), map[string][]string{"keywords": {strings.Join(keywords, ",")}})
+ if err != nil {
+ s.log.Error(err)
+ } else if score > 0.99 {
+ id, err := strconv.ParseInt(idStr, 10, 64)
+ if err != nil {
+ s.log.Error(err)
+ } else {
+ record, err := s.data.GetById(id)
+ if err != nil {
+ s.log.Error(err)
+ } else {
+ res := app.buildChatCompletionResponse(record.AIMsg)
+ return res, nil
+ }
+ }
+ }
+ }
+
+ client := app.getOpenaiClient()
+ req, tokens, currTokens, currMessage, err := app.buildChatCompletionRequest(in, false)
+ resp, err := client.CreateChatCompletion(ctx, req)
+ if err != nil {
+ s.log.Error(err)
+ return nil, err
+ }
+ res := &proto.ChatCompletionResponse{}
+ bytes, err := json.Marshal(resp)
+ if err != nil {
+ s.log.Error(err)
+ return nil, err
+ }
+ err = jsonpb.UnmarshalString(string(bytes), res)
+ if err != nil {
+ s.log.Error(err)
+ return nil, err
+ }
+ go func() {
+ reqContext := &chat_context.ChatMessage{
+ ID: in.Id,
+ PID: in.Pid,
+ Message: currMessage,
+ Tokens: currTokens,
+ }
+ err := app.saveContext(reqContext)
+ if err != nil {
+ s.log.Error(err)
+ return
+ }
+ resContext := &chat_context.ChatMessage{
+ ID: resp.ID,
+ PID: reqContext.ID,
+ Message: resp.Choices[0].Message,
+ Tokens: resp.Usage.CompletionTokens,
+ }
+ err = app.saveContext(resContext)
+ if err != nil {
+ s.log.Error(err)
+ return
+ }
+ }()
+ go func() {
+ records := &data.ChatRecord{
+ UserMsg: in.Message,
+ UserMsgTokens: currTokens,
+ UserMsgKeywords: keywords,
+ AIMsg: resp.Choices[0].Message.Content,
+ AIMsgTokens: resp.Usage.CompletionTokens,
+ ReqTokens: tokens,
+ CreateAt: time.Now().Unix(),
+ }
+ err := s.data.Add(records)
+ if err != nil {
+ s.log.Error(err)
+ return
+ }
+ //保存到向量数据库
+ if len(keywords) > 0 {
+ list := []*vector_data.ChatRecord{
+ {
+ ID: strconv.FormatInt(records.ID, 10),
+ KVs: map[string]string{
+ "keywords": strings.Join(keywords, ","),
+ },
+ },
+ }
+ err = s.vectorData.UpsertData(context.Background(), list)
+ if err != nil {
+ s.log.Error(err)
+ return
+ }
+ }
+ }()
+ return res, err
+}
+func (s *chatService) ChatCompletionStream(in *proto.ChatCompletionRequest, stream proto.Chat_ChatCompletionStreamServer) error {
+ redisContextCache := chat_context.NewRedisCache()
+ defer redisContextCache.Close()
+
+ app := s.newApp(in, redisContextCache)
+ //敏感词过滤
+ ok, msg, err := app.sensitive(in)
+ if err != nil {
+ s.busMetrics.ErrQuestionsTotalCounter.Inc()
+ s.log.Error(err)
+ return err
+ }
+ if !ok {
+ s.busMetrics.SensitiveQuestionsTotalCounter.Inc()
+ resId := uuid.New().String()
+ startRes := app.buildChatCompletionStreamResponse(resId, "", "")
+ endRes := app.buildChatCompletionStreamResponse(resId, "", "stop")
+ err = stream.Send(startRes)
+ if err != nil {
+ s.log.Error(err)
+ return err
+ }
+ resList := app.buildChatCompletionStreamResponseList(resId, msg)
+ for _, res := range resList {
+ err = stream.Send(res)
+ if err != nil {
+ s.log.Error(err)
+ return err
+ }
+ }
+ err = stream.Send(endRes)
+ if err != nil {
+ s.log.Error(err)
+ return err
+ }
+ return nil
+ }
+
+ //关键词提取
+ keywords := app.keywords(in)
+
+ if len(keywords) > 0 {
+ s.busMetrics.KeywordsQuestionsTotalCounter.Inc()
+ idStr, score, err := s.vectorData.QueryData(context.Background(), map[string][]string{"keywords": {strings.Join(keywords, ",")}})
+ if err != nil {
+ s.log.Error(err)
+ } else if score > 0.99 {
+ id, err := strconv.ParseInt(idStr, 10, 64)
+ if err != nil {
+ s.log.Error(err)
+ } else {
+ record, err := s.data.GetById(id)
+ if err != nil {
+ s.log.Error(err)
+ } else {
+ resId := uuid.New().String()
+ startRes := app.buildChatCompletionStreamResponse(resId, "", "")
+ endRes := app.buildChatCompletionStreamResponse(resId, "", "stop")
+ err = stream.Send(startRes)
+ if err != nil {
+ s.log.Error(err)
+ return err
+ }
+ resList := app.buildChatCompletionStreamResponseList(resId, record.AIMsg)
+ for _, res := range resList {
+ err = stream.Send(res)
+ if err != nil {
+ s.log.Error(err)
+ return err
+ }
+ }
+ err = stream.Send(endRes)
+ if err != nil {
+ s.log.Error(err)
+ return err
+ }
+ return nil
+ }
+ }
+ }
+ }
+
+ client := app.getOpenaiClient()
+ req, tokens, currTokens, currMessage, err := app.buildChatCompletionRequest(in, false)
+ chatStream, err := client.CreateChatCompletionStream(stream.Context(), req)
+ if err != nil {
+ s.busMetrics.ErrQuestionsTotalCounter.Inc()
+ s.log.Error(err)
+ return err
+ }
+ defer chatStream.Close()
+ completionContent := ""
+ resultID := ""
+ for {
+ resp, err := chatStream.Recv()
+ if err != nil && err != io.EOF {
+ s.log.Error(err)
+ return err
+ }
+ if err == io.EOF {
+ break
+ }
+ if resultID == "" {
+ resultID = resp.ID
+ }
+ completionContent += resp.Choices[0].Delta.Content
+ res := &proto.ChatCompletionStreamResponse{}
+ bytes, err := json.Marshal(resp)
+ if err != nil {
+ s.log.Error(err)
+ return err
+ }
+ err = jsonpb.UnmarshalString(string(bytes), res)
+ if err != nil {
+ s.log.Error(err)
+ return err
+ }
+ err = stream.Send(res)
+ if err != nil {
+ s.log.Error(err)
+ return err
+ }
+ }
+ resultMessage := openai.ChatCompletionMessage{
+ Role: openai.ChatMessageRoleAssistant,
+ Content: completionContent,
+ }
+ model := s.config.Chat.Model
+ if in.ChatParam != nil && in.ChatParam.Model != "" {
+ model = in.ChatParam.Model
+ }
+ resultTokens, err := tokenizer.GetTokens(&resultMessage, model)
+ if err != nil {
+ s.busMetrics.ErrQuestionsTotalCounter.Inc()
+ s.log.Error(err)
+ return err
+ }
+
+ go func() {
+ reqContext := &chat_context.ChatMessage{
+ ID: in.Id,
+ PID: in.Pid,
+ Message: currMessage,
+ Tokens: currTokens,
+ }
+ err := app.saveContext(reqContext)
+ if err != nil {
+ s.log.Error(err)
+ return
+ }
+ resContext := &chat_context.ChatMessage{
+ ID: resultID,
+ PID: reqContext.ID,
+ Message: resultMessage,
+ Tokens: resultTokens,
+ }
+ err = app.saveContext(resContext)
+ if err != nil {
+ s.log.Error(err)
+ return
+ }
+ }()
+ go func() {
+ s.busMetrics.QuestionsTotalCounter.Inc()
+ records := &data.ChatRecord{
+ UserMsg: in.Message,
+ UserMsgTokens: currTokens,
+ UserMsgKeywords: keywords,
+ AIMsg: completionContent,
+ AIMsgTokens: resultTokens,
+ ReqTokens: tokens,
+ CreateAt: time.Now().Unix(),
+ }
+ err := s.data.Add(records)
+ if err != nil {
+ s.log.Error(err)
+ return
+ }
+ //保存到向量数据库
+ if len(keywords) > 0 {
+ list := []*vector_data.ChatRecord{
+ {
+ ID: strconv.FormatInt(records.ID, 10),
+ KVs: map[string]string{
+ "keywords": strings.Join(keywords, ","),
+ },
+ },
+ }
+ err = s.vectorData.UpsertData(context.Background(), list)
+ if err != nil {
+ s.log.Error(err)
+ return
+ }
+ }
+ }()
+ return nil
+}
diff --git a/ai-chat-service/chat-server/vector-data/chat_records.go b/ai-chat-service/chat-server/vector-data/chat_records.go
new file mode 100644
index 0000000..2d92274
--- /dev/null
+++ b/ai-chat-service/chat-server/vector-data/chat_records.go
@@ -0,0 +1,69 @@
+package vector_data
+
+import (
+ "ai-chat-service/pkg/config"
+ "context"
+ "github.com/tencent/vectordatabase-sdk-go/tcvectordb"
+)
+
+const CHAT_RECORDS = "chat_records"
+
+type ChatRecord struct {
+ ID string
+ KVs map[string]string
+}
+type IChatRecordsData interface {
+ UpsertData(ctx context.Context, list []*ChatRecord) error
+ QueryData(ctx context.Context, text map[string][]string) (id string, score float32, err error)
+}
+
+type chatRecordsData struct {
+ config *config.Config
+ vectorDB *tcvectordb.Client
+}
+
+func NewChatRecordsData(config *config.Config, vectorDB *tcvectordb.Client) IChatRecordsData {
+ return &chatRecordsData{
+ config: config,
+ vectorDB: vectorDB,
+ }
+}
+func (data *chatRecordsData) UpsertData(ctx context.Context, list []*ChatRecord) error {
+ database := data.config.VectorDB.Database
+ collection := CHAT_RECORDS
+ coll := data.vectorDB.Database(database).Collection(collection)
+ documentList := make([]tcvectordb.Document, 0, len(list))
+ for _, l := range list {
+ doc := tcvectordb.Document{
+ Id: l.ID,
+ }
+ doc.Fields = make(map[string]tcvectordb.Field, len(l.KVs))
+ for k, v := range l.KVs {
+ doc.Fields[k] = tcvectordb.Field{Val: v}
+ }
+ documentList = append(documentList, doc)
+ }
+ _, err := coll.Upsert(ctx, documentList)
+ if err != nil {
+ return err
+ }
+ return nil
+}
+func (data *chatRecordsData) QueryData(ctx context.Context, text map[string][]string) (id string, score float32, err error) {
+ database := data.config.VectorDB.Database
+ collection := CHAT_RECORDS
+ coll := data.vectorDB.Database(database).Collection(collection)
+ result, err := coll.SearchByText(ctx, text, &tcvectordb.SearchDocumentParams{
+ Params: &tcvectordb.SearchDocParams{Ef: 100},
+ Limit: 1,
+ })
+ if err != nil {
+ return "", 0, err
+ }
+ if len(result.Documents) > 0 && len(result.Documents[0]) > 0 {
+ doc := result.Documents[0][0]
+ return doc.Id, doc.Score, nil
+
+ }
+ return "", 0, nil
+}
diff --git a/ai-chat-service/dev.config.yaml b/ai-chat-service/dev.config.yaml
new file mode 100644
index 0000000..59fa902
--- /dev/null
+++ b/ai-chat-service/dev.config.yaml
@@ -0,0 +1,72 @@
+server:
+ ip: 0.0.0.0
+ port: 50055
+ accessToken: "me256487ang1chubdpdialoud22sev1ozhoguumyqca"
+log:
+ # panic,fatal,error,warn,warning,info,debug,trace
+ level: "info"
+ logPath: "runtime/logs/app.log"
+chat:
+ # openai key
+ api_key: "i0jey84SdkFdw5u43780yjr3h7se8nth0yi295nr94ksDngKprEh"
+ # openai 接口地址
+ base_url: "http://localhost:8084/v1"
+ # 使用的训练模型
+ model: "gpt-3.5-turbo"
+ # 单次请求的上下文总长度,包括:请求消息+响应消息
+ max_tokens: 4096
+ # 表示语言模型输出的随机性和创造性
+ # 取值范围 0 ~ 1,值越大随机性越高
+ temperature: 0.8
+ # 用于生成文本时控制选词的随机程度
+ # 即下一个预测单词考虑的概率范围
+ # 取值范围0 ~ 1
+ top_p: 0.9
+ # 存在惩罚,用于生成文本时控制重复使用单词的程度
+ # 取值范围 0 ~ 1 ,0表示不惩罚,1表示禁止重复
+ presence_penalty: 0.8
+ # 用于控制模型生成回复时重复单词出现的频率
+ # 取值范围 0~1,值越大表示回复时会更注重避免使用已经出现的单词
+ frequency_penalty: 0.5
+ # AI助手特征描述
+ bot_desc: "你是一个AI助手,我需要你模拟一名资深的软件工程师来回答我的问题"
+ # 单次请求,保留的响应tokens数量
+ min_response_tokens: 2048
+ # 上下文缓存时长,单位s
+ context_ttl: 1800
+ # 上下文消息条数
+ context_len: 4
+redis:
+ host: "192.168.239.161"
+ port: 6379
+ pwd: "123456"
+mysql:
+ dsn: "root:123456@tcp(192.168.239.161:3306)/ai_chat?collation=utf8mb4_unicode_ci&charset=utf8mb4"
+ maxLifeTime: 3600
+ maxOpenConn: 10
+ maxIdleConn: 10
+dependOn:
+ sensitive:
+ address: "localhost:50053"
+ accessToken: "ang1chubdev1ozhome256487d22sapguuv1ozhom"
+ keywords:
+ address: "localhost:50054"
+ accessToken: "ang1chubdev1ozhome256487d22sapguuv1ozhom"
+ tokenizer:
+ address: "http://192.168.239.161:3002"
+vectorDB:
+ # 访问地址
+ url: "http://lb-4u4r1fk4-1ys6gv3rpmdan420.clb.ap-guangzhou.tencentclb.com:60000"
+ # 用户名
+ username: "root"
+ # 密码
+ pwd: "YaUfVueWZJ20e4ghyLlBT8Dou5OapwpFTUq50oft"
+ database: "ai-chat"
+ # 请求超时时长s
+ timeout: 5
+ # 最大空闲连接数
+ maxIdleConnPerHost: 2
+ # 读一致性: strongConsistency(强一致性),eventualConsistency(最终一致性)
+ readConsistency: "eventualConsistency"
+ # 空闲连接超时时长s
+ idleConnTimeout: 60
\ No newline at end of file
diff --git a/ai-chat-service/go.mod b/ai-chat-service/go.mod
new file mode 100644
index 0000000..48698d9
--- /dev/null
+++ b/ai-chat-service/go.mod
@@ -0,0 +1,56 @@
+module ai-chat-service
+
+go 1.20
+
+require (
+ github.com/go-sql-driver/mysql v1.8.1
+ github.com/golang/protobuf v1.5.4
+ github.com/google/uuid v1.6.0
+ github.com/prometheus/client_golang v1.20.4
+ github.com/redis/go-redis/v9 v9.6.1
+ github.com/sashabaranov/go-openai v1.9.4
+ github.com/sirupsen/logrus v1.9.3
+ github.com/spf13/viper v1.19.0
+ github.com/tencent/vectordatabase-sdk-go v1.3.5
+ google.golang.org/grpc v1.65.0
+ google.golang.org/protobuf v1.34.2
+ gopkg.in/natefinch/lumberjack.v2 v2.2.1
+)
+
+require (
+ filippo.io/edwards25519 v1.1.0 // indirect
+ github.com/beorn7/perks v1.0.1 // indirect
+ github.com/cespare/xxhash/v2 v2.3.0 // indirect
+ github.com/clbanning/mxj v1.8.4 // indirect
+ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
+ github.com/fsnotify/fsnotify v1.7.0 // indirect
+ github.com/google/go-querystring v1.0.0 // indirect
+ github.com/hashicorp/hcl v1.0.0 // indirect
+ github.com/klauspost/compress v1.17.9 // indirect
+ github.com/magiconair/properties v1.8.7 // indirect
+ github.com/mitchellh/mapstructure v1.5.0 // indirect
+ github.com/mozillazg/go-httpheader v0.2.1 // indirect
+ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
+ github.com/pelletier/go-toml/v2 v2.2.2 // indirect
+ github.com/pkg/errors v0.9.1 // indirect
+ github.com/prometheus/client_model v0.6.1 // indirect
+ github.com/prometheus/common v0.55.0 // indirect
+ github.com/prometheus/procfs v0.15.1 // indirect
+ github.com/sagikazarmark/locafero v0.4.0 // indirect
+ github.com/sagikazarmark/slog-shim v0.1.0 // indirect
+ github.com/sourcegraph/conc v0.3.0 // indirect
+ github.com/spf13/afero v1.11.0 // indirect
+ github.com/spf13/cast v1.6.0 // indirect
+ github.com/spf13/pflag v1.0.5 // indirect
+ github.com/subosito/gotenv v1.6.0 // indirect
+ github.com/tencentyun/cos-go-sdk-v5 v0.7.54 // indirect
+ go.uber.org/atomic v1.9.0 // indirect
+ go.uber.org/multierr v1.9.0 // indirect
+ golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
+ golang.org/x/net v0.26.0 // indirect
+ golang.org/x/sys v0.22.0 // indirect
+ golang.org/x/text v0.16.0 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect
+ gopkg.in/ini.v1 v1.67.0 // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
+)
diff --git a/ai-chat-service/go.sum b/ai-chat-service/go.sum
new file mode 100644
index 0000000..34c31d6
--- /dev/null
+++ b/ai-chat-service/go.sum
@@ -0,0 +1,2740 @@
+cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg=
+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 v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
+cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
+cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
+cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
+cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
+cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
+cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
+cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
+cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
+cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
+cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
+cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U=
+cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
+cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
+cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=
+cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA=
+cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=
+cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=
+cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY=
+cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw=
+cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI=
+cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI=
+cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI=
+cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk=
+cloud.google.com/go v0.110.9/go.mod h1:rpxevX/0Lqvlbc88b7Sc1SPNdyK1riNBTUU6JXhYNpM=
+cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic=
+cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU=
+cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4=
+cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4=
+cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=
+cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=
+cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E=
+cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68=
+cloud.google.com/go/accessapproval v1.7.2/go.mod h1:/gShiq9/kK/h8T/eEn1BTzalDvk0mZxJlhfw0p+Xuc0=
+cloud.google.com/go/accessapproval v1.7.3/go.mod h1:4l8+pwIxGTNqSf4T3ds8nLO94NQf0W/KnMNuQ9PbnP8=
+cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc=
+cloud.google.com/go/accessapproval v1.7.5/go.mod h1:g88i1ok5dvQ9XJsxpUInWWvUBrIZhyPDPbk4T01OoJ0=
+cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o=
+cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE=
+cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM=
+cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ=
+cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps=
+cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo=
+cloud.google.com/go/accesscontextmanager v1.8.2/go.mod h1:E6/SCRM30elQJ2PKtFMs2YhfJpZSNcJyejhuzoId4Zk=
+cloud.google.com/go/accesscontextmanager v1.8.3/go.mod h1:4i/JkF2JiFbhLnnpnfoTX5vRXfhf9ukhU1ANOTALTOQ=
+cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M=
+cloud.google.com/go/accesscontextmanager v1.8.5/go.mod h1:TInEhcZ7V9jptGNqN3EzZ5XMhT6ijWxTGjzyETwmL0Q=
+cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=
+cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY=
+cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg=
+cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ=
+cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k=
+cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw=
+cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA=
+cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA=
+cloud.google.com/go/aiplatform v1.50.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4=
+cloud.google.com/go/aiplatform v1.51.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4=
+cloud.google.com/go/aiplatform v1.51.1/go.mod h1:kY3nIMAVQOK2XDqDPHaOuD9e+FdMA6OOpfBjsvaFSOo=
+cloud.google.com/go/aiplatform v1.51.2/go.mod h1:hCqVYB3mY45w99TmetEoe8eCQEwZEp9WHxeZdcv9phw=
+cloud.google.com/go/aiplatform v1.52.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU=
+cloud.google.com/go/aiplatform v1.54.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU=
+cloud.google.com/go/aiplatform v1.57.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU=
+cloud.google.com/go/aiplatform v1.58.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU=
+cloud.google.com/go/aiplatform v1.58.2/go.mod h1:c3kCiVmb6UC1dHAjZjcpDj6ZS0bHQ2slL88ZjC2LtlA=
+cloud.google.com/go/aiplatform v1.60.0/go.mod h1:eTlGuHOahHprZw3Hio5VKmtThIOak5/qy6pzdsqcQnM=
+cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=
+cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4=
+cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M=
+cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE=
+cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE=
+cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo=
+cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo=
+cloud.google.com/go/analytics v0.21.4/go.mod h1:zZgNCxLCy8b2rKKVfC1YkC2vTrpfZmeRCySM3aUbskA=
+cloud.google.com/go/analytics v0.21.5/go.mod h1:BQtOBHWTlJ96axpPPnw5CvGJ6i3Ve/qX2fTxR8qWyr8=
+cloud.google.com/go/analytics v0.21.6/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w=
+cloud.google.com/go/analytics v0.22.0/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w=
+cloud.google.com/go/analytics v0.23.0/go.mod h1:YPd7Bvik3WS95KBok2gPXDqQPHy08TsCQG6CdUCb+u0=
+cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk=
+cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc=
+cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8=
+cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA=
+cloud.google.com/go/apigateway v1.6.2/go.mod h1:CwMC90nnZElorCW63P2pAYm25AtQrHfuOkbRSHj0bT8=
+cloud.google.com/go/apigateway v1.6.3/go.mod h1:k68PXWpEs6BVDTtnLQAyG606Q3mz8pshItwPXjgv44Y=
+cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY=
+cloud.google.com/go/apigateway v1.6.5/go.mod h1:6wCwvYRckRQogyDDltpANi3zsCDl6kWi0b4Je+w2UiI=
+cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc=
+cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04=
+cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8=
+cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs=
+cloud.google.com/go/apigeeconnect v1.6.2/go.mod h1:s6O0CgXT9RgAxlq3DLXvG8riw8PYYbU/v25jqP3Dy18=
+cloud.google.com/go/apigeeconnect v1.6.3/go.mod h1:peG0HFQ0si2bN15M6QSjEW/W7Gy3NYkWGz7pFz13cbo=
+cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0=
+cloud.google.com/go/apigeeconnect v1.6.5/go.mod h1:MEKm3AiT7s11PqTfKE3KZluZA9O91FNysvd3E6SJ6Ow=
+cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY=
+cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM=
+cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc=
+cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw=
+cloud.google.com/go/apigeeregistry v0.7.2/go.mod h1:9CA2B2+TGsPKtfi3F7/1ncCCsL62NXBRfM6iPoGSM+8=
+cloud.google.com/go/apigeeregistry v0.8.1/go.mod h1:MW4ig1N4JZQsXmBSwH4rwpgDonocz7FPBSw6XPGHmYw=
+cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8=
+cloud.google.com/go/apigeeregistry v0.8.3/go.mod h1:aInOWnqF4yMQx8kTjDqHNXjZGh/mxeNlAf52YqtASUs=
+cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU=
+cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI=
+cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8=
+cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno=
+cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak=
+cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84=
+cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A=
+cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E=
+cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY=
+cloud.google.com/go/appengine v1.8.2/go.mod h1:WMeJV9oZ51pvclqFN2PqHoGnys7rK0rz6s3Mp6yMvDo=
+cloud.google.com/go/appengine v1.8.3/go.mod h1:2oUPZ1LVZ5EXi+AF1ihNAF+S8JrzQ3till5m9VQkrsk=
+cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg=
+cloud.google.com/go/appengine v1.8.5/go.mod h1:uHBgNoGLTS5di7BvU25NFDuKa82v0qQLjyMJLuPQrVo=
+cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4=
+cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0=
+cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY=
+cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k=
+cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg=
+cloud.google.com/go/area120 v0.8.2/go.mod h1:a5qfo+x77SRLXnCynFWPUZhnZGeSgvQ+Y0v1kSItkh4=
+cloud.google.com/go/area120 v0.8.3/go.mod h1:5zj6pMzVTH+SVHljdSKC35sriR/CVvQZzG/Icdyriw0=
+cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M=
+cloud.google.com/go/area120 v0.8.5/go.mod h1:BcoFCbDLZjsfe4EkCnEq1LKvHSK0Ew/zk5UFu6GMyA0=
+cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ=
+cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk=
+cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0=
+cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc=
+cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI=
+cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ=
+cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI=
+cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08=
+cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E=
+cloud.google.com/go/artifactregistry v1.14.2/go.mod h1:Xk+QbsKEb0ElmyeMfdHAey41B+qBq3q5R5f5xD4XT3U=
+cloud.google.com/go/artifactregistry v1.14.3/go.mod h1:A2/E9GXnsyXl7GUvQ/2CjHA+mVRoWAXC0brg2os+kNI=
+cloud.google.com/go/artifactregistry v1.14.4/go.mod h1:SJJcZTMv6ce0LDMUnihCN7WSrI+kBSFV0KIKo8S8aYU=
+cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE=
+cloud.google.com/go/artifactregistry v1.14.7/go.mod h1:0AUKhzWQzfmeTvT4SjfI4zjot72EMfrkvL9g9aRjnnM=
+cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o=
+cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s=
+cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0=
+cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ=
+cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY=
+cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo=
+cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg=
+cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw=
+cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ=
+cloud.google.com/go/asset v1.15.0/go.mod h1:tpKafV6mEut3+vN9ScGvCHXHj7FALFVta+okxFECHcg=
+cloud.google.com/go/asset v1.15.1/go.mod h1:yX/amTvFWRpp5rcFq6XbCxzKT8RJUam1UoboE179jU4=
+cloud.google.com/go/asset v1.15.2/go.mod h1:B6H5tclkXvXz7PD22qCA2TDxSVQfasa3iDlM89O2NXs=
+cloud.google.com/go/asset v1.15.3/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU=
+cloud.google.com/go/asset v1.16.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU=
+cloud.google.com/go/asset v1.17.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU=
+cloud.google.com/go/asset v1.17.1/go.mod h1:byvDw36UME5AzGNK7o4JnOnINkwOZ1yRrGrKIahHrng=
+cloud.google.com/go/asset v1.17.2/go.mod h1:SVbzde67ehddSoKf5uebOD1sYw8Ab/jD/9EIeWg99q4=
+cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY=
+cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw=
+cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI=
+cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo=
+cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0=
+cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E=
+cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0=
+cloud.google.com/go/assuredworkloads v1.11.2/go.mod h1:O1dfr+oZJMlE6mw0Bp0P1KZSlj5SghMBvTpZqIcUAW4=
+cloud.google.com/go/assuredworkloads v1.11.3/go.mod h1:vEjfTKYyRUaIeA0bsGJceFV2JKpVRgyG2op3jfa59Zs=
+cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U=
+cloud.google.com/go/assuredworkloads v1.11.5/go.mod h1:FKJ3g3ZvkL2D7qtqIGnDufFkHxwIpNM9vtmhvt+6wqk=
+cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0=
+cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8=
+cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8=
+cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM=
+cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU=
+cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE=
+cloud.google.com/go/automl v1.13.2/go.mod h1:gNY/fUmDEN40sP8amAX3MaXkxcqPIn7F1UIIPZpy4Mg=
+cloud.google.com/go/automl v1.13.3/go.mod h1:Y8KwvyAZFOsMAPqUCfNu1AyclbC6ivCUF/MTwORymyY=
+cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8=
+cloud.google.com/go/automl v1.13.5/go.mod h1:MDw3vLem3yh+SvmSgeYUmUKqyls6NzSumDm9OJ3xJ1Y=
+cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc=
+cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI=
+cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss=
+cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA=
+cloud.google.com/go/baremetalsolution v1.2.0/go.mod h1:68wi9AwPYkEWIUT4SvSGS9UJwKzNpshjHsH4lzk8iOw=
+cloud.google.com/go/baremetalsolution v1.2.1/go.mod h1:3qKpKIw12RPXStwQXcbhfxVj1dqQGEvcmA+SX/mUR88=
+cloud.google.com/go/baremetalsolution v1.2.2/go.mod h1:O5V6Uu1vzVelYahKfwEWRMaS3AbCkeYHy3145s1FkhM=
+cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g=
+cloud.google.com/go/baremetalsolution v1.2.4/go.mod h1:BHCmxgpevw9IEryE99HbYEfxXkAEA3hkMJbYYsHtIuY=
+cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE=
+cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE=
+cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g=
+cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A=
+cloud.google.com/go/batch v1.4.1/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk=
+cloud.google.com/go/batch v1.5.0/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk=
+cloud.google.com/go/batch v1.5.1/go.mod h1:RpBuIYLkQu8+CWDk3dFD/t/jOCGuUpkpX+Y0n1Xccs8=
+cloud.google.com/go/batch v1.6.1/go.mod h1:urdpD13zPe6YOK+6iZs/8/x2VBRofvblLpx0t57vM98=
+cloud.google.com/go/batch v1.6.3/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU=
+cloud.google.com/go/batch v1.7.0/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU=
+cloud.google.com/go/batch v1.8.0/go.mod h1:k8V7f6VE2Suc0zUM4WtoibNrA6D3dqBpB+++e3vSGYc=
+cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4=
+cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8=
+cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM=
+cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU=
+cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4=
+cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4=
+cloud.google.com/go/beyondcorp v1.0.1/go.mod h1:zl/rWWAFVeV+kx+X2Javly7o1EIQThU4WlkynffL/lk=
+cloud.google.com/go/beyondcorp v1.0.2/go.mod h1:m8cpG7caD+5su+1eZr+TSvF6r21NdLJk4f9u4SP2Ntc=
+cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo=
+cloud.google.com/go/beyondcorp v1.0.4/go.mod h1:Gx8/Rk2MxrvWfn4WIhHIG1NV7IBfg14pTKv1+EArVcc=
+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/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA=
+cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw=
+cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc=
+cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E=
+cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac=
+cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q=
+cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU=
+cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4=
+cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4=
+cloud.google.com/go/bigquery v1.55.0/go.mod h1:9Y5I3PN9kQWuid6183JFhOGOW3GcirA5LpsKCUn+2ec=
+cloud.google.com/go/bigquery v1.56.0/go.mod h1:KDcsploXTEY7XT3fDQzMUZlpQLHzE4itubHrnmhUrZA=
+cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug=
+cloud.google.com/go/bigquery v1.58.0/go.mod h1:0eh4mWNY0KrBTjUzLjoYImapGORq9gEPT7MWjCy9lik=
+cloud.google.com/go/bigquery v1.59.1/go.mod h1:VP1UJYgevyTwsV7desjzNzDND5p6hZB+Z8gZJN1GQUc=
+cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY=
+cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s=
+cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI=
+cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y=
+cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss=
+cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc=
+cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA=
+cloud.google.com/go/billing v1.17.0/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64=
+cloud.google.com/go/billing v1.17.1/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64=
+cloud.google.com/go/billing v1.17.2/go.mod h1:u/AdV/3wr3xoRBk5xvUzYMS1IawOAPwQMuHgHMdljDg=
+cloud.google.com/go/billing v1.17.3/go.mod h1:z83AkoZ7mZwBGT3yTnt6rSGI1OOsHSIi6a5M3mJ8NaU=
+cloud.google.com/go/billing v1.17.4/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk=
+cloud.google.com/go/billing v1.18.0/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk=
+cloud.google.com/go/billing v1.18.2/go.mod h1:PPIwVsOOQ7xzbADCwNe8nvK776QpfrOAUkvKjCUcpSE=
+cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM=
+cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI=
+cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0=
+cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk=
+cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q=
+cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U=
+cloud.google.com/go/binaryauthorization v1.7.0/go.mod h1:Zn+S6QqTMn6odcMU1zDZCJxPjU2tZPV1oDl45lWY154=
+cloud.google.com/go/binaryauthorization v1.7.1/go.mod h1:GTAyfRWYgcbsP3NJogpV3yeunbUIjx2T9xVeYovtURE=
+cloud.google.com/go/binaryauthorization v1.7.2/go.mod h1:kFK5fQtxEp97m92ziy+hbu+uKocka1qRRL8MVJIgjv0=
+cloud.google.com/go/binaryauthorization v1.7.3/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU=
+cloud.google.com/go/binaryauthorization v1.8.0/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU=
+cloud.google.com/go/binaryauthorization v1.8.1/go.mod h1:1HVRyBerREA/nhI7yLang4Zn7vfNVA3okoAR9qYQJAQ=
+cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg=
+cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590=
+cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8=
+cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI=
+cloud.google.com/go/certificatemanager v1.7.2/go.mod h1:15SYTDQMd00kdoW0+XY5d9e+JbOPjp24AvF48D8BbcQ=
+cloud.google.com/go/certificatemanager v1.7.3/go.mod h1:T/sZYuC30PTag0TLo28VedIRIj1KPGcOQzjWAptHa00=
+cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE=
+cloud.google.com/go/certificatemanager v1.7.5/go.mod h1:uX+v7kWqy0Y3NG/ZhNvffh0kuqkKZIXdvlZRO7z0VtM=
+cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk=
+cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk=
+cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE=
+cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU=
+cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc=
+cloud.google.com/go/channel v1.17.0/go.mod h1:RpbhJsGi/lXWAUM1eF4IbQGbsfVlg2o8Iiy2/YLfVT0=
+cloud.google.com/go/channel v1.17.1/go.mod h1:xqfzcOZAcP4b/hUDH0GkGg1Sd5to6di1HOJn/pi5uBQ=
+cloud.google.com/go/channel v1.17.2/go.mod h1:aT2LhnftnyfQceFql5I/mP8mIbiiJS4lWqgXA815zMk=
+cloud.google.com/go/channel v1.17.3/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE=
+cloud.google.com/go/channel v1.17.4/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE=
+cloud.google.com/go/channel v1.17.5/go.mod h1:FlpaOSINDAXgEext0KMaBq/vwpLMkkPAw9b2mApQeHc=
+cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U=
+cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA=
+cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M=
+cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg=
+cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s=
+cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU=
+cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU=
+cloud.google.com/go/cloudbuild v1.14.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU=
+cloud.google.com/go/cloudbuild v1.14.1/go.mod h1:K7wGc/3zfvmYWOWwYTgF/d/UVJhS4pu+HAy7PL7mCsU=
+cloud.google.com/go/cloudbuild v1.14.2/go.mod h1:Bn6RO0mBYk8Vlrt+8NLrru7WXlQ9/RDWz2uo5KG1/sg=
+cloud.google.com/go/cloudbuild v1.14.3/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM=
+cloud.google.com/go/cloudbuild v1.15.0/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM=
+cloud.google.com/go/cloudbuild v1.15.1/go.mod h1:gIofXZSu+XD2Uy+qkOrGKEx45zd7s28u/k8f99qKals=
+cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM=
+cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk=
+cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA=
+cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI=
+cloud.google.com/go/clouddms v1.7.0/go.mod h1:MW1dC6SOtI/tPNCciTsXtsGNEM0i0OccykPvv3hiYeM=
+cloud.google.com/go/clouddms v1.7.1/go.mod h1:o4SR8U95+P7gZ/TX+YbJxehOCsM+fe6/brlrFquiszk=
+cloud.google.com/go/clouddms v1.7.2/go.mod h1:Rk32TmWmHo64XqDvW7jgkFQet1tUKNVzs7oajtJT3jU=
+cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc=
+cloud.google.com/go/clouddms v1.7.4/go.mod h1:RdrVqoFG9RWI5AvZ81SxJ/xvxPdtcRhFotwdE79DieY=
+cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY=
+cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI=
+cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4=
+cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI=
+cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y=
+cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs=
+cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM=
+cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM=
+cloud.google.com/go/cloudtasks v1.12.2/go.mod h1:A7nYkjNlW2gUoROg1kvJrQGhJP/38UaWwsnuBDOBVUk=
+cloud.google.com/go/cloudtasks v1.12.3/go.mod h1:GPVXhIOSGEaR+3xT4Fp72ScI+HjHffSS4B8+BaBB5Ys=
+cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0=
+cloud.google.com/go/cloudtasks v1.12.6/go.mod h1:b7c7fe4+TJsFZfDyzO51F7cjq7HLUlRi/KZQLQjDsaY=
+cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
+cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
+cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
+cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
+cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
+cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
+cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU=
+cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=
+cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=
+cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE=
+cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo=
+cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA=
+cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs=
+cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU=
+cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE=
+cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI=
+cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM=
+cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM=
+cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM=
+cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78=
+cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns=
+cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI=
+cloud.google.com/go/compute v1.23.4/go.mod h1:/EJMj55asU6kAFnuZET8zqgwgJ9FvXWXOkkfQZa4ioI=
+cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40=
+cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls=
+cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU=
+cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
+cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
+cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
+cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
+cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY=
+cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck=
+cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w=
+cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM=
+cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM=
+cloud.google.com/go/contactcenterinsights v1.11.0/go.mod h1:hutBdImE4XNZ1NV4vbPJKSFOnQruhC5Lj9bZqWMTKiU=
+cloud.google.com/go/contactcenterinsights v1.11.1/go.mod h1:FeNP3Kg8iteKM80lMwSk3zZZKVxr+PGnAId6soKuXwE=
+cloud.google.com/go/contactcenterinsights v1.11.2/go.mod h1:A9PIR5ov5cRcd28KlDbmmXE8Aay+Gccer2h4wzkYFso=
+cloud.google.com/go/contactcenterinsights v1.11.3/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis=
+cloud.google.com/go/contactcenterinsights v1.12.0/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis=
+cloud.google.com/go/contactcenterinsights v1.12.1/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis=
+cloud.google.com/go/contactcenterinsights v1.13.0/go.mod h1:ieq5d5EtHsu8vhe2y3amtZ+BE+AQwX5qAy7cpo0POsI=
+cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg=
+cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo=
+cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4=
+cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM=
+cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA=
+cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4=
+cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4=
+cloud.google.com/go/container v1.26.0/go.mod h1:YJCmRet6+6jnYYRS000T6k0D0xUXQgBSaJ7VwI8FBj4=
+cloud.google.com/go/container v1.26.1/go.mod h1:5smONjPRUxeEpDG7bMKWfDL4sauswqEtnBK1/KKpR04=
+cloud.google.com/go/container v1.26.2/go.mod h1:YlO84xCt5xupVbLaMY4s3XNE79MUJ+49VmkInr6HvF4=
+cloud.google.com/go/container v1.27.1/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4=
+cloud.google.com/go/container v1.28.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4=
+cloud.google.com/go/container v1.29.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4=
+cloud.google.com/go/container v1.30.1/go.mod h1:vkbfX0EnAKL/vgVECs5BZn24e1cJROzgszJirRKQ4Bg=
+cloud.google.com/go/container v1.31.0/go.mod h1:7yABn5s3Iv3lmw7oMmyGbeV6tQj86njcTijkkGuvdZA=
+cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=
+cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4=
+cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI=
+cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s=
+cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0=
+cloud.google.com/go/containeranalysis v0.11.0/go.mod h1:4n2e99ZwpGxpNcz+YsFT1dfOHPQFGcAC8FN2M2/ne/U=
+cloud.google.com/go/containeranalysis v0.11.1/go.mod h1:rYlUOM7nem1OJMKwE1SadufX0JP3wnXj844EtZAwWLY=
+cloud.google.com/go/containeranalysis v0.11.2/go.mod h1:xibioGBC1MD2j4reTyV1xY1/MvKaz+fyM9ENWhmIeP8=
+cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U=
+cloud.google.com/go/containeranalysis v0.11.4/go.mod h1:cVZT7rXYBS9NG1rhQbWL9pWbXCKHWJPYraE8/FTSYPE=
+cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0=
+cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs=
+cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc=
+cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE=
+cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM=
+cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M=
+cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0=
+cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8=
+cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E=
+cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4=
+cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4=
+cloud.google.com/go/datacatalog v1.17.1/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE=
+cloud.google.com/go/datacatalog v1.18.0/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE=
+cloud.google.com/go/datacatalog v1.18.1/go.mod h1:TzAWaz+ON1tkNr4MOcak8EBHX7wIRX/gZKM+yTVsv+A=
+cloud.google.com/go/datacatalog v1.18.2/go.mod h1:SPVgWW2WEMuWHA+fHodYjmxPiMqcOiWfhc9OD5msigk=
+cloud.google.com/go/datacatalog v1.18.3/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM=
+cloud.google.com/go/datacatalog v1.19.0/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM=
+cloud.google.com/go/datacatalog v1.19.2/go.mod h1:2YbODwmhpLM4lOFe3PuEhHK9EyTzQJ5AXgIy7EDKTEE=
+cloud.google.com/go/datacatalog v1.19.3/go.mod h1:ra8V3UAsciBpJKQ+z9Whkxzxv7jmQg1hfODr3N3YPJ4=
+cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM=
+cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ=
+cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE=
+cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw=
+cloud.google.com/go/dataflow v0.9.2/go.mod h1:vBfdBZ/ejlTaYIGB3zB4T08UshH70vbtZeMD+urnUSo=
+cloud.google.com/go/dataflow v0.9.3/go.mod h1:HI4kMVjcHGTs3jTHW/kv3501YW+eloiJSLxkJa/vqFE=
+cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w=
+cloud.google.com/go/dataflow v0.9.5/go.mod h1:udl6oi8pfUHnL0z6UN9Lf9chGqzDMVqcYTcZ1aPnCZQ=
+cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo=
+cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE=
+cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0=
+cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA=
+cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE=
+cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M=
+cloud.google.com/go/dataform v0.8.2/go.mod h1:X9RIqDs6NbGPLR80tnYoPNiO1w0wenKTb8PxxlhTMKM=
+cloud.google.com/go/dataform v0.8.3/go.mod h1:8nI/tvv5Fso0drO3pEjtowz58lodx8MVkdV2q0aPlqg=
+cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs=
+cloud.google.com/go/dataform v0.9.2/go.mod h1:S8cQUwPNWXo7m/g3DhWHsLBoufRNn9EgFrMgne2j7cI=
+cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38=
+cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w=
+cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8=
+cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI=
+cloud.google.com/go/datafusion v1.7.2/go.mod h1:62K2NEC6DRlpNmI43WHMWf9Vg/YvN6QVi8EVwifElI0=
+cloud.google.com/go/datafusion v1.7.3/go.mod h1:eoLt1uFXKGBq48jy9LZ+Is8EAVLnmn50lNncLzwYokE=
+cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM=
+cloud.google.com/go/datafusion v1.7.5/go.mod h1:bYH53Oa5UiqahfbNK9YuYKteeD4RbQSNMx7JF7peGHc=
+cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I=
+cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ=
+cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM=
+cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY=
+cloud.google.com/go/datalabeling v0.8.2/go.mod h1:cyDvGHuJWu9U/cLDA7d8sb9a0tWLEletStu2sTmg3BE=
+cloud.google.com/go/datalabeling v0.8.3/go.mod h1:tvPhpGyS/V7lqjmb3V0TaDdGvhzgR1JoW7G2bpi2UTI=
+cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8=
+cloud.google.com/go/datalabeling v0.8.5/go.mod h1:IABB2lxQnkdUbMnQaOl2prCOfms20mcPxDBm36lps+s=
+cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA=
+cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A=
+cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ=
+cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs=
+cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE=
+cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE=
+cloud.google.com/go/dataplex v1.9.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE=
+cloud.google.com/go/dataplex v1.10.1/go.mod h1:1MzmBv8FvjYfc7vDdxhnLFNskikkB+3vl475/XdCDhs=
+cloud.google.com/go/dataplex v1.10.2/go.mod h1:xdC8URdTrCrZMW6keY779ZT1cTOfV8KEPNsw+LTRT1Y=
+cloud.google.com/go/dataplex v1.11.1/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c=
+cloud.google.com/go/dataplex v1.11.2/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c=
+cloud.google.com/go/dataplex v1.13.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c=
+cloud.google.com/go/dataplex v1.14.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c=
+cloud.google.com/go/dataplex v1.14.1/go.mod h1:bWxQAbg6Smg+sca2+Ex7s8D9a5qU6xfXtwmq4BVReps=
+cloud.google.com/go/dataplex v1.14.2/go.mod h1:0oGOSFlEKef1cQeAHXy4GZPB/Ife0fz/PxBf+ZymA2U=
+cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s=
+cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI=
+cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4=
+cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4=
+cloud.google.com/go/dataproc/v2 v2.2.0/go.mod h1:lZR7AQtwZPvmINx5J87DSOOpTfof9LVZju6/Qo4lmcY=
+cloud.google.com/go/dataproc/v2 v2.2.1/go.mod h1:QdAJLaBjh+l4PVlVZcmrmhGccosY/omC1qwfQ61Zv/o=
+cloud.google.com/go/dataproc/v2 v2.2.2/go.mod h1:aocQywVmQVF4i8CL740rNI/ZRpsaaC1Wh2++BJ7HEJ4=
+cloud.google.com/go/dataproc/v2 v2.2.3/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY=
+cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY=
+cloud.google.com/go/dataproc/v2 v2.4.0/go.mod h1:3B1Ht2aRB8VZIteGxQS/iNSJGzt9+CA0WGnDVMEm7Z4=
+cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo=
+cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA=
+cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c=
+cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8=
+cloud.google.com/go/dataqna v0.8.2/go.mod h1:KNEqgx8TTmUipnQsScOoDpq/VlXVptUqVMZnt30WAPs=
+cloud.google.com/go/dataqna v0.8.3/go.mod h1:wXNBW2uvc9e7Gl5k8adyAMnLush1KVV6lZUhB+rqNu4=
+cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c=
+cloud.google.com/go/dataqna v0.8.5/go.mod h1:vgihg1mz6n7pb5q2YJF7KlXve6tCglInd6XO0JGOlWM=
+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/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM=
+cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c=
+cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70=
+cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70=
+cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70=
+cloud.google.com/go/datastore v1.14.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8=
+cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8=
+cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo=
+cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ=
+cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g=
+cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4=
+cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs=
+cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww=
+cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q=
+cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q=
+cloud.google.com/go/datastream v1.10.1/go.mod h1:7ngSYwnw95YFyTd5tOGBxHlOZiL+OtpjheqU7t2/s/c=
+cloud.google.com/go/datastream v1.10.2/go.mod h1:W42TFgKAs/om6x/CdXX5E4oiAsKlH+e8MTGy81zdYt0=
+cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA=
+cloud.google.com/go/datastream v1.10.4/go.mod h1:7kRxPdxZxhPg3MFeCSulmAJnil8NJGGvSNdn4p1sRZo=
+cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c=
+cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s=
+cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI=
+cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ=
+cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g=
+cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g=
+cloud.google.com/go/deploy v1.13.1/go.mod h1:8jeadyLkH9qu9xgO3hVWw8jVr29N1mnW42gRJT8GY6g=
+cloud.google.com/go/deploy v1.14.1/go.mod h1:N8S0b+aIHSEeSr5ORVoC0+/mOPUysVt8ae4QkZYolAw=
+cloud.google.com/go/deploy v1.14.2/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g=
+cloud.google.com/go/deploy v1.15.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g=
+cloud.google.com/go/deploy v1.16.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g=
+cloud.google.com/go/deploy v1.17.0/go.mod h1:XBr42U5jIr64t92gcpOXxNrqL2PStQCXHuKK5GRUuYo=
+cloud.google.com/go/deploy v1.17.1/go.mod h1:SXQyfsXrk0fBmgBHRzBjQbZhMfKZ3hMQBw5ym7MN/50=
+cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4=
+cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0=
+cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8=
+cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek=
+cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0=
+cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM=
+cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4=
+cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE=
+cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4=
+cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4=
+cloud.google.com/go/dialogflow v1.43.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M=
+cloud.google.com/go/dialogflow v1.44.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M=
+cloud.google.com/go/dialogflow v1.44.1/go.mod h1:n/h+/N2ouKOO+rbe/ZnI186xImpqvCVj2DdsWS/0EAk=
+cloud.google.com/go/dialogflow v1.44.2/go.mod h1:QzFYndeJhpVPElnFkUXxdlptx0wPnBWLCBT9BvtC3/c=
+cloud.google.com/go/dialogflow v1.44.3/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ=
+cloud.google.com/go/dialogflow v1.47.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ=
+cloud.google.com/go/dialogflow v1.48.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ=
+cloud.google.com/go/dialogflow v1.48.1/go.mod h1:C1sjs2/g9cEwjCltkKeYp3FFpz8BOzNondEaAlCpt+A=
+cloud.google.com/go/dialogflow v1.48.2/go.mod h1:7A2oDf6JJ1/+hdpnFRfb/RjJUOh2X3rhIa5P8wQSEX4=
+cloud.google.com/go/dialogflow v1.49.0/go.mod h1:dhVrXKETtdPlpPhE7+2/k4Z8FRNUp6kMV3EW3oz/fe0=
+cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM=
+cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q=
+cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4=
+cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI=
+cloud.google.com/go/dlp v1.10.2/go.mod h1:ZbdKIhcnyhILgccwVDzkwqybthh7+MplGC3kZVZsIOQ=
+cloud.google.com/go/dlp v1.10.3/go.mod h1:iUaTc/ln8I+QT6Ai5vmuwfw8fqTk2kaz0FvCwhLCom0=
+cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI=
+cloud.google.com/go/dlp v1.11.2/go.mod h1:9Czi+8Y/FegpWzgSfkRlyz+jwW6Te9Rv26P3UfU/h/w=
+cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU=
+cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU=
+cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k=
+cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4=
+cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM=
+cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs=
+cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E=
+cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E=
+cloud.google.com/go/documentai v1.22.1/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc=
+cloud.google.com/go/documentai v1.23.0/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc=
+cloud.google.com/go/documentai v1.23.2/go.mod h1:Q/wcRT+qnuXOpjAkvOV4A+IeQl04q2/ReT7SSbytLSo=
+cloud.google.com/go/documentai v1.23.4/go.mod h1:4MYAaEMnADPN1LPN5xboDR5QVB6AgsaxgFdJhitlE2Y=
+cloud.google.com/go/documentai v1.23.5/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g=
+cloud.google.com/go/documentai v1.23.6/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g=
+cloud.google.com/go/documentai v1.23.7/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g=
+cloud.google.com/go/documentai v1.23.8/go.mod h1:Vd/y5PosxCpUHmwC+v9arZyeMfTqBR9VIwOwIqQYYfA=
+cloud.google.com/go/documentai v1.25.0/go.mod h1:ftLnzw5VcXkLItp6pw1mFic91tMRyfv6hHEY5br4KzY=
+cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y=
+cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg=
+cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE=
+cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE=
+cloud.google.com/go/domains v0.9.2/go.mod h1:3YvXGYzZG1Temjbk7EyGCuGGiXHJwVNmwIf+E/cUp5I=
+cloud.google.com/go/domains v0.9.3/go.mod h1:29k66YNDLDY9LCFKpGFeh6Nj9r62ZKm5EsUJxAl84KU=
+cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY=
+cloud.google.com/go/domains v0.9.5/go.mod h1:dBzlxgepazdFhvG7u23XMhmMKBjrkoUNaw0A8AQB55Y=
+cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk=
+cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w=
+cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc=
+cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY=
+cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk=
+cloud.google.com/go/edgecontainer v1.1.2/go.mod h1:wQRjIzqxEs9e9wrtle4hQPSR1Y51kqN75dgF7UllZZ4=
+cloud.google.com/go/edgecontainer v1.1.3/go.mod h1:Ll2DtIABzEfaxaVSbwj3QHFaOOovlDFiWVDu349jSsA=
+cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE=
+cloud.google.com/go/edgecontainer v1.1.5/go.mod h1:rgcjrba3DEDEQAidT4yuzaKWTbkTI5zAMu3yy6ZWS0M=
+cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU=
+cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI=
+cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8=
+cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M=
+cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4=
+cloud.google.com/go/essentialcontacts v1.6.3/go.mod h1:yiPCD7f2TkP82oJEFXFTou8Jl8L6LBRPeBEkTaO0Ggo=
+cloud.google.com/go/essentialcontacts v1.6.4/go.mod h1:iju5Vy3d9tJUg0PYMd1nHhjV7xoCXaOAVabrwLaPBEM=
+cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM=
+cloud.google.com/go/essentialcontacts v1.6.6/go.mod h1:XbqHJGaiH0v2UvtuucfOzFXN+rpL/aU5BCZLn4DYl1Q=
+cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc=
+cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw=
+cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw=
+cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY=
+cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI=
+cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI=
+cloud.google.com/go/eventarc v1.13.1/go.mod h1:EqBxmGHFrruIara4FUQ3RHlgfCn7yo1HYsu2Hpt/C3Y=
+cloud.google.com/go/eventarc v1.13.2/go.mod h1:X9A80ShVu19fb4e5sc/OLV7mpFUKZMwfJFeeWhcIObM=
+cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg=
+cloud.google.com/go/eventarc v1.13.4/go.mod h1:zV5sFVoAa9orc/52Q+OuYUG9xL2IIZTbbuTHC6JSY8s=
+cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w=
+cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI=
+cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs=
+cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg=
+cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4=
+cloud.google.com/go/filestore v1.7.2/go.mod h1:TYOlyJs25f/omgj+vY7/tIG/E7BX369triSPzE4LdgE=
+cloud.google.com/go/filestore v1.7.3/go.mod h1:Qp8WaEERR3cSkxToxFPHh/b8AACkSut+4qlCjAmKTV0=
+cloud.google.com/go/filestore v1.7.4/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI=
+cloud.google.com/go/filestore v1.8.0/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI=
+cloud.google.com/go/filestore v1.8.1/go.mod h1:MbN9KcaM47DRTIuLfQhJEsjaocVebNtNQhSLhKCF5GM=
+cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE=
+cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4=
+cloud.google.com/go/firestore v1.12.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4=
+cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8=
+cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ=
+cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk=
+cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg=
+cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY=
+cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08=
+cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw=
+cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA=
+cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c=
+cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE=
+cloud.google.com/go/functions v1.15.2/go.mod h1:CHAjtcR6OU4XF2HuiVeriEdELNcnvRZSk1Q8RMqy4lE=
+cloud.google.com/go/functions v1.15.3/go.mod h1:r/AMHwBheapkkySEhiZYLDBwVJCdlRwsm4ieJu35/Ug=
+cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I=
+cloud.google.com/go/functions v1.16.0/go.mod h1:nbNpfAG7SG7Duw/o1iZ6ohvL7mc6MapWQVpqtM29n8k=
+cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM=
+cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA=
+cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w=
+cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM=
+cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0=
+cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s=
+cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60=
+cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo=
+cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg=
+cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU=
+cloud.google.com/go/gkebackup v1.3.1/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU=
+cloud.google.com/go/gkebackup v1.3.2/go.mod h1:OMZbXzEJloyXMC7gqdSB+EOEQ1AKcpGYvO3s1ec5ixk=
+cloud.google.com/go/gkebackup v1.3.3/go.mod h1:eMk7/wVV5P22KBakhQnJxWSVftL1p4VBFLpv0kIft7I=
+cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI=
+cloud.google.com/go/gkebackup v1.3.5/go.mod h1:KJ77KkNN7Wm1LdMopOelV6OodM01pMuK2/5Zt1t4Tvc=
+cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o=
+cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A=
+cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw=
+cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw=
+cloud.google.com/go/gkeconnect v0.8.2/go.mod h1:6nAVhwchBJYgQCXD2pHBFQNiJNyAd/wyxljpaa6ZPrY=
+cloud.google.com/go/gkeconnect v0.8.3/go.mod h1:i9GDTrfzBSUZGCe98qSu1B8YB8qfapT57PenIb820Jo=
+cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw=
+cloud.google.com/go/gkeconnect v0.8.5/go.mod h1:LC/rS7+CuJ5fgIbXv8tCD/mdfnlAadTaUufgOkmijuk=
+cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0=
+cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0=
+cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E=
+cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw=
+cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY=
+cloud.google.com/go/gkehub v0.14.2/go.mod h1:iyjYH23XzAxSdhrbmfoQdePnlMj2EWcvnR+tHdBQsCY=
+cloud.google.com/go/gkehub v0.14.3/go.mod h1:jAl6WafkHHW18qgq7kqcrXYzN08hXeK/Va3utN8VKg8=
+cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc=
+cloud.google.com/go/gkehub v0.14.5/go.mod h1:6bzqxM+a+vEH/h8W8ec4OJl4r36laxTs3A/fMNHJ0wA=
+cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA=
+cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI=
+cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y=
+cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw=
+cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw=
+cloud.google.com/go/gkemulticloud v1.0.1/go.mod h1:AcrGoin6VLKT/fwZEYuqvVominLriQBCKmbjtnbMjG8=
+cloud.google.com/go/gkemulticloud v1.0.2/go.mod h1:+ee5VXxKb3H1l4LZAcgWB/rvI16VTNTrInWxDjAGsGo=
+cloud.google.com/go/gkemulticloud v1.0.3/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0=
+cloud.google.com/go/gkemulticloud v1.1.0/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0=
+cloud.google.com/go/gkemulticloud v1.1.1/go.mod h1:C+a4vcHlWeEIf45IB5FFR5XGjTeYhF83+AYIpTy4i2Q=
+cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=
+cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8=
+cloud.google.com/go/grafeas v0.3.4/go.mod h1:A5m316hcG+AulafjAbPKXBO/+I5itU4LOdKO2R/uDIc=
+cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM=
+cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o=
+cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo=
+cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY=
+cloud.google.com/go/gsuiteaddons v1.6.2/go.mod h1:K65m9XSgs8hTF3X9nNTPi8IQueljSdYo9F+Mi+s4MyU=
+cloud.google.com/go/gsuiteaddons v1.6.3/go.mod h1:sCFJkZoMrLZT3JTb8uJqgKPNshH2tfXeCwTFRebTq48=
+cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE=
+cloud.google.com/go/gsuiteaddons v1.6.5/go.mod h1:Lo4P2IvO8uZ9W+RaC6s1JVxo42vgy+TX5a6hfBZ0ubs=
+cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c=
+cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
+cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=
+cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc=
+cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg=
+cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE=
+cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY=
+cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY=
+cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0=
+cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8=
+cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk=
+cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU=
+cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU=
+cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE=
+cloud.google.com/go/iam v1.1.4/go.mod h1:l/rg8l1AaA+VFMho/HYx2Vv6xinPSLMF8qfhRPIZ0L8=
+cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8=
+cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI=
+cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc=
+cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A=
+cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk=
+cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo=
+cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74=
+cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ=
+cloud.google.com/go/iap v1.9.0/go.mod h1:01OFxd1R+NFrg78S+hoPV5PxEzv22HXaNqUUlmNHFuY=
+cloud.google.com/go/iap v1.9.1/go.mod h1:SIAkY7cGMLohLSdBR25BuIxO+I4fXJiL06IBL7cy/5Q=
+cloud.google.com/go/iap v1.9.2/go.mod h1:GwDTOs047PPSnwRD0Us5FKf4WDRcVvHg1q9WVkKBhdI=
+cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw=
+cloud.google.com/go/iap v1.9.4/go.mod h1:vO4mSq0xNf/Pu6E5paORLASBwEmphXEjgCFg7aeNu1w=
+cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM=
+cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY=
+cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4=
+cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw=
+cloud.google.com/go/ids v1.4.2/go.mod h1:3vw8DX6YddRu9BncxuzMyWn0g8+ooUjI2gslJ7FH3vk=
+cloud.google.com/go/ids v1.4.3/go.mod h1:9CXPqI3GedjmkjbMWCUhMZ2P2N7TUMzAkVXYEH2orYU=
+cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI=
+cloud.google.com/go/ids v1.4.5/go.mod h1:p0ZnyzjMWxww6d2DvMGnFwCsSxDJM666Iir1bK1UuBo=
+cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs=
+cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g=
+cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o=
+cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE=
+cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk=
+cloud.google.com/go/iot v1.7.2/go.mod h1:q+0P5zr1wRFpw7/MOgDXrG/HVA+l+cSwdObffkrpnSg=
+cloud.google.com/go/iot v1.7.3/go.mod h1:t8itFchkol4VgNbHnIq9lXoOOtHNR3uAACQMYbN9N4I=
+cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk=
+cloud.google.com/go/iot v1.7.5/go.mod h1:nq3/sqTz3HGaWJi1xNiX7F41ThOzpud67vwk0YsSsqs=
+cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA=
+cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg=
+cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0=
+cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg=
+cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w=
+cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24=
+cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI=
+cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM=
+cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM=
+cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM=
+cloud.google.com/go/kms v1.15.2/go.mod h1:3hopT4+7ooWRCjc2DxgnpESFxhIraaI2IpAVUEhbT/w=
+cloud.google.com/go/kms v1.15.3/go.mod h1:AJdXqHxS2GlPyduM99s9iGqi2nwbviBbhV/hdmt4iOQ=
+cloud.google.com/go/kms v1.15.4/go.mod h1:L3Sdj6QTHK8dfwK5D1JLsAyELsNMnd3tAIwGS4ltKpc=
+cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI=
+cloud.google.com/go/kms v1.15.6/go.mod h1:yF75jttnIdHfGBoE51AKsD/Yqf+/jICzB9v1s1acsms=
+cloud.google.com/go/kms v1.15.7/go.mod h1:ub54lbsa6tDkUwnu4W7Yt1aAIFLnspgh0kPGToDukeI=
+cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
+cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=
+cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE=
+cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8=
+cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY=
+cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0=
+cloud.google.com/go/language v1.11.0/go.mod h1:uDx+pFDdAKTY8ehpWbiXyQdz8tDSYLJbQcXsCkjYyvQ=
+cloud.google.com/go/language v1.11.1/go.mod h1:Xyid9MG9WOX3utvDbpX7j3tXDmmDooMyMDqgUVpH17U=
+cloud.google.com/go/language v1.12.1/go.mod h1:zQhalE2QlQIxbKIZt54IASBzmZpN/aDASea5zl1l+J4=
+cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc=
+cloud.google.com/go/language v1.12.3/go.mod h1:evFX9wECX6mksEva8RbRnr/4wi/vKGYnAJrTRXU8+f8=
+cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=
+cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08=
+cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo=
+cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc=
+cloud.google.com/go/lifesciences v0.9.2/go.mod h1:QHEOO4tDzcSAzeJg7s2qwnLM2ji8IRpQl4p6m5Z9yTA=
+cloud.google.com/go/lifesciences v0.9.3/go.mod h1:gNGBOJV80IWZdkd+xz4GQj4mbqaz737SCLHn2aRhQKM=
+cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA=
+cloud.google.com/go/lifesciences v0.9.5/go.mod h1:OdBm0n7C0Osh5yZB7j9BXyrMnTRGBJIZonUMxo5CzPw=
+cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw=
+cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M=
+cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI=
+cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE=
+cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=
+cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=
+cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo=
+cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ=
+cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc=
+cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc=
+cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs=
+cloud.google.com/go/longrunning v0.5.3/go.mod h1:y/0ga59EYu58J6SHmmQOvekvND2qODbu8ywBBW7EK7Y=
+cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI=
+cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s=
+cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=
+cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=
+cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA=
+cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak=
+cloud.google.com/go/managedidentities v1.6.2/go.mod h1:5c2VG66eCa0WIq6IylRk3TBW83l161zkFvCj28X7jn8=
+cloud.google.com/go/managedidentities v1.6.3/go.mod h1:tewiat9WLyFN0Fi7q1fDD5+0N4VUoL0SCX0OTCthZq4=
+cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM=
+cloud.google.com/go/managedidentities v1.6.5/go.mod h1:fkFI2PwwyRQbjLxlm5bQ8SjtObFMW3ChBGNqaMcgZjI=
+cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI=
+cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw=
+cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY=
+cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s=
+cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s=
+cloud.google.com/go/maps v1.4.1/go.mod h1:BxSa0BnW1g2U2gNdbq5zikLlHUuHW0GFWh7sgML2kIY=
+cloud.google.com/go/maps v1.5.1/go.mod h1:NPMZw1LJwQZYCfz4y+EIw+SI+24A4bpdFJqdKVr0lt4=
+cloud.google.com/go/maps v1.6.1/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18=
+cloud.google.com/go/maps v1.6.2/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18=
+cloud.google.com/go/maps v1.6.3/go.mod h1:VGAn809ADswi1ASofL5lveOHPnE6Rk/SFTTBx1yuOLw=
+cloud.google.com/go/maps v1.6.4/go.mod h1:rhjqRy8NWmDJ53saCfsXQ0LKwBHfi6OSh5wkq6BaMhI=
+cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4=
+cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w=
+cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I=
+cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig=
+cloud.google.com/go/mediatranslation v0.8.2/go.mod h1:c9pUaDRLkgHRx3irYE5ZC8tfXGrMYwNZdmDqKMSfFp8=
+cloud.google.com/go/mediatranslation v0.8.3/go.mod h1:F9OnXTy336rteOEywtY7FOqCk+J43o2RF638hkOQl4Y=
+cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4=
+cloud.google.com/go/mediatranslation v0.8.5/go.mod h1:y7kTHYIPCIfgyLbKncgqouXJtLsU+26hZhHEEy80fSs=
+cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE=
+cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM=
+cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA=
+cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY=
+cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM=
+cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA=
+cloud.google.com/go/memcache v1.10.2/go.mod h1:f9ZzJHLBrmd4BkguIAa/l/Vle6uTHzHokdnzSWOdQ6A=
+cloud.google.com/go/memcache v1.10.3/go.mod h1:6z89A41MT2DVAW0P4iIRdu5cmRTsbsFn4cyiIx8gbwo=
+cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0=
+cloud.google.com/go/memcache v1.10.5/go.mod h1:/FcblbNd0FdMsx4natdj+2GWzTq+cjZvMa1I+9QsuMA=
+cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY=
+cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s=
+cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8=
+cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI=
+cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo=
+cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA=
+cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA=
+cloud.google.com/go/metastore v1.13.0/go.mod h1:URDhpG6XLeh5K+Glq0NOt74OfrPKTwS62gEPZzb5SOk=
+cloud.google.com/go/metastore v1.13.1/go.mod h1:IbF62JLxuZmhItCppcIfzBBfUFq0DIB9HPDoLgWrVOU=
+cloud.google.com/go/metastore v1.13.2/go.mod h1:KS59dD+unBji/kFebVp8XU/quNSyo8b6N6tPGspKszA=
+cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE=
+cloud.google.com/go/metastore v1.13.4/go.mod h1:FMv9bvPInEfX9Ac1cVcRXp8EBBQnBcqH6gz3KvJ9BAE=
+cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk=
+cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4=
+cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w=
+cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw=
+cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM=
+cloud.google.com/go/monitoring v1.16.0/go.mod h1:Ptp15HgAyM1fNICAojDMoNc/wUmn67mLHQfyqbw+poY=
+cloud.google.com/go/monitoring v1.16.1/go.mod h1:6HsxddR+3y9j+o/cMJH6q/KJ/CBTvM/38L/1m7bTRJ4=
+cloud.google.com/go/monitoring v1.16.2/go.mod h1:B44KGwi4ZCF8Rk/5n+FWeispDXoKSk9oss2QNlXJBgc=
+cloud.google.com/go/monitoring v1.16.3/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw=
+cloud.google.com/go/monitoring v1.17.0/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw=
+cloud.google.com/go/monitoring v1.17.1/go.mod h1:SJzPMakCF0GHOuKEH/r4hxVKF04zl+cRPQyc3d/fqII=
+cloud.google.com/go/monitoring v1.18.0/go.mod h1:c92vVBCeq/OB4Ioyo+NbN2U7tlg5ZH41PZcdvfc+Lcg=
+cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA=
+cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o=
+cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM=
+cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8=
+cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E=
+cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM=
+cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E=
+cloud.google.com/go/networkconnectivity v1.13.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk=
+cloud.google.com/go/networkconnectivity v1.14.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk=
+cloud.google.com/go/networkconnectivity v1.14.1/go.mod h1:LyGPXR742uQcDxZ/wv4EI0Vu5N6NKJ77ZYVnDe69Zug=
+cloud.google.com/go/networkconnectivity v1.14.2/go.mod h1:5UFlwIisZylSkGG1AdwK/WZUaoz12PKu6wODwIbFzJo=
+cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek=
+cloud.google.com/go/networkconnectivity v1.14.4/go.mod h1:PU12q++/IMnDJAB+3r+tJtuCXCfwfN+C6Niyj6ji1Po=
+cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8=
+cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4=
+cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY=
+cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0=
+cloud.google.com/go/networkmanagement v1.9.0/go.mod h1:UTUaEU9YwbCAhhz3jEOHr+2/K/MrBk2XxOLS89LQzFw=
+cloud.google.com/go/networkmanagement v1.9.1/go.mod h1:CCSYgrQQvW73EJawO2QamemYcOb57LvrDdDU51F0mcI=
+cloud.google.com/go/networkmanagement v1.9.2/go.mod h1:iDGvGzAoYRghhp4j2Cji7sF899GnfGQcQRQwgVOWnDw=
+cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU=
+cloud.google.com/go/networkmanagement v1.9.4/go.mod h1:daWJAl0KTFytFL7ar33I6R/oNBH8eEOX/rBNHrC/8TA=
+cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ=
+cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU=
+cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k=
+cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU=
+cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ=
+cloud.google.com/go/networksecurity v0.9.2/go.mod h1:jG0SeAttWzPMUILEHDUvFYdQTl8L/E/KC8iZDj85lEI=
+cloud.google.com/go/networksecurity v0.9.3/go.mod h1:l+C0ynM6P+KV9YjOnx+kk5IZqMSLccdBqW6GUoF4p/0=
+cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w=
+cloud.google.com/go/networksecurity v0.9.5/go.mod h1:KNkjH/RsylSGyyZ8wXpue8xpCEK+bTtvof8SBfIhMG8=
+cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY=
+cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34=
+cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA=
+cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0=
+cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE=
+cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ=
+cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8=
+cloud.google.com/go/notebooks v1.10.0/go.mod h1:SOPYMZnttHxqot0SGSFSkRrwE29eqnKPBJFqgWmiK2k=
+cloud.google.com/go/notebooks v1.10.1/go.mod h1:5PdJc2SgAybE76kFQCWrTfJolCOUQXF97e+gteUUA6A=
+cloud.google.com/go/notebooks v1.11.1/go.mod h1:V2Zkv8wX9kDCGRJqYoI+bQAaoVeE5kSiz4yYHd2yJwQ=
+cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70=
+cloud.google.com/go/notebooks v1.11.3/go.mod h1:0wQyI2dQC3AZyQqWnRsp+yA+kY4gC7ZIVP4Qg3AQcgo=
+cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4=
+cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs=
+cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI=
+cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk=
+cloud.google.com/go/optimization v1.5.0/go.mod h1:evo1OvTxeBRBu6ydPlrIRizKY/LJKo/drDMMRKqGEUU=
+cloud.google.com/go/optimization v1.5.1/go.mod h1:NC0gnUD5MWVAF7XLdoYVPmYYVth93Q6BUzqAq3ZwtV8=
+cloud.google.com/go/optimization v1.6.1/go.mod h1:hH2RYPTTM9e9zOiTaYPTiGPcGdNZVnBSBxjIAJzUkqo=
+cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY=
+cloud.google.com/go/optimization v1.6.3/go.mod h1:8ve3svp3W6NFcAEFr4SfJxrldzhUl4VMUJmhrqVKtYA=
+cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA=
+cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk=
+cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ=
+cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8=
+cloud.google.com/go/orchestration v1.8.2/go.mod h1:T1cP+6WyTmh6LSZzeUhvGf0uZVmJyTx7t8z7Vg87+A0=
+cloud.google.com/go/orchestration v1.8.3/go.mod h1:xhgWAYqlbYjlz2ftbFghdyqENYW+JXuhBx9KsjMoGHs=
+cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI=
+cloud.google.com/go/orchestration v1.8.5/go.mod h1:C1J7HesE96Ba8/hZ71ISTV2UAat0bwN+pi85ky38Yq8=
+cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE=
+cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc=
+cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc=
+cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M=
+cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE=
+cloud.google.com/go/orgpolicy v1.11.2/go.mod h1:biRDpNwfyytYnmCRWZWxrKF22Nkz9eNVj9zyaBdpm1o=
+cloud.google.com/go/orgpolicy v1.11.3/go.mod h1:oKAtJ/gkMjum5icv2aujkP4CxROxPXsBbYGCDbPO8MM=
+cloud.google.com/go/orgpolicy v1.11.4/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI=
+cloud.google.com/go/orgpolicy v1.12.0/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI=
+cloud.google.com/go/orgpolicy v1.12.1/go.mod h1:aibX78RDl5pcK3jA8ysDQCFkVxLj3aOQqrbBaUL2V5I=
+cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs=
+cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg=
+cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo=
+cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw=
+cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw=
+cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc=
+cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE=
+cloud.google.com/go/osconfig v1.12.2/go.mod h1:eh9GPaMZpI6mEJEuhEjUJmaxvQ3gav+fFEJon1Y8Iw0=
+cloud.google.com/go/osconfig v1.12.3/go.mod h1:L/fPS8LL6bEYUi1au832WtMnPeQNT94Zo3FwwV1/xGM=
+cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA=
+cloud.google.com/go/osconfig v1.12.5/go.mod h1:D9QFdxzfjgw3h/+ZaAb5NypM8bhOMqBzgmbhzWViiW8=
+cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E=
+cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU=
+cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70=
+cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo=
+cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs=
+cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs=
+cloud.google.com/go/oslogin v1.11.0/go.mod h1:8GMTJs4X2nOAUVJiPGqIWVcDaF0eniEto3xlOxaboXE=
+cloud.google.com/go/oslogin v1.11.1/go.mod h1:OhD2icArCVNUxKqtK0mcSmKL7lgr0LVlQz+v9s1ujTg=
+cloud.google.com/go/oslogin v1.12.1/go.mod h1:VfwTeFJGbnakxAY236eN8fsnglLiVXndlbcNomY4iZU=
+cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY=
+cloud.google.com/go/oslogin v1.13.0/go.mod h1:xPJqLwpTZ90LSE5IL1/svko+6c5avZLluiyylMb/sRA=
+cloud.google.com/go/oslogin v1.13.1/go.mod h1:vS8Sr/jR7QvPWpCjNqy6LYZr5Zs1e8ZGW/KPn9gmhws=
+cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0=
+cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA=
+cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk=
+cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I=
+cloud.google.com/go/phishingprotection v0.8.2/go.mod h1:LhJ91uyVHEYKSKcMGhOa14zMMWfbEdxG032oT6ECbC8=
+cloud.google.com/go/phishingprotection v0.8.3/go.mod h1:3B01yO7T2Ra/TMojifn8EoGd4G9jts/6cIO0DgDY9J8=
+cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE=
+cloud.google.com/go/phishingprotection v0.8.5/go.mod h1:g1smd68F7mF1hgQPuYn3z8HDbNre8L6Z0b7XMYFmX7I=
+cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg=
+cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE=
+cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw=
+cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc=
+cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0=
+cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU=
+cloud.google.com/go/policytroubleshooter v1.9.0/go.mod h1:+E2Lga7TycpeSTj2FsH4oXxTnrbHJGRlKhVZBLGgU64=
+cloud.google.com/go/policytroubleshooter v1.9.1/go.mod h1:MYI8i0bCrL8cW+VHN1PoiBTyNZTstCg2WUw2eVC4c4U=
+cloud.google.com/go/policytroubleshooter v1.10.1/go.mod h1:5C0rhT3TDZVxAu8813bwmTvd57Phbl8mr9F4ipOsxEs=
+cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0=
+cloud.google.com/go/policytroubleshooter v1.10.3/go.mod h1:+ZqG3agHT7WPb4EBIRqUv4OyIwRTZvsVDHZ8GlZaoxk=
+cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0=
+cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI=
+cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg=
+cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs=
+cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA=
+cloud.google.com/go/privatecatalog v0.9.2/go.mod h1:RMA4ATa8IXfzvjrhhK8J6H4wwcztab+oZph3c6WmtFc=
+cloud.google.com/go/privatecatalog v0.9.3/go.mod h1:K5pn2GrVmOPjXz3T26mzwXLcKivfIJ9R5N79AFCF9UE=
+cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0=
+cloud.google.com/go/privatecatalog v0.9.5/go.mod h1:fVWeBOVe7uj2n3kWRGlUQqR/pOd450J9yZoOECcQqJk=
+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/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI=
+cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0=
+cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8=
+cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4=
+cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc=
+cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc=
+cloud.google.com/go/pubsub v1.34.0/go.mod h1:alj4l4rBg+N3YTFDDC+/YyFTs6JAjam2QfYsddcAW4c=
+cloud.google.com/go/pubsub v1.36.1/go.mod h1:iYjCa9EzWOoBiTdd4ps7QoMtMln5NwaZQpK1hbRfBDE=
+cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg=
+cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k=
+cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM=
+cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0=
+cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4=
+cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o=
+cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk=
+cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo=
+cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE=
+cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U=
+cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA=
+cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c=
+cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU=
+cloud.google.com/go/recaptchaenterprise/v2 v2.8.0/go.mod h1:QuE8EdU9dEnesG8/kG3XuJyNsjEqMlMzg3v3scCJ46c=
+cloud.google.com/go/recaptchaenterprise/v2 v2.8.1/go.mod h1:JZYZJOeZjgSSTGP4uz7NlQ4/d1w5hGmksVgM0lbEij0=
+cloud.google.com/go/recaptchaenterprise/v2 v2.8.2/go.mod h1:kpaDBOpkwD4G0GVMzG1W6Doy1tFFC97XAV3xy+Rd/pw=
+cloud.google.com/go/recaptchaenterprise/v2 v2.8.3/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w=
+cloud.google.com/go/recaptchaenterprise/v2 v2.8.4/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w=
+cloud.google.com/go/recaptchaenterprise/v2 v2.9.0/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w=
+cloud.google.com/go/recaptchaenterprise/v2 v2.9.2/go.mod h1:trwwGkfhCmp05Ll5MSJPXY7yvnO0p4v3orGANAFHAuU=
+cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg=
+cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4=
+cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac=
+cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE=
+cloud.google.com/go/recommendationengine v0.8.2/go.mod h1:QIybYHPK58qir9CV2ix/re/M//Ty10OxjnnhWdaKS1Y=
+cloud.google.com/go/recommendationengine v0.8.3/go.mod h1:m3b0RZV02BnODE9FeSvGv1qibFo8g0OnmB/RMwYy4V8=
+cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU=
+cloud.google.com/go/recommendationengine v0.8.5/go.mod h1:A38rIXHGFvoPvmy6pZLozr0g59NRNREz4cx7F58HAsQ=
+cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg=
+cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c=
+cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs=
+cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70=
+cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ=
+cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA=
+cloud.google.com/go/recommender v1.11.0/go.mod h1:kPiRQhPyTJ9kyXPCG6u/dlPLbYfFlkwHNRwdzPVAoII=
+cloud.google.com/go/recommender v1.11.1/go.mod h1:sGwFFAyI57v2Hc5LbIj+lTwXipGu9NW015rkaEM5B18=
+cloud.google.com/go/recommender v1.11.2/go.mod h1:AeoJuzOvFR/emIcXdVFkspVXVTYpliRCmKNYDnyBv6Y=
+cloud.google.com/go/recommender v1.11.3/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4=
+cloud.google.com/go/recommender v1.12.0/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4=
+cloud.google.com/go/recommender v1.12.1/go.mod h1:gf95SInWNND5aPas3yjwl0I572dtudMhMIG4ni8nr+0=
+cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y=
+cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A=
+cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA=
+cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM=
+cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ=
+cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg=
+cloud.google.com/go/redis v1.13.2/go.mod h1:0Hg7pCMXS9uz02q+LoEVl5dNHUkIQv+C/3L76fandSA=
+cloud.google.com/go/redis v1.13.3/go.mod h1:vbUpCKUAZSYzFcWKmICnYgRAhTFg9r+djWqFxDYXi4U=
+cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs=
+cloud.google.com/go/redis v1.14.2/go.mod h1:g0Lu7RRRz46ENdFKQ2EcQZBAJ2PtJHJLuiiRuEXwyQw=
+cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA=
+cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0=
+cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots=
+cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo=
+cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI=
+cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8=
+cloud.google.com/go/resourcemanager v1.9.2/go.mod h1:OujkBg1UZg5lX2yIyMo5Vz9O5hf7XQOSV7WxqxxMtQE=
+cloud.google.com/go/resourcemanager v1.9.3/go.mod h1:IqrY+g0ZgLsihcfcmqSe+RKp1hzjXwG904B92AwBz6U=
+cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0=
+cloud.google.com/go/resourcemanager v1.9.5/go.mod h1:hep6KjelHA+ToEjOfO3garMKi/CLYwTqeAw7YiEI9x8=
+cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU=
+cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg=
+cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA=
+cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw=
+cloud.google.com/go/resourcesettings v1.6.2/go.mod h1:mJIEDd9MobzunWMeniaMp6tzg4I2GvD3TTmPkc8vBXk=
+cloud.google.com/go/resourcesettings v1.6.3/go.mod h1:pno5D+7oDYkMWZ5BpPsb4SO0ewg3IXcmmrUZaMJrFic=
+cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI=
+cloud.google.com/go/resourcesettings v1.6.5/go.mod h1:WBOIWZraXZOGAgoR4ukNj0o0HiSMO62H9RpFi9WjP9I=
+cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4=
+cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY=
+cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc=
+cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y=
+cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14=
+cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE=
+cloud.google.com/go/retail v1.14.2/go.mod h1:W7rrNRChAEChX336QF7bnMxbsjugcOCPU44i5kbLiL8=
+cloud.google.com/go/retail v1.14.3/go.mod h1:Omz2akDHeSlfCq8ArPKiBxlnRpKEBjUH386JYFLUvXo=
+cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg=
+cloud.google.com/go/retail v1.15.1/go.mod h1:In9nSBOYhLbDGa87QvWlnE1XA14xBN2FpQRiRsUs9wU=
+cloud.google.com/go/retail v1.16.0/go.mod h1:LW7tllVveZo4ReWt68VnldZFWJRzsh9np+01J9dYWzE=
+cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do=
+cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo=
+cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM=
+cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg=
+cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo=
+cloud.google.com/go/run v1.3.0/go.mod h1:S/osX/4jIPZGg+ssuqh6GNgg7syixKe3YnprwehzHKU=
+cloud.google.com/go/run v1.3.1/go.mod h1:cymddtZOzdwLIAsmS6s+Asl4JoXIDm/K1cpZTxV4Q5s=
+cloud.google.com/go/run v1.3.2/go.mod h1:SIhmqArbjdU/D9M6JoHaAqnAMKLFtXaVdNeq04NjnVE=
+cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4=
+cloud.google.com/go/run v1.3.4/go.mod h1:FGieuZvQ3tj1e9GnzXqrMABSuir38AJg5xhiYq+SF3o=
+cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s=
+cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI=
+cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk=
+cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44=
+cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc=
+cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc=
+cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo=
+cloud.google.com/go/scheduler v1.10.2/go.mod h1:O3jX6HRH5eKCA3FutMw375XHZJudNIKVonSCHv7ropY=
+cloud.google.com/go/scheduler v1.10.3/go.mod h1:8ANskEM33+sIbpJ+R4xRfw/jzOG+ZFE8WVLy7/yGvbc=
+cloud.google.com/go/scheduler v1.10.4/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI=
+cloud.google.com/go/scheduler v1.10.5/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI=
+cloud.google.com/go/scheduler v1.10.6/go.mod h1:pe2pNCtJ+R01E06XCDOJs1XvAMbv28ZsQEbqknxGOuE=
+cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA=
+cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4=
+cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4=
+cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU=
+cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw=
+cloud.google.com/go/secretmanager v1.11.2/go.mod h1:MQm4t3deoSub7+WNwiC4/tRYgDBHJgJPvswqQVB1Vss=
+cloud.google.com/go/secretmanager v1.11.3/go.mod h1:0bA2o6FabmShrEy328i67aV+65XoUFFSmVeLBn/51jI=
+cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w=
+cloud.google.com/go/secretmanager v1.11.5/go.mod h1:eAGv+DaCHkeVyQi0BeXgAHOU0RdrMeZIASKc+S7VqH4=
+cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4=
+cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0=
+cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU=
+cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q=
+cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA=
+cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8=
+cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0=
+cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA=
+cloud.google.com/go/security v1.15.2/go.mod h1:2GVE/v1oixIRHDaClVbHuPcZwAqFM28mXuAKCfMgYIg=
+cloud.google.com/go/security v1.15.3/go.mod h1:gQ/7Q2JYUZZgOzqKtw9McShH+MjNvtDpL40J1cT+vBs=
+cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4=
+cloud.google.com/go/security v1.15.5/go.mod h1:KS6X2eG3ynWjqcIX976fuToN5juVkF6Ra6c7MPnldtc=
+cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU=
+cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc=
+cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk=
+cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk=
+cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0=
+cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag=
+cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ=
+cloud.google.com/go/securitycenter v1.23.1/go.mod h1:w2HV3Mv/yKhbXKwOCu2i8bCuLtNP1IMHuiYQn4HJq5s=
+cloud.google.com/go/securitycenter v1.24.1/go.mod h1:3h9IdjjHhVMXdQnmqzVnM7b0wMn/1O/U20eWVpMpZjI=
+cloud.google.com/go/securitycenter v1.24.2/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM=
+cloud.google.com/go/securitycenter v1.24.3/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM=
+cloud.google.com/go/securitycenter v1.24.4/go.mod h1:PSccin+o1EMYKcFQzz9HMMnZ2r9+7jbc+LvPjXhpwcU=
+cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU=
+cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s=
+cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA=
+cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc=
+cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk=
+cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs=
+cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg=
+cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4=
+cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U=
+cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY=
+cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s=
+cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ=
+cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ=
+cloud.google.com/go/servicedirectory v1.11.1/go.mod h1:tJywXimEWzNzw9FvtNjsQxxJ3/41jseeILgwU/QLrGI=
+cloud.google.com/go/servicedirectory v1.11.2/go.mod h1:KD9hCLhncWRV5jJphwIpugKwM5bn1x0GyVVD4NO8mGg=
+cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw=
+cloud.google.com/go/servicedirectory v1.11.4/go.mod h1:Bz2T9t+/Ehg6x+Y7Ycq5xiShYLD96NfEsWNHyitj1qM=
+cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco=
+cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo=
+cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc=
+cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4=
+cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E=
+cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU=
+cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec=
+cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA=
+cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4=
+cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw=
+cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A=
+cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g=
+cloud.google.com/go/shell v1.7.2/go.mod h1:KqRPKwBV0UyLickMn0+BY1qIyE98kKyI216sH/TuHmc=
+cloud.google.com/go/shell v1.7.3/go.mod h1:cTTEz/JdaBsQAeTQ3B6HHldZudFoYBOqjteev07FbIc=
+cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM=
+cloud.google.com/go/shell v1.7.5/go.mod h1:hL2++7F47/IfpfTO53KYf1EC+F56k3ThfNEXd4zcuiE=
+cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos=
+cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk=
+cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M=
+cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI=
+cloud.google.com/go/spanner v1.49.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM=
+cloud.google.com/go/spanner v1.50.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM=
+cloud.google.com/go/spanner v1.51.0/go.mod h1:c5KNo5LQ1X5tJwma9rSQZsXNBDNvj4/n8BVc3LNahq0=
+cloud.google.com/go/spanner v1.53.0/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws=
+cloud.google.com/go/spanner v1.53.1/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws=
+cloud.google.com/go/spanner v1.54.0/go.mod h1:wZvSQVBgngF0Gq86fKup6KIYmN2be7uOKjtK97X+bQU=
+cloud.google.com/go/spanner v1.55.0/go.mod h1:HXEznMUVhC+PC+HDyo9YFG2Ajj5BQDkcbqB9Z2Ffxi0=
+cloud.google.com/go/spanner v1.56.0/go.mod h1:DndqtUKQAt3VLuV2Le+9Y3WTnq5cNKrnLb/Piqcj+h0=
+cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM=
+cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ=
+cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0=
+cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco=
+cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0=
+cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI=
+cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo=
+cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo=
+cloud.google.com/go/speech v1.19.1/go.mod h1:WcuaWz/3hOlzPFOVo9DUsblMIHwxP589y6ZMtaG+iAA=
+cloud.google.com/go/speech v1.19.2/go.mod h1:2OYFfj+Ch5LWjsaSINuCZsre/789zlcCI3SY4oAi2oI=
+cloud.google.com/go/speech v1.20.1/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY=
+cloud.google.com/go/speech v1.21.0/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY=
+cloud.google.com/go/speech v1.21.1/go.mod h1:E5GHZXYQlkqWQwY5xRSLHw2ci5NMQNG52FfMU1aZrIA=
+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=
+cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
+cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc=
+cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=
+cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y=
+cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4=
+cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E=
+cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8=
+cloud.google.com/go/storage v1.37.0/go.mod h1:i34TiT2IhiNDmcj65PqwCjcoUX7Z5pLzS8DEmoiFq1k=
+cloud.google.com/go/storage v1.38.0/go.mod h1:tlUADB0mAb9BgYls9lq+8MGkfzOXuLrnHXlpHmvFJoY=
+cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w=
+cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I=
+cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4=
+cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw=
+cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA=
+cloud.google.com/go/storagetransfer v1.10.1/go.mod h1:rS7Sy0BtPviWYTTJVWCSV4QrbBitgPeuK4/FKa4IdLs=
+cloud.google.com/go/storagetransfer v1.10.2/go.mod h1:meIhYQup5rg9juQJdyppnA/WLQCOguxtk1pr3/vBWzA=
+cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc=
+cloud.google.com/go/storagetransfer v1.10.4/go.mod h1:vef30rZKu5HSEf/x1tK3WfWrL0XVoUQN/EPDRGPzjZs=
+cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw=
+cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g=
+cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM=
+cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA=
+cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c=
+cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24=
+cloud.google.com/go/talent v1.6.3/go.mod h1:xoDO97Qd4AK43rGjJvyBHMskiEf3KulgYzcH6YWOVoo=
+cloud.google.com/go/talent v1.6.4/go.mod h1:QsWvi5eKeh6gG2DlBkpMaFYZYrYUnIpo34f6/V5QykY=
+cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI=
+cloud.google.com/go/talent v1.6.6/go.mod h1:y/WQDKrhVz12WagoarpAIyKKMeKGKHWPoReZ0g8tseQ=
+cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8=
+cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4=
+cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc=
+cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk=
+cloud.google.com/go/texttospeech v1.7.2/go.mod h1:VYPT6aTOEl3herQjFHYErTlSZJ4vB00Q2ZTmuVgluD4=
+cloud.google.com/go/texttospeech v1.7.3/go.mod h1:Av/zpkcgWfXlDLRYob17lqMstGZ3GqlvJXqKMp2u8so=
+cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74=
+cloud.google.com/go/texttospeech v1.7.5/go.mod h1:tzpCuNWPwrNJnEa4Pu5taALuZL4QRRLcb+K9pbhXT6M=
+cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ=
+cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg=
+cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM=
+cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E=
+cloud.google.com/go/tpu v1.6.2/go.mod h1:NXh3NDwt71TsPZdtGWgAG5ThDfGd32X1mJ2cMaRlVgU=
+cloud.google.com/go/tpu v1.6.3/go.mod h1:lxiueqfVMlSToZY1151IaZqp89ELPSrk+3HIQ5HRkbY=
+cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y=
+cloud.google.com/go/tpu v1.6.5/go.mod h1:P9DFOEBIBhuEcZhXi+wPoVy/cji+0ICFi4TtTkMHSSs=
+cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28=
+cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y=
+cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA=
+cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk=
+cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk=
+cloud.google.com/go/trace v1.10.2/go.mod h1:NPXemMi6MToRFcSxRl2uDnu/qAlAQ3oULUphcHGh1vA=
+cloud.google.com/go/trace v1.10.3/go.mod h1:Ke1bgfc73RV3wUFml+uQp7EsDw4dGaETLxB7Iq/r4CY=
+cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY=
+cloud.google.com/go/trace v1.10.5/go.mod h1:9hjCV1nGBCtXbAE4YK7OqJ8pmPYSxPA0I67JwRd5s3M=
+cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs=
+cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg=
+cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0=
+cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos=
+cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos=
+cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs=
+cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs=
+cloud.google.com/go/translate v1.9.0/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs=
+cloud.google.com/go/translate v1.9.1/go.mod h1:TWIgDZknq2+JD4iRcojgeDtqGEp154HN/uL6hMvylS8=
+cloud.google.com/go/translate v1.9.2/go.mod h1:E3Tc6rUTsQkVrXW6avbUhKJSr7ZE3j7zNmqzXKHqRrY=
+cloud.google.com/go/translate v1.9.3/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0=
+cloud.google.com/go/translate v1.10.0/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0=
+cloud.google.com/go/translate v1.10.1/go.mod h1:adGZcQNom/3ogU65N9UXHOnnSvjPwA/jKQUMnsYXOyk=
+cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk=
+cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw=
+cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg=
+cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk=
+cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ=
+cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ=
+cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU=
+cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU=
+cloud.google.com/go/video v1.20.0/go.mod h1:U3G3FTnsvAGqglq9LxgqzOiBc/Nt8zis8S+850N2DUM=
+cloud.google.com/go/video v1.20.1/go.mod h1:3gJS+iDprnj8SY6pe0SwLeC5BUW80NjhwX7INWEuWGU=
+cloud.google.com/go/video v1.20.2/go.mod h1:lrixr5JeKNThsgfM9gqtwb6Okuqzfo4VrY2xynaViTA=
+cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU=
+cloud.google.com/go/video v1.20.4/go.mod h1:LyUVjyW+Bwj7dh3UJnUGZfyqjEto9DnrvTe1f/+QrW0=
+cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU=
+cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4=
+cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M=
+cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU=
+cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU=
+cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo=
+cloud.google.com/go/videointelligence v1.11.2/go.mod h1:ocfIGYtIVmIcWk1DsSGOoDiXca4vaZQII1C85qtoplc=
+cloud.google.com/go/videointelligence v1.11.3/go.mod h1:tf0NUaGTjU1iS2KEkGWvO5hRHeCkFK3nPo0/cOZhZAo=
+cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8=
+cloud.google.com/go/videointelligence v1.11.5/go.mod h1:/PkeQjpRponmOerPeJxNPuxvi12HlW7Em0lJO14FC3I=
+cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0=
+cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo=
+cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo=
+cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY=
+cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E=
+cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY=
+cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0=
+cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU=
+cloud.google.com/go/vision/v2 v2.7.3/go.mod h1:V0IcLCY7W+hpMKXK1JYE0LV5llEqVmj+UJChjvA1WsM=
+cloud.google.com/go/vision/v2 v2.7.4/go.mod h1:ynDKnsDN/0RtqkKxQZ2iatv3Dm9O+HfRb5djl7l4Vvw=
+cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM=
+cloud.google.com/go/vision/v2 v2.7.6/go.mod h1:ZkvWTVNPBU3YZYzgF9Y1jwEbD1NBOCyJn0KFdQfE6Bw=
+cloud.google.com/go/vision/v2 v2.8.0/go.mod h1:ocqDiA2j97pvgogdyhoxiQp2ZkDCyr0HWpicywGGRhU=
+cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE=
+cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g=
+cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc=
+cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY=
+cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro=
+cloud.google.com/go/vmmigration v1.7.2/go.mod h1:iA2hVj22sm2LLYXGPT1pB63mXHhrH1m/ruux9TwWLd8=
+cloud.google.com/go/vmmigration v1.7.3/go.mod h1:ZCQC7cENwmSWlwyTrZcWivchn78YnFniEQYRWQ65tBo=
+cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70=
+cloud.google.com/go/vmmigration v1.7.5/go.mod h1:pkvO6huVnVWzkFioxSghZxIGcsstDvYiVCxQ9ZH3eYI=
+cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208=
+cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8=
+cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY=
+cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0=
+cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0=
+cloud.google.com/go/vmwareengine v1.0.1/go.mod h1:aT3Xsm5sNx0QShk1Jc1B8OddrxAScYLwzVoaiXfdzzk=
+cloud.google.com/go/vmwareengine v1.0.2/go.mod h1:xMSNjIk8/itYrz1JA8nV3Ajg4L4n3N+ugP8JKzk3OaA=
+cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4=
+cloud.google.com/go/vmwareengine v1.1.1/go.mod h1:nMpdsIVkUrSaX8UvmnBhzVzG7PPvNYc5BszcvIVudYs=
+cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w=
+cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8=
+cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes=
+cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs=
+cloud.google.com/go/vpcaccess v1.7.2/go.mod h1:mmg/MnRHv+3e8FJUjeSibVFvQF1cCy2MsFaFqxeY1HU=
+cloud.google.com/go/vpcaccess v1.7.3/go.mod h1:YX4skyfW3NC8vI3Fk+EegJnlYFatA+dXK4o236EUCUc=
+cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk=
+cloud.google.com/go/vpcaccess v1.7.5/go.mod h1:slc5ZRvvjP78c2dnL7m4l4R9GwL3wDLcpIWz6P/ziig=
+cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE=
+cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg=
+cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc=
+cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A=
+cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg=
+cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc=
+cloud.google.com/go/webrisk v1.9.2/go.mod h1:pY9kfDgAqxUpDBOrG4w8deLfhvJmejKB0qd/5uQIPBc=
+cloud.google.com/go/webrisk v1.9.3/go.mod h1:RUYXe9X/wBDXhVilss7EDLW9ZNa06aowPuinUOPCXH8=
+cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0=
+cloud.google.com/go/webrisk v1.9.5/go.mod h1:aako0Fzep1Q714cPEM5E+mtYX8/jsfegAuS8aivxy3U=
+cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo=
+cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ=
+cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng=
+cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg=
+cloud.google.com/go/websecurityscanner v1.6.2/go.mod h1:7YgjuU5tun7Eg2kpKgGnDuEOXWIrh8x8lWrJT4zfmas=
+cloud.google.com/go/websecurityscanner v1.6.3/go.mod h1:x9XANObUFR+83Cya3g/B9M/yoHVqzxPnFtgF8yYGAXw=
+cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o=
+cloud.google.com/go/websecurityscanner v1.6.5/go.mod h1:QR+DWaxAz2pWooylsBF854/Ijvuoa3FCyS1zBa1rAVQ=
+cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0=
+cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M=
+cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
+cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
+cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw=
+cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g=
+cloud.google.com/go/workflows v1.12.0/go.mod h1:PYhSk2b6DhZ508tj8HXKaBh+OFe+xdl0dHF/tJdzPQM=
+cloud.google.com/go/workflows v1.12.1/go.mod h1:5A95OhD/edtOhQd/O741NSfIMezNTbCwLM1P1tBRGHM=
+cloud.google.com/go/workflows v1.12.2/go.mod h1:+OmBIgNqYJPVggnMo9nqmizW0qEXHhmnAzK/CnBqsHc=
+cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g=
+cloud.google.com/go/workflows v1.12.4/go.mod h1:yQ7HUqOkdJK4duVtMeBCAOPiN1ZF1E9pAMX51vpwB/w=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
+gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
+git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
+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/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM=
+github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=
+github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
+github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
+github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
+github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ=
+github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ=
+github.com/alecthomas/participle/v2 v2.0.0/go.mod h1:rAKZdJldHu8084ojcWevWAL8KmEU+AT+Olodb+WoN2Y=
+github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c=
+github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
+github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
+github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0=
+github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI=
+github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg=
+github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw=
+github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY=
+github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU=
+github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
+github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
+github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
+github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I=
+github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=
+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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
+github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
+github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20230428030218-4003588d1b74/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM=
+github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM=
+github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
+github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
+github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
+github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=
+github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI=
+github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q=
+github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g=
+github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
+github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
+github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss=
+github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss=
+github.com/envoyproxy/protoc-gen-validate v1.0.1/go.mod h1:0vj8bNkYbSTNS2PIyH87KZaeN4x9zpL9Qt8fQC7d+vs=
+github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE=
+github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew=
+github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
+github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
+github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
+github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
+github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
+github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=
+github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=
+github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
+github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
+github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=
+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-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=
+github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
+github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
+github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
+github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
+github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
+github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
+github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
+github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE=
+github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng=
+github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
+github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ=
+github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ=
+github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
+github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
+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/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
+github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+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.3/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.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY=
+github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY=
+github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
+github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
+github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
+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/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM=
+github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A=
+github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A=
+github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
+github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
+github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
+github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg=
+github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
+github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
+github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
+github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w=
+github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
+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/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
+github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
+github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
+github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=
+github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
+github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo=
+github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY=
+github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8=
+github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
+github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
+github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw=
+github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI=
+github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU=
+github.com/googleapis/gax-go/v2 v2.12.1/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc=
+github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc=
+github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
+github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
+github.com/grafov/m3u8 v0.12.0/go.mod h1:nqzOkfBiZJENr52zTVd/Dcl03yzphIMbJqkXGu+u080=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=
+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/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
+github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
+github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
+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/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
+github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
+github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
+github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
+github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
+github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
+github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+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.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
+github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
+github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
+github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
+github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o=
+github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk=
+github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
+github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
+github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
+github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
+github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
+github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY=
+github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
+github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/mozillazg/go-httpheader v0.2.1 h1:geV7TrjbL8KXSyvghnFm+NyTux/hxwueTSrwhe88TQQ=
+github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
+github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
+github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=
+github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
+github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
+github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
+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.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
+github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI=
+github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
+github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
+github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
+github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
+github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
+github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
+github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
+github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4=
+github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA=
+github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
+github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
+github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=
+github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
+github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
+github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
+github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
+github.com/sashabaranov/go-openai v1.9.4 h1:KanoCEoowAI45jVXlenMCckutSRr39qOmSi9MyPBfZM=
+github.com/sashabaranov/go-openai v1.9.4/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg=
+github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
+github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
+github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
+github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
+github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
+github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ=
+github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
+github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
+github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
+github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
+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.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
+github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
+github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
+github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
+github.com/substrait-io/substrait-go v0.4.2/go.mod h1:qhpnLmrcvAnlZsUyPXZRqldiHapPTXC3t7xFgDi3aQg=
+github.com/tencent/vectordatabase-sdk-go v1.3.5 h1:+ztAr87z3ghTrCZEGs0/I+h/DZSyMtli57n1KtlPaZ8=
+github.com/tencent/vectordatabase-sdk-go v1.3.5/go.mod h1:uFG4rFiI9CL78uK6u6V5iheLI07wgqNPpsG6+UFDCn8=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563/go.mod h1:uom4Nvi9W+Qkom0exYiJ9VWJjXwyxtPYTkKkaLMlfE0=
+github.com/tencentyun/cos-go-sdk-v5 v0.7.54 h1:FRamEhNBbSeggyYfWfzFejTLftgbICocSYFk4PKTSV4=
+github.com/tencentyun/cos-go-sdk-v5 v0.7.54/go.mod h1:UN+VdbCl1hg+kKi5RXqZgaP+Boqfmk+D04GRc4XFk70=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
+github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
+go.einride.tech/aip v0.66.0/go.mod h1:qAhMsfT7plxBX+Oy7Huol6YUvZ0ZzdUz26yZsQwfl1M=
+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.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0/go.mod h1:tIKj3DbO8N9Y2xo52og3irLsPI4GW02DSMtrVgNMgxg=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0/go.mod h1:rdENBZMT2OE6Ne/KLwpiXudnAsbdrdBaqBvTN8M8BgA=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw=
+go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=
+go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=
+go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI=
+go.opentelemetry.io/otel v1.23.0/go.mod h1:YCycw9ZeKhcJFrb34iVSkyT0iczq/zYDtZYFufObyB0=
+go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
+go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=
+go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=
+go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY=
+go.opentelemetry.io/otel/metric v1.23.0/go.mod h1:MqUW2X2a6Q8RN96E2/nqNoT+z9BSms20Jb7Bbp+HiTo=
+go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
+go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=
+go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
+go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc=
+go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=
+go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
+go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo=
+go.opentelemetry.io/otel/trace v1.23.0/go.mod h1:GSGTbIClEsuZrGIzoEHqsVfxgn5UkggkflQwDScNUsk=
+go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
+go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
+go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
+go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
+go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
+go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
+go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
+go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-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-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
+golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
+golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
+golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
+golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
+golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
+golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
+golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g=
+golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
+golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=
+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/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
+golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
+golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
+golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
+golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
+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/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
+golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
+golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
+golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
+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/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+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/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
+golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
+golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-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-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-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
+golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
+golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
+golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
+golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
+golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
+golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
+golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
+golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
+golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
+golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
+golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
+golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
+golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
+golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
+golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
+golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
+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/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=
+golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=
+golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
+golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
+golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
+golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
+golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec=
+golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
+golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
+golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
+golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE=
+golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI=
+golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk=
+golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0=
+golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM=
+golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM=
+golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o=
+golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA=
+golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8=
+golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+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/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
+golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
+golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/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-20191001151750-bb3f8db39f24/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-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/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-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
+golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
+golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
+golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
+golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
+golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
+golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
+golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
+golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww=
+golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
+golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
+golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
+golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
+golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
+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.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
+golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+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-20190206041539-40960b6deb8e/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-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-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/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-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-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-20201124115921-2c860bdd6e78/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/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
+golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
+golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4=
+golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
+golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM=
+golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
+golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
+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=
+golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
+golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
+golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
+golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
+gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
+gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
+gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=
+gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA=
+gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY=
+gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
+gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
+gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=
+gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=
+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/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
+google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
+google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
+google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
+google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
+google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
+google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
+google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
+google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
+google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
+google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
+google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=
+google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=
+google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
+google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
+google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
+google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
+google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
+google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw=
+google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg=
+google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o=
+google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g=
+google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=
+google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=
+google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI=
+google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
+google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
+google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
+google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08=
+google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70=
+google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo=
+google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0=
+google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY=
+google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY=
+google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY=
+google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI=
+google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0=
+google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg=
+google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E=
+google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms=
+google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4=
+google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw=
+google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw=
+google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750=
+google.golang.org/api v0.139.0/go.mod h1:CVagp6Eekz9CjGZ718Z+sloknzkDJE7Vc1Ckj9+viBk=
+google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI=
+google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg=
+google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk=
+google.golang.org/api v0.157.0/go.mod h1:+z4v4ufbZ1WEpld6yMGHyggs+PmAHiaLNj5ytP3N01g=
+google.golang.org/api v0.160.0/go.mod h1:0mu0TpK33qnydLvWqbImq2b1eQ5FHRSDCBzAxX9ZHyw=
+google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0=
+google.golang.org/api v0.164.0/go.mod h1:2OatzO7ZDQsoS7IFf3rvsE17/TldiU3F/zxFHeqUB5o=
+google.golang.org/api v0.166.0/go.mod h1:4FcBc686KFi7QI/U51/2GKKevfZMpM17sCdibqe/bSA=
+google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg=
+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/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
+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-20200513103714-09dca8ec2884/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
+google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
+google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
+google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
+google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
+google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
+google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
+google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
+google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
+google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
+google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
+google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
+google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
+google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
+google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
+google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE=
+google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc=
+google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
+google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
+google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
+google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
+google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
+google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
+google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
+google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
+google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
+google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
+google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw=
+google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=
+google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=
+google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U=
+google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
+google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
+google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
+google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
+google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo=
+google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE=
+google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA=
+google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw=
+google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw=
+google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA=
+google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s=
+google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s=
+google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
+google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
+google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
+google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
+google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
+google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY=
+google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk=
+google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk=
+google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64=
+google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64=
+google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y=
+google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0=
+google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108=
+google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8=
+google.golang.org/genproto v0.0.0-20230821184602-ccc8af3d0e93/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4=
+google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4=
+google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4=
+google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU=
+google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk=
+google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE=
+google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI=
+google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4=
+google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY=
+google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY=
+google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=
+google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY=
+google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0=
+google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k=
+google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro=
+google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro=
+google.golang.org/genproto v0.0.0-20240205150955-31a09d347014/go.mod h1:xEgQu1e4stdSSsxPDK8Azkrk/ECl5HvdPf6nbZrTS5M=
+google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s=
+google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8=
+google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
+google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
+google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
+google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
+google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ=
+google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ=
+google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ=
+google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q=
+google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk=
+google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk=
+google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U=
+google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0=
+google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:SUBoKXbI1Efip18FClrQVGjWcyd0QZd8KkvdP34t7ww=
+google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870=
+google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg=
+google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4=
+google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI=
+google.golang.org/genproto/googleapis/api v0.0.0-20231211222908-989df2bf70f3/go.mod h1:k2dtGpRrbsSyKcNPKKI5sstZkrNCZwpU/ns96JoHbGg=
+google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c=
+google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0=
+google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg=
+google.golang.org/genproto/googleapis/api v0.0.0-20240122161410-6c6643bf1457/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA=
+google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA=
+google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA=
+google.golang.org/genproto/googleapis/api v0.0.0-20240205150955-31a09d347014/go.mod h1:rbHMSEDyoYX62nRVLOCc4Qt1HbsdytAYoVwgjiOhF3I=
+google.golang.org/genproto/googleapis/api v0.0.0-20240221002015-b0ce06bbee7c/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=
+google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y=
+google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE=
+google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU=
+google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA=
+google.golang.org/genproto/googleapis/bytestream v0.0.0-20230807174057-1744710a1577/go.mod h1:NjCQG/D8JandXxM57PZbAJL1DCNL6EypA0vPPwfsc7c=
+google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw=
+google.golang.org/genproto/googleapis/bytestream v0.0.0-20231212172506-995d672761c0/go.mod h1:guYXGPwC6jwxgWKW5Y405fKWOFNwlvUlUnzyp9i0uqo=
+google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:ZSvZ8l+AWJwXw91DoTjWjaVLpWU6o0eZ4YLYpH8aLeQ=
+google.golang.org/genproto/googleapis/bytestream v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:SCz6T5xjNXM4QFPRwxHcfChp7V+9DcXR3ay2TkHR8Tg=
+google.golang.org/genproto/googleapis/bytestream v0.0.0-20240205150955-31a09d347014/go.mod h1:EhZbXt+eY4Yr3YVaEGLdNZF5viWowOJZ8KTPqjYMKzg=
+google.golang.org/genproto/googleapis/bytestream v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:om8Bj876Z0v9ei+RD1LnEWig7vpHQ371PUqsgjmLQEA=
+google.golang.org/genproto/googleapis/bytestream v0.0.0-20240304161311-37d4d3c04a78/go.mod h1:vh/N7795ftP0AkN1w8XKqN4w1OdUKXW5Eummda+ofv8=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230920183334-c177e329c48b/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231211222908-989df2bf70f3/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240122161410-6c6643bf1457/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014/go.mod h1:SaPjaZGWb0lPqs6Ittu0spdfrOArqji4ZdeP5IC/9N4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:YUWgXUFRPfoYK1IHMuxH5K6nPEXSCzIMljnQ59lLRCk=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240221002015-b0ce06bbee7c/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240228201840-1f18d85a4ec2/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240228224816-df926f6c8641/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240304161311-37d4d3c04a78/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
+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.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
+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/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
+google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
+google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
+google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
+google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
+google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
+google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
+google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
+google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
+google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
+google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
+google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
+google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g=
+google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8=
+google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
+google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
+google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo=
+google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0=
+google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0=
+google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
+google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM=
+google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM=
+google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=
+google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=
+google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE=
+google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE=
+google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg=
+google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
+google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
+google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
+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=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
+google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.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=
+gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
+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=
+honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
+lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
+lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
+lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
+modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
+modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
+modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
+modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20=
+modernc.org/cc/v3 v3.38.1/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20=
+modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0=
+modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc=
+modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw=
+modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI=
+modernc.org/ccgo/v3 v3.0.0-20220910160915-348f15de615a/go.mod h1:8p47QxPkdugex9J4n9P2tLZ9bK01yngIVp00g4nomW0=
+modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
+modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
+modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws=
+modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo=
+modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g=
+modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY=
+modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
+modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
+modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA=
+modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A=
+modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU=
+modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU=
+modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA=
+modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0=
+modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s=
+modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA=
+modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0=
+modernc.org/libc v1.19.0/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0=
+modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0=
+modernc.org/libc v1.21.2/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI=
+modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI=
+modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug=
+modernc.org/libc v1.22.4/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY=
+modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
+modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
+modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
+modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
+modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
+modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
+modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
+modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
+modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4=
+modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0=
+modernc.org/sqlite v1.21.2/go.mod h1:cxbLkB5WS32DnQqeH4h4o1B0eMr8W/y8/RGuxQ3JsC0=
+modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
+modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw=
+modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw=
+modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0=
+modernc.org/tcl v1.15.1/go.mod h1:aEjeGJX2gz1oWKOLDVZ2tnEWLUrIn8H+GFu+akoDhqs=
+modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
+modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
+modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
+modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8=
+modernc.org/z v1.7.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
+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/ai-chat-service/grpc_health_probe-linux-amd64 b/ai-chat-service/grpc_health_probe-linux-amd64
new file mode 100644
index 0000000..3f0da73
Binary files /dev/null and b/ai-chat-service/grpc_health_probe-linux-amd64 differ
diff --git a/ai-chat-service/interceptor/auth.go b/ai-chat-service/interceptor/auth.go
new file mode 100644
index 0000000..b67f3f4
--- /dev/null
+++ b/ai-chat-service/interceptor/auth.go
@@ -0,0 +1,38 @@
+package interceptor
+
+import (
+ "ai-chat-service/pkg/config"
+ "ai-chat-service/pkg/zerror"
+ "context"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/metadata"
+ "strings"
+)
+
+func UnaryAuthInterceptor(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {
+ if info.FullMethod != "/grpc.health.v1.Health/Check" {
+ err = oauth2Valid(ctx)
+ if err != nil {
+ return
+ }
+ }
+ return handler(ctx, req)
+}
+func oauth2Valid(ctx context.Context) error {
+ md, ok := metadata.FromIncomingContext(ctx)
+ if !ok {
+ return zerror.NewByMsg("元数据获取失败")
+ }
+ authorization := md["authorization"]
+
+ if len(authorization) < 1 {
+ return zerror.NewByMsg("元数据获取失败")
+ }
+
+ token := strings.TrimPrefix(authorization[0], "Bearer ")
+ cnf := config.GetConfig()
+ if token != cnf.Server.AccessToken {
+ return zerror.NewByMsg("鉴权失败")
+ }
+ return nil
+}
diff --git a/ai-chat-service/pkg/config/config.go b/ai-chat-service/pkg/config/config.go
new file mode 100644
index 0000000..c03e800
--- /dev/null
+++ b/ai-chat-service/pkg/config/config.go
@@ -0,0 +1,90 @@
+package config
+
+import (
+ "github.com/spf13/viper"
+ "log"
+)
+
+type Config struct {
+ Server struct {
+ IP string
+ Port int
+ AccessToken string
+ }
+ Log struct {
+ Level string
+ LogPath string `mapstructure:"logPath"`
+ } `mapstructure:"log"`
+ Chat struct {
+ ApiKey string `mapstructure:"api_key"`
+ BaseUrl string `mapstructure:"base_url"`
+ Model string `mapstructure:"model"`
+ MaxTokens int `mapstructure:"max_tokens"`
+ Temperature float32 `mapstructure:"temperature"`
+ TopP float32 `mapstructure:"top_p"`
+ PresencePenalty float32 `mapstructure:"presence_penalty"`
+ FrequencyPenalty float32 `mapstructure:"frequency_penalty"`
+ BotDesc string `mapstructure:"bot_desc"`
+ MinResponseTokens int `mapstructure:"min_response_tokens"`
+ ContextTTL int `mapstructure:"context_ttl"`
+ ContextLen int `mapstructure:"context_len"`
+ }
+ Mysql struct {
+ DSN string
+ MaxLifeTime int
+ MaxOpenConn int
+ MaxIdleConn int
+ }
+ Redis struct {
+ Host string
+ Port int
+ Pwd string `mapstructure:"pwd"`
+ }
+ DependOn struct {
+ Sensitive struct {
+ Address string
+ AccessToken string
+ }
+ Keywords struct {
+ Address string
+ AccessToken string
+ }
+ Tokenizer struct {
+ Address string
+ }
+ }
+ VectorDB struct {
+ Url string
+ Username string
+ Pwd string
+ Database string
+ Timeout int
+ MaxIdleConnPerHost int
+ ReadConsistency string
+ IdleConnTimeout int
+ }
+}
+
+var conf *Config
+
+func InitConfig(filePath string, typ ...string) {
+ v := viper.New()
+ v.SetConfigFile(filePath)
+ if len(typ) > 0 {
+ v.SetConfigType(typ[0])
+ }
+ err := v.ReadInConfig()
+ if err != nil {
+ log.Fatal(err)
+ }
+ conf = &Config{}
+ err = v.Unmarshal(conf)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+}
+
+func GetConfig() *Config {
+ return conf
+}
diff --git a/ai-chat-service/pkg/db/mysql/mysql.go b/ai-chat-service/pkg/db/mysql/mysql.go
new file mode 100644
index 0000000..db84c64
--- /dev/null
+++ b/ai-chat-service/pkg/db/mysql/mysql.go
@@ -0,0 +1,28 @@
+package mysql
+
+import (
+ "ai-chat-service/pkg/config"
+ "database/sql"
+ _ "github.com/go-sql-driver/mysql"
+ "time"
+)
+
+var db *sql.DB
+
+func InitMysql(cnf *config.Config) {
+ var err error
+ if cnf.Mysql.DSN == "" {
+ panic("数据库连接字符串不能为空")
+ }
+ db, err = sql.Open("mysql", cnf.Mysql.DSN)
+ if err != nil {
+ panic(err)
+ }
+ db.SetMaxOpenConns(cnf.Mysql.MaxOpenConn)
+ db.SetMaxIdleConns(cnf.Mysql.MaxIdleConn)
+ db.SetConnMaxLifetime(time.Second * time.Duration(cnf.Mysql.MaxLifeTime))
+}
+
+func GetDB() *sql.DB {
+ return db
+}
diff --git a/ai-chat-service/pkg/db/redis/prefix.go b/ai-chat-service/pkg/db/redis/prefix.go
new file mode 100644
index 0000000..a7952a4
--- /dev/null
+++ b/ai-chat-service/pkg/db/redis/prefix.go
@@ -0,0 +1,14 @@
+package redis
+
+import "strings"
+
+const ServicePrefix = "ai_chat_service_"
+
+func GetKey(key string, parts ...string) string {
+ key = ServicePrefix + key
+ if len(parts) == 0 {
+ return key
+ }
+ key += "_" + strings.Join(parts, "_")
+ return key
+}
diff --git a/ai-chat-service/pkg/db/redis/redis.go b/ai-chat-service/pkg/db/redis/redis.go
new file mode 100644
index 0000000..faf2248
--- /dev/null
+++ b/ai-chat-service/pkg/db/redis/redis.go
@@ -0,0 +1,57 @@
+package redis
+
+import (
+ "ai-chat-service/pkg/config"
+ "context"
+ "fmt"
+ redis "github.com/redis/go-redis/v9"
+ "sync"
+)
+
+type RedisPool interface {
+ Get() *redis.Client
+ Put(client *redis.Client)
+}
+
+var pool RedisPool
+
+type redisPool struct {
+ pool sync.Pool
+}
+
+func (p *redisPool) Get() *redis.Client {
+ client := p.pool.Get().(*redis.Client)
+ if client.Ping(context.Background()).Err() != nil {
+ client = p.pool.New().(*redis.Client)
+ }
+ return client
+}
+
+func (p *redisPool) Put(client *redis.Client) {
+ if client.Ping(context.Background()).Err() != nil {
+ return
+ }
+ p.pool.Put(client)
+}
+
+func getPool(cnf *config.Config) RedisPool {
+ return &redisPool{
+ pool: sync.Pool{
+ New: func() any {
+ rdb := redis.NewClient(&redis.Options{
+ Addr: fmt.Sprintf("%s:%d", cnf.Redis.Host, cnf.Redis.Port),
+ Password: cnf.Redis.Pwd,
+ })
+ return rdb
+ },
+ },
+ }
+}
+
+func InitRedisPool(cnf *config.Config) {
+ pool = getPool(cnf)
+}
+
+func GetPool() RedisPool {
+ return pool
+}
diff --git a/ai-chat-service/pkg/db/vector/vector.go b/ai-chat-service/pkg/db/vector/vector.go
new file mode 100644
index 0000000..c57df64
--- /dev/null
+++ b/ai-chat-service/pkg/db/vector/vector.go
@@ -0,0 +1,29 @@
+package vector
+
+import (
+ "ai-chat-service/pkg/config"
+ "ai-chat-service/pkg/log"
+ "github.com/tencent/vectordatabase-sdk-go/tcvectordb"
+ "time"
+)
+
+var vdb *tcvectordb.Client
+
+func InitDB(config *config.Config) {
+ var defaultOption = &tcvectordb.ClientOption{
+ Timeout: time.Second * time.Duration(config.VectorDB.Timeout),
+ MaxIdldConnPerHost: config.VectorDB.MaxIdleConnPerHost,
+ IdleConnTimeout: time.Second * time.Duration(config.VectorDB.IdleConnTimeout),
+ ReadConsistency: tcvectordb.ReadConsistency(config.VectorDB.ReadConsistency),
+ }
+ var err error
+ vdb, err = tcvectordb.NewClient(config.VectorDB.Url, config.VectorDB.Username, config.VectorDB.Pwd, defaultOption)
+ if err != nil {
+ log.Error(err)
+ return
+ }
+}
+
+func GetVdb() *tcvectordb.Client {
+ return vdb
+}
diff --git a/ai-chat-service/pkg/log/README.md b/ai-chat-service/pkg/log/README.md
new file mode 100644
index 0000000..3e02b17
--- /dev/null
+++ b/ai-chat-service/pkg/log/README.md
@@ -0,0 +1,3 @@
+# 日志框架
+1. 可通过包调用日志打印,也可以通过对象调用日志打印
+2. 可以自动切分日志文件
diff --git a/ai-chat-service/pkg/log/hook.go b/ai-chat-service/pkg/log/hook.go
new file mode 100644
index 0000000..a7a1cbf
--- /dev/null
+++ b/ai-chat-service/pkg/log/hook.go
@@ -0,0 +1,19 @@
+package log
+
+import "github.com/sirupsen/logrus"
+import nativeLog "log"
+
+type errorHook struct {
+}
+
+func (*errorHook) Levels() []logrus.Level {
+ return []logrus.Level{
+ logrus.PanicLevel,
+ logrus.FatalLevel,
+ logrus.ErrorLevel,
+ }
+}
+func (*errorHook) Fire(entry *logrus.Entry) error {
+ nativeLog.Println(entry.Message, entry.Data)
+ return nil
+}
diff --git a/ai-chat-service/pkg/log/log.go b/ai-chat-service/pkg/log/log.go
new file mode 100644
index 0000000..520d547
--- /dev/null
+++ b/ai-chat-service/pkg/log/log.go
@@ -0,0 +1,233 @@
+package log
+
+import (
+ "errors"
+ "fmt"
+ "github.com/sirupsen/logrus"
+ "io"
+ "runtime"
+)
+
+type ILogger interface {
+ SetLevel(lvl string)
+ SetOutput(writer io.Writer)
+ SetPrintCaller(bool)
+ SetCaller(caller func() (file string, line int, funcName string, err error))
+ Trace(args ...interface{})
+ Debug(args ...interface{})
+ Info(args ...interface{})
+ Warning(args ...interface{})
+ Error(args ...interface{})
+ Fatal(args ...interface{})
+ Panic(args ...interface{})
+ TraceF(format string, args ...interface{})
+ DebugF(format string, args ...interface{})
+ InfoF(format string, args ...interface{})
+ WarningF(format string, args ...interface{})
+ ErrorF(format string, args ...interface{})
+ FatalF(format string, args ...interface{})
+ PanicF(format string, args ...interface{})
+ WithFields(fields map[string]interface{}) ILogger
+}
+type Logger struct {
+ entry *logrus.Entry
+ // panic,fatal,error,warn,warning,info,debug,trace
+ level string
+ printCaller bool
+ caller func() (file string, line int, funcName string, err error)
+}
+
+// 设置日志打印级别
+func (l *Logger) SetLevel(lvl string) {
+ if lvl == "" {
+ return
+ }
+ level, err := logrus.ParseLevel(lvl)
+ if err == nil {
+ l.level = lvl
+ l.entry.Logger.Level = level
+ }
+}
+
+// 设置日志输出位置
+func (l *Logger) SetOutput(writer io.Writer) {
+ l.entry.Logger.SetOutput(writer)
+}
+
+// 设置是否打印调用信息
+func (l *Logger) SetPrintCaller(printCaller bool) {
+ l.printCaller = printCaller
+}
+func (l *Logger) SetCaller(caller func() (file string, line int, funcName string, err error)) {
+ l.caller = caller
+}
+
+// 获取caller信息
+func (l *Logger) getCallerInfo(level logrus.Level) map[string]interface{} {
+ mp := make(map[string]interface{})
+ if l.printCaller == true || level != logrus.InfoLevel {
+ file, line, funcName, err := l.caller()
+ if err == nil {
+ mp["file"] = fmt.Sprintf("%s:%d", file, line)
+ mp["func"] = funcName
+ }
+ }
+ return mp
+}
+
+func (l *Logger) log(level logrus.Level, args ...interface{}) {
+ l.entry.WithFields(l.getCallerInfo(level)).Log(level, args...)
+}
+func (l *Logger) logf(level logrus.Level, format string, args ...interface{}) {
+ l.entry.WithFields(l.getCallerInfo(level)).Logf(level, format, args...)
+}
+func (l *Logger) Trace(args ...interface{}) {
+ l.log(logrus.TraceLevel, args...)
+}
+func (l *Logger) Debug(args ...interface{}) {
+ l.log(logrus.DebugLevel, args...)
+}
+func (l *Logger) Info(args ...interface{}) {
+ l.log(logrus.InfoLevel, args...)
+}
+func (l *Logger) Warning(args ...interface{}) {
+ l.log(logrus.WarnLevel, args...)
+}
+func (l *Logger) Error(args ...interface{}) {
+ l.log(logrus.ErrorLevel, args...)
+}
+func (l *Logger) Fatal(args ...interface{}) {
+ l.log(logrus.FatalLevel, args...)
+}
+func (l *Logger) Panic(args ...interface{}) {
+ l.log(logrus.PanicLevel, args...)
+}
+func (l *Logger) TraceF(format string, args ...interface{}) {
+ l.logf(logrus.TraceLevel, format, args...)
+}
+func (l *Logger) DebugF(format string, args ...interface{}) {
+ l.logf(logrus.DebugLevel, format, args...)
+}
+func (l *Logger) InfoF(format string, args ...interface{}) {
+ l.logf(logrus.InfoLevel, format, args...)
+}
+func (l *Logger) WarningF(format string, args ...interface{}) {
+ l.logf(logrus.WarnLevel, format, args...)
+}
+func (l *Logger) ErrorF(format string, args ...interface{}) {
+ l.logf(logrus.ErrorLevel, format, args...)
+}
+func (l *Logger) FatalF(format string, args ...interface{}) {
+ l.logf(logrus.FatalLevel, format, args...)
+}
+func (l *Logger) PanicF(format string, args ...interface{}) {
+ l.logf(logrus.PanicLevel, format, args...)
+}
+func (l *Logger) WithFields(fields map[string]interface{}) ILogger {
+ entry := l.entry.WithFields(fields)
+ return &Logger{entry: entry, level: l.level, printCaller: l.printCaller, caller: l.caller}
+}
+
+var log *Logger
+
+func NewLogger() ILogger {
+ return newLogger()
+}
+func newLogger() *Logger {
+ log := logrus.New()
+ log.SetLevel(logrus.InfoLevel)
+ log.AddHook(&errorHook{})
+ logger := &Logger{
+ entry: logrus.NewEntry(log),
+ caller: defaultCaller,
+ }
+ return logger
+}
+
+func init() {
+ log = newLogger()
+}
+
+// 设置日志打印级别
+func SetLevel(lvl string) {
+ if lvl == "" {
+ return
+ }
+ level, err := logrus.ParseLevel(lvl)
+ if err == nil {
+ log.level = lvl
+ log.entry.Logger.Level = level
+ }
+}
+
+// 设置日志的输出位置
+func SetOutput(writer io.Writer) {
+ log.entry.Logger.SetOutput(writer)
+}
+
+// 设置是否打印调用信息
+func SetPrintCaller(printCaller bool) {
+ log.printCaller = printCaller
+}
+
+func SetCaller(caller func() (file string, line int, funcName string, err error)) {
+ log.caller = caller
+}
+
+func defaultCaller() (file string, line int, funcName string, err error) {
+ pc, f, l, ok := runtime.Caller(4)
+ if !ok {
+ err = errors.New("caller failure")
+ return
+ }
+ funcName = runtime.FuncForPC(pc).Name()
+ file, line = f, l
+ return
+}
+
+func Trace(args ...interface{}) {
+ log.log(logrus.TraceLevel, args...)
+}
+func Debug(args ...interface{}) {
+ log.log(logrus.DebugLevel, args...)
+}
+func Info(args ...interface{}) {
+ log.log(logrus.InfoLevel, args...)
+}
+func Warning(args ...interface{}) {
+ log.log(logrus.WarnLevel, args...)
+}
+func Error(args ...interface{}) {
+ log.log(logrus.ErrorLevel, args...)
+}
+func Fatal(args ...interface{}) {
+ log.log(logrus.FatalLevel, args...)
+}
+func Panic(args ...interface{}) {
+ log.log(logrus.PanicLevel, args...)
+}
+func TraceF(format string, args ...interface{}) {
+ log.logf(logrus.TraceLevel, format, args...)
+}
+func DebugF(format string, args ...interface{}) {
+ log.logf(logrus.DebugLevel, format, args...)
+}
+func InfoF(format string, args ...interface{}) {
+ log.logf(logrus.InfoLevel, format, args...)
+}
+func WarningF(format string, args ...interface{}) {
+ log.logf(logrus.WarnLevel, format, args...)
+}
+func ErrorF(format string, args ...interface{}) {
+ log.logf(logrus.ErrorLevel, format, args...)
+}
+func FatalF(format string, args ...interface{}) {
+ log.logf(logrus.FatalLevel, format, args...)
+}
+func PanicF(format string, args ...interface{}) {
+ log.logf(logrus.PanicLevel, format, args...)
+}
+func WithFields(fields map[string]interface{}) *Logger {
+ entry := log.entry.WithFields(fields)
+ return &Logger{entry: entry, level: log.level, printCaller: log.printCaller, caller: log.caller}
+}
diff --git a/ai-chat-service/pkg/log/rotate_writer.go b/ai-chat-service/pkg/log/rotate_writer.go
new file mode 100644
index 0000000..7bec60b
--- /dev/null
+++ b/ai-chat-service/pkg/log/rotate_writer.go
@@ -0,0 +1,58 @@
+package log
+
+import (
+ "gopkg.in/natefinch/lumberjack.v2"
+ "io"
+ "sync"
+)
+
+type fileRotateWriter struct {
+ data map[string]io.Writer
+ sync.RWMutex
+}
+
+func (frw *fileRotateWriter) getWriter(logPath string) io.Writer {
+ frw.RLock()
+ defer frw.RUnlock()
+ w, ok := frw.data[logPath]
+ if !ok {
+ return nil
+ }
+ return w
+}
+func (frw *fileRotateWriter) setWriter(logPath string, w io.Writer) io.Writer {
+ frw.Lock()
+ defer frw.Unlock()
+ frw.data[logPath] = w
+ return w
+}
+
+var _fileRotateWriter *fileRotateWriter
+
+func init() {
+ _fileRotateWriter = &fileRotateWriter{
+ data: map[string]io.Writer{},
+ }
+}
+
+func GetRotateWriter(logPath string) io.Writer {
+ if logPath == "" {
+ panic("日志文件路径不能为空")
+ }
+ writer := _fileRotateWriter.getWriter(logPath)
+ if writer != nil {
+ return writer
+ }
+ writer = &lumberjack.Logger{
+ //文件名
+ Filename: logPath,
+ //单个文件大小单位MB
+ MaxSize: 1,
+ //最多保留文件数
+ MaxBackups: 15,
+ //最长保留时间(天)
+ MaxAge: 7,
+ LocalTime: true,
+ }
+ return _fileRotateWriter.setWriter(logPath, writer)
+}
diff --git a/ai-chat-service/pkg/zerror/error_code.go b/ai-chat-service/pkg/zerror/error_code.go
new file mode 100644
index 0000000..0aacd5c
--- /dev/null
+++ b/ai-chat-service/pkg/zerror/error_code.go
@@ -0,0 +1,14 @@
+package zerror
+
+type ZErrorCode string
+
+func getErrMsg(errCode ZErrorCode) string {
+ msg, ok := errorMsgs[errCode]
+ if ok {
+ return msg
+ }
+ return ""
+}
+
+// 错误码与之对应的错误消息
+var errorMsgs = map[ZErrorCode]string{}
diff --git a/ai-chat-service/pkg/zerror/zerror.go b/ai-chat-service/pkg/zerror/zerror.go
new file mode 100644
index 0000000..bf1a76b
--- /dev/null
+++ b/ai-chat-service/pkg/zerror/zerror.go
@@ -0,0 +1,101 @@
+package zerror
+
+import (
+ "errors"
+ "fmt"
+)
+
+type ZError struct {
+ ErrCode ZErrorCode `json:"err_code,omitempty"`
+ ErrMsg string `json:"err_msg,omitempty"`
+ errs []error
+}
+
+func (e *ZError) Error() string {
+ if e == nil {
+ return ""
+ }
+ if e.ErrMsg != "" {
+ return fmt.Sprintf("ErrCode:%s; ErrMsg:%s;", e.ErrCode, e.ErrMsg)
+ }
+ res := ""
+ if e.errs == nil || len(e.errs) == 0 {
+ return res
+ }
+ var first = true
+ for _, err := range e.errs {
+ if first {
+ res = err.Error()
+ first = false
+ } else {
+ res += ";" + err.Error()
+ }
+ }
+ return res
+}
+func (e *ZError) Errors() []error {
+ if e == nil {
+ return nil
+ }
+ return e.errs
+}
+func (e *ZError) Append(err error) {
+ if e == nil || err == nil {
+ return
+ }
+ ze, ok := err.(*ZError)
+ if ok {
+ e.errs = append(e.errs, ze.errs...)
+ } else {
+ e.errs = append(e.errs, err)
+ }
+}
+
+func NewByErr(err ...error) error {
+ res := &ZError{
+ errs: make([]error, 0),
+ }
+ for i, e := range err {
+ if e == nil {
+ continue
+ }
+ ze, ok := err[i].(*ZError)
+ if ok {
+ res.errs = append(res.errs, ze.errs...)
+ } else {
+ res.errs = append(res.errs, err[i])
+ }
+ }
+ if len(res.errs) > 0 {
+ return res
+ }
+ return nil
+}
+func NewByCode(errCode ZErrorCode, errMsg ...string) error {
+ msg := ""
+ if len(errMsg) > 0 {
+ msg = errMsg[0]
+ } else {
+ msg = getErrMsg(errCode)
+ }
+ return &ZError{
+ ErrCode: errCode,
+ ErrMsg: msg,
+ }
+}
+func NewByMsg(msg string) error {
+ err := errors.New(msg)
+ return NewByErr(err)
+}
+func Errors(err error) []error {
+ if err == nil {
+ return nil
+ }
+ ze, ok := err.(*ZError)
+ if !ok {
+ return []error{err}
+ }
+ //将一个空的[]error切片与ze.Errors()返回的错误切片合并在一起
+ //返回一个新切片
+ return append(([]error)(nil), ze.Errors()...)
+}
diff --git a/ai-chat-service/proto/chat.pb.go b/ai-chat-service/proto/chat.pb.go
new file mode 100644
index 0000000..317c678
--- /dev/null
+++ b/ai-chat-service/proto/chat.pb.go
@@ -0,0 +1,1000 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.28.1
+// protoc v4.22.0
+// source: proto/chat.proto
+
+package proto
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type ChatCompletionRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
+ Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+ Pid string `protobuf:"bytes,3,opt,name=pid,json=p_id,proto3" json:"pid,omitempty"`
+ EnableContext bool `protobuf:"varint,4,opt,name=enableContext,json=enable_context,proto3" json:"enableContext,omitempty"`
+ ChatParam *ChatParam `protobuf:"bytes,5,opt,name=chatParam,json=chat_param,proto3" json:"chatParam,omitempty"`
+}
+
+func (x *ChatCompletionRequest) Reset() {
+ *x = ChatCompletionRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_chat_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ChatCompletionRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChatCompletionRequest) ProtoMessage() {}
+
+func (x *ChatCompletionRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_chat_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ChatCompletionRequest.ProtoReflect.Descriptor instead.
+func (*ChatCompletionRequest) Descriptor() ([]byte, []int) {
+ return file_proto_chat_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *ChatCompletionRequest) GetMessage() string {
+ if x != nil {
+ return x.Message
+ }
+ return ""
+}
+
+func (x *ChatCompletionRequest) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *ChatCompletionRequest) GetPid() string {
+ if x != nil {
+ return x.Pid
+ }
+ return ""
+}
+
+func (x *ChatCompletionRequest) GetEnableContext() bool {
+ if x != nil {
+ return x.EnableContext
+ }
+ return false
+}
+
+func (x *ChatCompletionRequest) GetChatParam() *ChatParam {
+ if x != nil {
+ return x.ChatParam
+ }
+ return nil
+}
+
+type ChatParam struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Model string `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"`
+ MaxTokens int32 `protobuf:"varint,2,opt,name=maxTokens,json=max_tokens,proto3" json:"maxTokens,omitempty"`
+ Temperature float32 `protobuf:"fixed32,3,opt,name=temperature,proto3" json:"temperature,omitempty"`
+ TopP float32 `protobuf:"fixed32,4,opt,name=topP,json=top_p,proto3" json:"topP,omitempty"`
+ PresencePenalty float32 `protobuf:"fixed32,5,opt,name=presencePenalty,json=presence_penalty,proto3" json:"presencePenalty,omitempty"`
+ FrequencyPenalty float32 `protobuf:"fixed32,6,opt,name=frequencyPenalty,json=frequency_penalty,proto3" json:"frequencyPenalty,omitempty"`
+ BotDesc string `protobuf:"bytes,7,opt,name=botDesc,json=bot_desc,proto3" json:"botDesc,omitempty"`
+ MinResponseTokens int32 `protobuf:"varint,8,opt,name=minResponseTokens,json=min_response_tokens,proto3" json:"minResponseTokens,omitempty"`
+ ContextTTL int32 `protobuf:"varint,9,opt,name=contextTTL,json=context_ttl,proto3" json:"contextTTL,omitempty"`
+ ContextLen int32 `protobuf:"varint,10,opt,name=contextLen,json=context_len,proto3" json:"contextLen,omitempty"`
+}
+
+func (x *ChatParam) Reset() {
+ *x = ChatParam{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_chat_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ChatParam) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChatParam) ProtoMessage() {}
+
+func (x *ChatParam) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_chat_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ChatParam.ProtoReflect.Descriptor instead.
+func (*ChatParam) Descriptor() ([]byte, []int) {
+ return file_proto_chat_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *ChatParam) GetModel() string {
+ if x != nil {
+ return x.Model
+ }
+ return ""
+}
+
+func (x *ChatParam) GetMaxTokens() int32 {
+ if x != nil {
+ return x.MaxTokens
+ }
+ return 0
+}
+
+func (x *ChatParam) GetTemperature() float32 {
+ if x != nil {
+ return x.Temperature
+ }
+ return 0
+}
+
+func (x *ChatParam) GetTopP() float32 {
+ if x != nil {
+ return x.TopP
+ }
+ return 0
+}
+
+func (x *ChatParam) GetPresencePenalty() float32 {
+ if x != nil {
+ return x.PresencePenalty
+ }
+ return 0
+}
+
+func (x *ChatParam) GetFrequencyPenalty() float32 {
+ if x != nil {
+ return x.FrequencyPenalty
+ }
+ return 0
+}
+
+func (x *ChatParam) GetBotDesc() string {
+ if x != nil {
+ return x.BotDesc
+ }
+ return ""
+}
+
+func (x *ChatParam) GetMinResponseTokens() int32 {
+ if x != nil {
+ return x.MinResponseTokens
+ }
+ return 0
+}
+
+func (x *ChatParam) GetContextTTL() int32 {
+ if x != nil {
+ return x.ContextTTL
+ }
+ return 0
+}
+
+func (x *ChatParam) GetContextLen() int32 {
+ if x != nil {
+ return x.ContextLen
+ }
+ return 0
+}
+
+// 服务响应消息,非流式响应
+type ChatCompletionResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+ Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"`
+ Created int64 `protobuf:"varint,3,opt,name=created,proto3" json:"created,omitempty"`
+ Model string `protobuf:"bytes,4,opt,name=model,proto3" json:"model,omitempty"`
+ Choices []*ChatCompletionChoice `protobuf:"bytes,5,rep,name=choices,proto3" json:"choices,omitempty"`
+ Usage *Usage `protobuf:"bytes,6,opt,name=usage,proto3" json:"usage,omitempty"`
+}
+
+func (x *ChatCompletionResponse) Reset() {
+ *x = ChatCompletionResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_chat_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ChatCompletionResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChatCompletionResponse) ProtoMessage() {}
+
+func (x *ChatCompletionResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_chat_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ChatCompletionResponse.ProtoReflect.Descriptor instead.
+func (*ChatCompletionResponse) Descriptor() ([]byte, []int) {
+ return file_proto_chat_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ChatCompletionResponse) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *ChatCompletionResponse) GetObject() string {
+ if x != nil {
+ return x.Object
+ }
+ return ""
+}
+
+func (x *ChatCompletionResponse) GetCreated() int64 {
+ if x != nil {
+ return x.Created
+ }
+ return 0
+}
+
+func (x *ChatCompletionResponse) GetModel() string {
+ if x != nil {
+ return x.Model
+ }
+ return ""
+}
+
+func (x *ChatCompletionResponse) GetChoices() []*ChatCompletionChoice {
+ if x != nil {
+ return x.Choices
+ }
+ return nil
+}
+
+func (x *ChatCompletionResponse) GetUsage() *Usage {
+ if x != nil {
+ return x.Usage
+ }
+ return nil
+}
+
+type ChatCompletionChoice struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"`
+ Message *ChatCompletionMessage `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
+ FinishReason string `protobuf:"bytes,3,opt,name=finishReason,json=finish_reason,proto3" json:"finishReason,omitempty"`
+}
+
+func (x *ChatCompletionChoice) Reset() {
+ *x = ChatCompletionChoice{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_chat_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ChatCompletionChoice) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChatCompletionChoice) ProtoMessage() {}
+
+func (x *ChatCompletionChoice) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_chat_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ChatCompletionChoice.ProtoReflect.Descriptor instead.
+func (*ChatCompletionChoice) Descriptor() ([]byte, []int) {
+ return file_proto_chat_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *ChatCompletionChoice) GetIndex() int32 {
+ if x != nil {
+ return x.Index
+ }
+ return 0
+}
+
+func (x *ChatCompletionChoice) GetMessage() *ChatCompletionMessage {
+ if x != nil {
+ return x.Message
+ }
+ return nil
+}
+
+func (x *ChatCompletionChoice) GetFinishReason() string {
+ if x != nil {
+ return x.FinishReason
+ }
+ return ""
+}
+
+type ChatCompletionMessage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"`
+ Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"`
+ Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *ChatCompletionMessage) Reset() {
+ *x = ChatCompletionMessage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_chat_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ChatCompletionMessage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChatCompletionMessage) ProtoMessage() {}
+
+func (x *ChatCompletionMessage) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_chat_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ChatCompletionMessage.ProtoReflect.Descriptor instead.
+func (*ChatCompletionMessage) Descriptor() ([]byte, []int) {
+ return file_proto_chat_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *ChatCompletionMessage) GetRole() string {
+ if x != nil {
+ return x.Role
+ }
+ return ""
+}
+
+func (x *ChatCompletionMessage) GetContent() string {
+ if x != nil {
+ return x.Content
+ }
+ return ""
+}
+
+func (x *ChatCompletionMessage) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+type Usage struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ PromptTokens int32 `protobuf:"varint,1,opt,name=promptTokens,json=prompt_tokens,proto3" json:"promptTokens,omitempty"`
+ CompletionTokens int32 `protobuf:"varint,2,opt,name=completionTokens,json=completion_tokens,proto3" json:"completionTokens,omitempty"`
+ TotalTokens int32 `protobuf:"varint,3,opt,name=totalTokens,json=total_tokens,proto3" json:"totalTokens,omitempty"`
+}
+
+func (x *Usage) Reset() {
+ *x = Usage{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_chat_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Usage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Usage) ProtoMessage() {}
+
+func (x *Usage) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_chat_proto_msgTypes[5]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Usage.ProtoReflect.Descriptor instead.
+func (*Usage) Descriptor() ([]byte, []int) {
+ return file_proto_chat_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *Usage) GetPromptTokens() int32 {
+ if x != nil {
+ return x.PromptTokens
+ }
+ return 0
+}
+
+func (x *Usage) GetCompletionTokens() int32 {
+ if x != nil {
+ return x.CompletionTokens
+ }
+ return 0
+}
+
+func (x *Usage) GetTotalTokens() int32 {
+ if x != nil {
+ return x.TotalTokens
+ }
+ return 0
+}
+
+// 服务响应消息,流式响应
+type ChatCompletionStreamResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+ Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"`
+ Created int64 `protobuf:"varint,3,opt,name=created,proto3" json:"created,omitempty"`
+ Model string `protobuf:"bytes,4,opt,name=model,proto3" json:"model,omitempty"`
+ Choices []*ChatCompletionStreamChoice `protobuf:"bytes,5,rep,name=choices,proto3" json:"choices,omitempty"`
+}
+
+func (x *ChatCompletionStreamResponse) Reset() {
+ *x = ChatCompletionStreamResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_chat_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ChatCompletionStreamResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChatCompletionStreamResponse) ProtoMessage() {}
+
+func (x *ChatCompletionStreamResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_chat_proto_msgTypes[6]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ChatCompletionStreamResponse.ProtoReflect.Descriptor instead.
+func (*ChatCompletionStreamResponse) Descriptor() ([]byte, []int) {
+ return file_proto_chat_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *ChatCompletionStreamResponse) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *ChatCompletionStreamResponse) GetObject() string {
+ if x != nil {
+ return x.Object
+ }
+ return ""
+}
+
+func (x *ChatCompletionStreamResponse) GetCreated() int64 {
+ if x != nil {
+ return x.Created
+ }
+ return 0
+}
+
+func (x *ChatCompletionStreamResponse) GetModel() string {
+ if x != nil {
+ return x.Model
+ }
+ return ""
+}
+
+func (x *ChatCompletionStreamResponse) GetChoices() []*ChatCompletionStreamChoice {
+ if x != nil {
+ return x.Choices
+ }
+ return nil
+}
+
+type ChatCompletionStreamChoice struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"`
+ Delta *ChatCompletionStreamChoiceDelta `protobuf:"bytes,2,opt,name=delta,proto3" json:"delta,omitempty"`
+ FinishReason string `protobuf:"bytes,3,opt,name=finishReason,json=finish_reason,proto3" json:"finishReason,omitempty"`
+}
+
+func (x *ChatCompletionStreamChoice) Reset() {
+ *x = ChatCompletionStreamChoice{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_chat_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ChatCompletionStreamChoice) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChatCompletionStreamChoice) ProtoMessage() {}
+
+func (x *ChatCompletionStreamChoice) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_chat_proto_msgTypes[7]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ChatCompletionStreamChoice.ProtoReflect.Descriptor instead.
+func (*ChatCompletionStreamChoice) Descriptor() ([]byte, []int) {
+ return file_proto_chat_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *ChatCompletionStreamChoice) GetIndex() int32 {
+ if x != nil {
+ return x.Index
+ }
+ return 0
+}
+
+func (x *ChatCompletionStreamChoice) GetDelta() *ChatCompletionStreamChoiceDelta {
+ if x != nil {
+ return x.Delta
+ }
+ return nil
+}
+
+func (x *ChatCompletionStreamChoice) GetFinishReason() string {
+ if x != nil {
+ return x.FinishReason
+ }
+ return ""
+}
+
+type ChatCompletionStreamChoiceDelta struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"`
+ Role string `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"`
+}
+
+func (x *ChatCompletionStreamChoiceDelta) Reset() {
+ *x = ChatCompletionStreamChoiceDelta{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_chat_proto_msgTypes[8]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ChatCompletionStreamChoiceDelta) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChatCompletionStreamChoiceDelta) ProtoMessage() {}
+
+func (x *ChatCompletionStreamChoiceDelta) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_chat_proto_msgTypes[8]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ChatCompletionStreamChoiceDelta.ProtoReflect.Descriptor instead.
+func (*ChatCompletionStreamChoiceDelta) Descriptor() ([]byte, []int) {
+ return file_proto_chat_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *ChatCompletionStreamChoiceDelta) GetContent() string {
+ if x != nil {
+ return x.Content
+ }
+ return ""
+}
+
+func (x *ChatCompletionStreamChoiceDelta) GetRole() string {
+ if x != nil {
+ return x.Role
+ }
+ return ""
+}
+
+var File_proto_chat_proto protoreflect.FileDescriptor
+
+var file_proto_chat_proto_rawDesc = []byte{
+ 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x12, 0x1a, 0x61, 0x69, 0x5f, 0x63, 0x68, 0x61, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76,
+ 0x69, 0x63, 0x65, 0x2e, 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x22, 0xc1,
+ 0x01, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f,
+ 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+ 0x69, 0x64, 0x12, 0x11, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x04, 0x70, 0x5f, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x0d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43,
+ 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x6e,
+ 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x44, 0x0a, 0x09,
+ 0x63, 0x68, 0x61, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x25, 0x2e, 0x61, 0x69, 0x5f, 0x63, 0x68, 0x61, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2e, 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x43, 0x68, 0x61,
+ 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x74, 0x5f, 0x70, 0x61, 0x72,
+ 0x61, 0x6d, 0x22, 0xdc, 0x02, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d,
+ 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x1d, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x54, 0x6f, 0x6b,
+ 0x65, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x74,
+ 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61,
+ 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x74, 0x65, 0x6d, 0x70,
+ 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x13, 0x0a, 0x04, 0x74, 0x6f, 0x70, 0x50, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x12, 0x29, 0x0a, 0x0f,
+ 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18,
+ 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f,
+ 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x10, 0x66, 0x72, 0x65, 0x71, 0x75,
+ 0x65, 0x6e, 0x63, 0x79, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28,
+ 0x02, 0x52, 0x11, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x65, 0x6e,
+ 0x61, 0x6c, 0x74, 0x79, 0x12, 0x19, 0x0a, 0x07, 0x62, 0x6f, 0x74, 0x44, 0x65, 0x73, 0x63, 0x18,
+ 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x6f, 0x74, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x12,
+ 0x2e, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x6f,
+ 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6d, 0x69, 0x6e, 0x5f,
+ 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12,
+ 0x1f, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x54, 0x54, 0x4c, 0x18, 0x09, 0x20,
+ 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x74, 0x6c,
+ 0x12, 0x1f, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4c, 0x65, 0x6e, 0x18, 0x0a,
+ 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6c, 0x65,
+ 0x6e, 0x22, 0xf5, 0x01, 0x0a, 0x16, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65,
+ 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02,
+ 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x14,
+ 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d,
+ 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x4a, 0x0a, 0x07, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x18,
+ 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x69, 0x5f, 0x63, 0x68, 0x61, 0x74, 0x5f,
+ 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63,
+ 0x6f, 0x6d, 0x2e, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f,
+ 0x6e, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x07, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x73,
+ 0x12, 0x37, 0x0a, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x21, 0x2e, 0x61, 0x69, 0x5f, 0x63, 0x68, 0x61, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2e, 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x55, 0x73, 0x61,
+ 0x67, 0x65, 0x52, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x14, 0x43, 0x68,
+ 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x6f, 0x69,
+ 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4b, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x69, 0x5f, 0x63,
+ 0x68, 0x61, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x7a, 0x76, 0x6f, 0x69,
+ 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c,
+ 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x6d, 0x65,
+ 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x52,
+ 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x69, 0x6e,
+ 0x69, 0x73, 0x68, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x59, 0x0a, 0x15, 0x43, 0x68,
+ 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73,
+ 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+ 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7c, 0x0a, 0x05, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x23,
+ 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x5f, 0x74, 0x6f, 0x6b,
+ 0x65, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f,
+ 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63,
+ 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73,
+ 0x12, 0x21, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x6f, 0x6b,
+ 0x65, 0x6e, 0x73, 0x22, 0xc8, 0x01, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70,
+ 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07,
+ 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x50, 0x0a, 0x07,
+ 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e,
+ 0x61, 0x69, 0x5f, 0x63, 0x68, 0x61, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
+ 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x43, 0x68, 0x61, 0x74, 0x43,
+ 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43,
+ 0x68, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x07, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x22, 0xaa,
+ 0x01, 0x0a, 0x1a, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f,
+ 0x6e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x12, 0x14, 0x0a,
+ 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e,
+ 0x64, 0x65, 0x78, 0x12, 0x51, 0x0a, 0x05, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x61, 0x69, 0x5f, 0x63, 0x68, 0x61, 0x74, 0x5f, 0x73, 0x65, 0x72,
+ 0x76, 0x69, 0x63, 0x65, 0x2e, 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2e,
+ 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74,
+ 0x72, 0x65, 0x61, 0x6d, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52,
+ 0x05, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68,
+ 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x69,
+ 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x4f, 0x0a, 0x1f, 0x43,
+ 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72,
+ 0x65, 0x61, 0x6d, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x18,
+ 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x32, 0x87, 0x02, 0x0a,
+ 0x04, 0x43, 0x68, 0x61, 0x74, 0x12, 0x77, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d,
+ 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x61, 0x69, 0x5f, 0x63, 0x68, 0x61,
+ 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65,
+ 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74,
+ 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x69, 0x5f,
+ 0x63, 0x68, 0x61, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x7a, 0x76, 0x6f,
+ 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70,
+ 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85,
+ 0x01, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f,
+ 0x6e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x31, 0x2e, 0x61, 0x69, 0x5f, 0x63, 0x68, 0x61,
+ 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65,
+ 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74,
+ 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x69, 0x5f,
+ 0x63, 0x68, 0x61, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x7a, 0x76, 0x6f,
+ 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70,
+ 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, 0x17, 0x5a, 0x15, 0x61, 0x69, 0x2d, 0x63, 0x68, 0x61,
+ 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+ 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_proto_chat_proto_rawDescOnce sync.Once
+ file_proto_chat_proto_rawDescData = file_proto_chat_proto_rawDesc
+)
+
+func file_proto_chat_proto_rawDescGZIP() []byte {
+ file_proto_chat_proto_rawDescOnce.Do(func() {
+ file_proto_chat_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_chat_proto_rawDescData)
+ })
+ return file_proto_chat_proto_rawDescData
+}
+
+var file_proto_chat_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
+var file_proto_chat_proto_goTypes = []interface{}{
+ (*ChatCompletionRequest)(nil), // 0: ai_chat_service.zvoice.com.ChatCompletionRequest
+ (*ChatParam)(nil), // 1: ai_chat_service.zvoice.com.ChatParam
+ (*ChatCompletionResponse)(nil), // 2: ai_chat_service.zvoice.com.ChatCompletionResponse
+ (*ChatCompletionChoice)(nil), // 3: ai_chat_service.zvoice.com.ChatCompletionChoice
+ (*ChatCompletionMessage)(nil), // 4: ai_chat_service.zvoice.com.ChatCompletionMessage
+ (*Usage)(nil), // 5: ai_chat_service.zvoice.com.Usage
+ (*ChatCompletionStreamResponse)(nil), // 6: ai_chat_service.zvoice.com.ChatCompletionStreamResponse
+ (*ChatCompletionStreamChoice)(nil), // 7: ai_chat_service.zvoice.com.ChatCompletionStreamChoice
+ (*ChatCompletionStreamChoiceDelta)(nil), // 8: ai_chat_service.zvoice.com.ChatCompletionStreamChoiceDelta
+}
+var file_proto_chat_proto_depIdxs = []int32{
+ 1, // 0: ai_chat_service.zvoice.com.ChatCompletionRequest.chatParam:type_name -> ai_chat_service.zvoice.com.ChatParam
+ 3, // 1: ai_chat_service.zvoice.com.ChatCompletionResponse.choices:type_name -> ai_chat_service.zvoice.com.ChatCompletionChoice
+ 5, // 2: ai_chat_service.zvoice.com.ChatCompletionResponse.usage:type_name -> ai_chat_service.zvoice.com.Usage
+ 4, // 3: ai_chat_service.zvoice.com.ChatCompletionChoice.message:type_name -> ai_chat_service.zvoice.com.ChatCompletionMessage
+ 7, // 4: ai_chat_service.zvoice.com.ChatCompletionStreamResponse.choices:type_name -> ai_chat_service.zvoice.com.ChatCompletionStreamChoice
+ 8, // 5: ai_chat_service.zvoice.com.ChatCompletionStreamChoice.delta:type_name -> ai_chat_service.zvoice.com.ChatCompletionStreamChoiceDelta
+ 0, // 6: ai_chat_service.zvoice.com.Chat.ChatCompletion:input_type -> ai_chat_service.zvoice.com.ChatCompletionRequest
+ 0, // 7: ai_chat_service.zvoice.com.Chat.ChatCompletionStream:input_type -> ai_chat_service.zvoice.com.ChatCompletionRequest
+ 2, // 8: ai_chat_service.zvoice.com.Chat.ChatCompletion:output_type -> ai_chat_service.zvoice.com.ChatCompletionResponse
+ 6, // 9: ai_chat_service.zvoice.com.Chat.ChatCompletionStream:output_type -> ai_chat_service.zvoice.com.ChatCompletionStreamResponse
+ 8, // [8:10] is the sub-list for method output_type
+ 6, // [6:8] is the sub-list for method input_type
+ 6, // [6:6] is the sub-list for extension type_name
+ 6, // [6:6] is the sub-list for extension extendee
+ 0, // [0:6] is the sub-list for field type_name
+}
+
+func init() { file_proto_chat_proto_init() }
+func file_proto_chat_proto_init() {
+ if File_proto_chat_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_proto_chat_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ChatCompletionRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_chat_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ChatParam); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_chat_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ChatCompletionResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_chat_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ChatCompletionChoice); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_chat_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ChatCompletionMessage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_chat_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Usage); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_chat_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ChatCompletionStreamResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_chat_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ChatCompletionStreamChoice); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_chat_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ChatCompletionStreamChoiceDelta); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_proto_chat_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 9,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_proto_chat_proto_goTypes,
+ DependencyIndexes: file_proto_chat_proto_depIdxs,
+ MessageInfos: file_proto_chat_proto_msgTypes,
+ }.Build()
+ File_proto_chat_proto = out.File
+ file_proto_chat_proto_rawDesc = nil
+ file_proto_chat_proto_goTypes = nil
+ file_proto_chat_proto_depIdxs = nil
+}
diff --git a/ai-chat-service/proto/chat.proto b/ai-chat-service/proto/chat.proto
new file mode 100644
index 0000000..2116992
--- /dev/null
+++ b/ai-chat-service/proto/chat.proto
@@ -0,0 +1,72 @@
+syntax = "proto3";
+option go_package = "ai-chat-service/proto";
+package ai_chat_service.zvoice.com;
+
+message ChatCompletionRequest {
+ string message = 1[json_name = "message"];
+ string id = 2[json_name = "id"];
+ string pid = 3[json_name = "p_id"];
+ bool enableContext = 4[json_name = "enable_context"];
+ ChatParam chatParam = 5[json_name = "chat_param"];
+}
+
+message ChatParam {
+ string model = 1[json_name = "model"];
+ int32 maxTokens = 2[json_name = "max_tokens"];
+ float temperature = 3[json_name = "temperature"];
+ float topP = 4[json_name = "top_p"];
+ float presencePenalty = 5[json_name = "presence_penalty"];
+ float frequencyPenalty = 6[json_name = "frequency_penalty"];
+ string botDesc =7[json_name = "bot_desc"];
+ int32 minResponseTokens = 8[json_name = "min_response_tokens"];
+ int32 contextTTL = 9[json_name = "context_ttl"];
+ int32 contextLen = 10[json_name = "context_len"];
+}
+
+// 服务响应消息,非流式响应
+message ChatCompletionResponse {
+ string id = 1 [json_name = "id"];
+ string object = 2 [json_name = "object"];
+ int64 created = 3 [json_name = "created"];
+ string model = 4 [json_name = "model"];
+ repeated ChatCompletionChoice choices = 5 [json_name = "choices"];
+ Usage usage = 6[json_name = "usage"];
+}
+message ChatCompletionChoice {
+ int32 index = 1[json_name = "index"];
+ ChatCompletionMessage message = 2 [json_name = "message"];
+ string finishReason = 3[json_name = "finish_reason"];
+}
+message ChatCompletionMessage {
+ string role=1[json_name = "role"];
+ string content=2[json_name = "content"];
+ string name=3[json_name = "name"];
+}
+message Usage {
+ int32 promptTokens = 1 [json_name = "prompt_tokens"];
+ int32 completionTokens =2 [json_name = "completion_tokens"];
+ int32 totalTokens = 3 [json_name = "total_tokens"];
+}
+
+// 服务响应消息,流式响应
+message ChatCompletionStreamResponse {
+ string id = 1 [json_name = "id"];
+ string object = 2 [json_name = "object"];
+ int64 created = 3 [json_name = "created"];
+ string model = 4 [json_name = "model"];
+ repeated ChatCompletionStreamChoice choices = 5 [json_name = "choices"];
+}
+message ChatCompletionStreamChoice {
+ int32 index = 1[json_name = "index"];
+ ChatCompletionStreamChoiceDelta delta =2 [json_name = "delta"];
+ string finishReason = 3[json_name="finish_reason"];
+}
+message ChatCompletionStreamChoiceDelta {
+ string content = 1 [json_name = "content"];
+ string role = 2 [json_name = "role"];
+}
+
+service Chat {
+ rpc ChatCompletion(ChatCompletionRequest) returns (ChatCompletionResponse);
+ rpc ChatCompletionStream(ChatCompletionRequest) returns (stream ChatCompletionStreamResponse);
+}
\ No newline at end of file
diff --git a/ai-chat-service/proto/chat_grpc.pb.go b/ai-chat-service/proto/chat_grpc.pb.go
new file mode 100644
index 0000000..f62560c
--- /dev/null
+++ b/ai-chat-service/proto/chat_grpc.pb.go
@@ -0,0 +1,169 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.2.0
+// - protoc v4.22.0
+// source: proto/chat.proto
+
+package proto
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// ChatClient is the client API for Chat service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type ChatClient interface {
+ ChatCompletion(ctx context.Context, in *ChatCompletionRequest, opts ...grpc.CallOption) (*ChatCompletionResponse, error)
+ ChatCompletionStream(ctx context.Context, in *ChatCompletionRequest, opts ...grpc.CallOption) (Chat_ChatCompletionStreamClient, error)
+}
+
+type chatClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewChatClient(cc grpc.ClientConnInterface) ChatClient {
+ return &chatClient{cc}
+}
+
+func (c *chatClient) ChatCompletion(ctx context.Context, in *ChatCompletionRequest, opts ...grpc.CallOption) (*ChatCompletionResponse, error) {
+ out := new(ChatCompletionResponse)
+ err := c.cc.Invoke(ctx, "/ai_chat_service.zvoice.com.Chat/ChatCompletion", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *chatClient) ChatCompletionStream(ctx context.Context, in *ChatCompletionRequest, opts ...grpc.CallOption) (Chat_ChatCompletionStreamClient, error) {
+ stream, err := c.cc.NewStream(ctx, &Chat_ServiceDesc.Streams[0], "/ai_chat_service.zvoice.com.Chat/ChatCompletionStream", opts...)
+ if err != nil {
+ return nil, err
+ }
+ x := &chatChatCompletionStreamClient{stream}
+ if err := x.ClientStream.SendMsg(in); err != nil {
+ return nil, err
+ }
+ if err := x.ClientStream.CloseSend(); err != nil {
+ return nil, err
+ }
+ return x, nil
+}
+
+type Chat_ChatCompletionStreamClient interface {
+ Recv() (*ChatCompletionStreamResponse, error)
+ grpc.ClientStream
+}
+
+type chatChatCompletionStreamClient struct {
+ grpc.ClientStream
+}
+
+func (x *chatChatCompletionStreamClient) Recv() (*ChatCompletionStreamResponse, error) {
+ m := new(ChatCompletionStreamResponse)
+ if err := x.ClientStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+// ChatServer is the server API for Chat service.
+// All implementations must embed UnimplementedChatServer
+// for forward compatibility
+type ChatServer interface {
+ ChatCompletion(context.Context, *ChatCompletionRequest) (*ChatCompletionResponse, error)
+ ChatCompletionStream(*ChatCompletionRequest, Chat_ChatCompletionStreamServer) error
+ mustEmbedUnimplementedChatServer()
+}
+
+// UnimplementedChatServer must be embedded to have forward compatible implementations.
+type UnimplementedChatServer struct {
+}
+
+func (UnimplementedChatServer) ChatCompletion(context.Context, *ChatCompletionRequest) (*ChatCompletionResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ChatCompletion not implemented")
+}
+func (UnimplementedChatServer) ChatCompletionStream(*ChatCompletionRequest, Chat_ChatCompletionStreamServer) error {
+ return status.Errorf(codes.Unimplemented, "method ChatCompletionStream not implemented")
+}
+func (UnimplementedChatServer) mustEmbedUnimplementedChatServer() {}
+
+// UnsafeChatServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to ChatServer will
+// result in compilation errors.
+type UnsafeChatServer interface {
+ mustEmbedUnimplementedChatServer()
+}
+
+func RegisterChatServer(s grpc.ServiceRegistrar, srv ChatServer) {
+ s.RegisterService(&Chat_ServiceDesc, srv)
+}
+
+func _Chat_ChatCompletion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(ChatCompletionRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(ChatServer).ChatCompletion(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/ai_chat_service.zvoice.com.Chat/ChatCompletion",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(ChatServer).ChatCompletion(ctx, req.(*ChatCompletionRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Chat_ChatCompletionStream_Handler(srv interface{}, stream grpc.ServerStream) error {
+ m := new(ChatCompletionRequest)
+ if err := stream.RecvMsg(m); err != nil {
+ return err
+ }
+ return srv.(ChatServer).ChatCompletionStream(m, &chatChatCompletionStreamServer{stream})
+}
+
+type Chat_ChatCompletionStreamServer interface {
+ Send(*ChatCompletionStreamResponse) error
+ grpc.ServerStream
+}
+
+type chatChatCompletionStreamServer struct {
+ grpc.ServerStream
+}
+
+func (x *chatChatCompletionStreamServer) Send(m *ChatCompletionStreamResponse) error {
+ return x.ServerStream.SendMsg(m)
+}
+
+// Chat_ServiceDesc is the grpc.ServiceDesc for Chat service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var Chat_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "ai_chat_service.zvoice.com.Chat",
+ HandlerType: (*ChatServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "ChatCompletion",
+ Handler: _Chat_ChatCompletion_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{
+ {
+ StreamName: "ChatCompletionStream",
+ Handler: _Chat_ChatCompletionStream_Handler,
+ ServerStreams: true,
+ },
+ },
+ Metadata: "proto/chat.proto",
+}
diff --git a/ai-chat-service/runtime/logs/app.log b/ai-chat-service/runtime/logs/app.log
new file mode 100644
index 0000000..6f04191
--- /dev/null
+++ b/ai-chat-service/runtime/logs/app.log
@@ -0,0 +1 @@
+time="2024-09-20T14:44:21+08:00" level=error msg="grpc: no transport security set (use grpc.WithTransportCredentials(insecure.NewCredentials()) explicitly or set credentials)" file="E:/Work/Code/go/5.0/2404/ai-chat/ai-chat-service/services/grpc-client/grpc_client_pool.go:25" func=ai-chat-service/services/grpc-client.NewPool.func1
diff --git a/ai-chat-service/services/grpc-client/default.go b/ai-chat-service/services/grpc-client/default.go
new file mode 100644
index 0000000..5c23a12
--- /dev/null
+++ b/ai-chat-service/services/grpc-client/default.go
@@ -0,0 +1,28 @@
+package grpc_client
+
+import (
+ "ai-chat-service/pkg/log"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+)
+
+type ServiceClient interface {
+ GetPool(addr string) ClientPool
+}
+type DefaultClient struct {
+}
+
+func (c *DefaultClient) GetPool(addr string) ClientPool {
+ pool, err := NewPool(addr, c.getOptions()...)
+ if err != nil {
+ log.Error(err)
+ return nil
+ }
+ return pool
+}
+
+func (c *DefaultClient) getOptions() []grpc.DialOption {
+ opts := make([]grpc.DialOption, 0)
+ opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials()))
+ return opts
+}
diff --git a/ai-chat-service/services/grpc-client/grpc_client_pool.go b/ai-chat-service/services/grpc-client/grpc_client_pool.go
new file mode 100644
index 0000000..9674393
--- /dev/null
+++ b/ai-chat-service/services/grpc-client/grpc_client_pool.go
@@ -0,0 +1,48 @@
+package grpc_client
+
+import (
+ "ai-chat-service/pkg/log"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/connectivity"
+ "sync"
+)
+
+type ClientPool interface {
+ Get() *grpc.ClientConn
+ Put(*grpc.ClientConn)
+}
+
+type clientPool struct {
+ pool sync.Pool
+}
+
+func NewPool(target string, opts ...grpc.DialOption) (ClientPool, error) {
+ return &clientPool{
+ pool: sync.Pool{
+ New: func() any {
+ conn, err := grpc.NewClient(target, opts...)
+ if err != nil {
+ log.Error(err)
+ return nil
+ }
+ return conn
+ },
+ },
+ }, nil
+}
+
+func (c *clientPool) Get() *grpc.ClientConn {
+ conn := c.pool.Get().(*grpc.ClientConn)
+ if conn.GetState() == connectivity.Shutdown || conn.GetState() == connectivity.TransientFailure {
+ conn.Close()
+ conn = c.pool.New().(*grpc.ClientConn)
+ }
+ return conn
+}
+func (c *clientPool) Put(conn *grpc.ClientConn) {
+ if conn.GetState() == connectivity.Shutdown || conn.GetState() == connectivity.TransientFailure {
+ conn.Close()
+ return
+ }
+ c.pool.Put(conn)
+}
diff --git a/ai-chat-service/services/keywords-filter/keywords.go b/ai-chat-service/services/keywords-filter/keywords.go
new file mode 100644
index 0000000..0e3dcc6
--- /dev/null
+++ b/ai-chat-service/services/keywords-filter/keywords.go
@@ -0,0 +1,23 @@
+package keywords_filter
+
+import (
+ "ai-chat-service/pkg/config"
+ grpc_client "ai-chat-service/services/grpc-client"
+ "sync"
+)
+
+var keywordsPool grpc_client.ClientPool
+var keywordsOnce sync.Once
+
+type keywordsClient struct {
+ grpc_client.DefaultClient
+}
+
+func GetKeywordsClientPool() grpc_client.ClientPool {
+ keywordsOnce.Do(func() {
+ cnf := config.GetConfig()
+ c := &keywordsClient{}
+ keywordsPool = c.GetPool(cnf.DependOn.Keywords.Address)
+ })
+ return keywordsPool
+}
diff --git a/ai-chat-service/services/keywords-filter/proto/filter.pb.go b/ai-chat-service/services/keywords-filter/proto/filter.pb.go
new file mode 100644
index 0000000..31da090
--- /dev/null
+++ b/ai-chat-service/services/keywords-filter/proto/filter.pb.go
@@ -0,0 +1,294 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.28.1
+// protoc v4.22.0
+// source: proto/filter.proto
+
+package proto
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type FilterReq struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+}
+
+func (x *FilterReq) Reset() {
+ *x = FilterReq{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_filter_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *FilterReq) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FilterReq) ProtoMessage() {}
+
+func (x *FilterReq) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_filter_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use FilterReq.ProtoReflect.Descriptor instead.
+func (*FilterReq) Descriptor() ([]byte, []int) {
+ return file_proto_filter_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *FilterReq) GetText() string {
+ if x != nil {
+ return x.Text
+ }
+ return ""
+}
+
+type ValidateRes struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"`
+ Keyword string `protobuf:"bytes,2,opt,name=keyword,proto3" json:"keyword,omitempty"`
+}
+
+func (x *ValidateRes) Reset() {
+ *x = ValidateRes{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_filter_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ValidateRes) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ValidateRes) ProtoMessage() {}
+
+func (x *ValidateRes) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_filter_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ValidateRes.ProtoReflect.Descriptor instead.
+func (*ValidateRes) Descriptor() ([]byte, []int) {
+ return file_proto_filter_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *ValidateRes) GetOk() bool {
+ if x != nil {
+ return x.Ok
+ }
+ return false
+}
+
+func (x *ValidateRes) GetKeyword() string {
+ if x != nil {
+ return x.Keyword
+ }
+ return ""
+}
+
+type FindAllRes struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Keywords []string `protobuf:"bytes,1,rep,name=keywords,proto3" json:"keywords,omitempty"`
+}
+
+func (x *FindAllRes) Reset() {
+ *x = FindAllRes{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_filter_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *FindAllRes) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FindAllRes) ProtoMessage() {}
+
+func (x *FindAllRes) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_filter_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use FindAllRes.ProtoReflect.Descriptor instead.
+func (*FindAllRes) Descriptor() ([]byte, []int) {
+ return file_proto_filter_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *FindAllRes) GetKeywords() []string {
+ if x != nil {
+ return x.Keywords
+ }
+ return nil
+}
+
+var File_proto_filter_proto protoreflect.FileDescriptor
+
+var file_proto_filter_proto_rawDesc = []byte{
+ 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5f, 0x66,
+ 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d,
+ 0x22, 0x1f, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a,
+ 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78,
+ 0x74, 0x22, 0x37, 0x0a, 0x0b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73,
+ 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b,
+ 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x28, 0x0a, 0x0a, 0x46, 0x69,
+ 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x77,
+ 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x77,
+ 0x6f, 0x72, 0x64, 0x73, 0x32, 0xbe, 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12,
+ 0x5a, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x6b, 0x65,
+ 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x7a, 0x76,
+ 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52,
+ 0x65, 0x71, 0x1a, 0x27, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5f, 0x66, 0x69,
+ 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2e,
+ 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x07, 0x46,
+ 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x12, 0x25, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64,
+ 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e,
+ 0x63, 0x6f, 0x6d, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x26, 0x2e,
+ 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e,
+ 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41,
+ 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x42, 0x17, 0x5a, 0x15, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64,
+ 0x73, 0x2d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_proto_filter_proto_rawDescOnce sync.Once
+ file_proto_filter_proto_rawDescData = file_proto_filter_proto_rawDesc
+)
+
+func file_proto_filter_proto_rawDescGZIP() []byte {
+ file_proto_filter_proto_rawDescOnce.Do(func() {
+ file_proto_filter_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_filter_proto_rawDescData)
+ })
+ return file_proto_filter_proto_rawDescData
+}
+
+var file_proto_filter_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_proto_filter_proto_goTypes = []interface{}{
+ (*FilterReq)(nil), // 0: keywords_filter.zvoice.com.FilterReq
+ (*ValidateRes)(nil), // 1: keywords_filter.zvoice.com.ValidateRes
+ (*FindAllRes)(nil), // 2: keywords_filter.zvoice.com.FindAllRes
+}
+var file_proto_filter_proto_depIdxs = []int32{
+ 0, // 0: keywords_filter.zvoice.com.Filter.Validate:input_type -> keywords_filter.zvoice.com.FilterReq
+ 0, // 1: keywords_filter.zvoice.com.Filter.FindAll:input_type -> keywords_filter.zvoice.com.FilterReq
+ 1, // 2: keywords_filter.zvoice.com.Filter.Validate:output_type -> keywords_filter.zvoice.com.ValidateRes
+ 2, // 3: keywords_filter.zvoice.com.Filter.FindAll:output_type -> keywords_filter.zvoice.com.FindAllRes
+ 2, // [2:4] is the sub-list for method output_type
+ 0, // [0:2] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_proto_filter_proto_init() }
+func file_proto_filter_proto_init() {
+ if File_proto_filter_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_proto_filter_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*FilterReq); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_filter_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ValidateRes); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_filter_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*FindAllRes); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_proto_filter_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 3,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_proto_filter_proto_goTypes,
+ DependencyIndexes: file_proto_filter_proto_depIdxs,
+ MessageInfos: file_proto_filter_proto_msgTypes,
+ }.Build()
+ File_proto_filter_proto = out.File
+ file_proto_filter_proto_rawDesc = nil
+ file_proto_filter_proto_goTypes = nil
+ file_proto_filter_proto_depIdxs = nil
+}
diff --git a/ai-chat-service/services/keywords-filter/proto/filter.proto b/ai-chat-service/services/keywords-filter/proto/filter.proto
new file mode 100644
index 0000000..1f93144
--- /dev/null
+++ b/ai-chat-service/services/keywords-filter/proto/filter.proto
@@ -0,0 +1,20 @@
+syntax = "proto3";
+option go_package = "keywords-filter/proto";
+package keywords_filter.zvoice.com;
+
+message FilterReq {
+ string text = 1;
+}
+
+message ValidateRes {
+ bool ok = 1;
+ string keyword = 2;
+}
+
+message FindAllRes {
+ repeated string keywords = 1;
+}
+service Filter {
+ rpc Validate(FilterReq) returns (ValidateRes);
+ rpc FindAll(FilterReq) returns (FindAllRes);
+}
\ No newline at end of file
diff --git a/ai-chat-service/services/keywords-filter/proto/filter_grpc.pb.go b/ai-chat-service/services/keywords-filter/proto/filter_grpc.pb.go
new file mode 100644
index 0000000..ff07e75
--- /dev/null
+++ b/ai-chat-service/services/keywords-filter/proto/filter_grpc.pb.go
@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.2.0
+// - protoc v4.22.0
+// source: proto/filter.proto
+
+package proto
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// FilterClient is the client API for Filter service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type FilterClient interface {
+ Validate(ctx context.Context, in *FilterReq, opts ...grpc.CallOption) (*ValidateRes, error)
+ FindAll(ctx context.Context, in *FilterReq, opts ...grpc.CallOption) (*FindAllRes, error)
+}
+
+type filterClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewFilterClient(cc grpc.ClientConnInterface) FilterClient {
+ return &filterClient{cc}
+}
+
+func (c *filterClient) Validate(ctx context.Context, in *FilterReq, opts ...grpc.CallOption) (*ValidateRes, error) {
+ out := new(ValidateRes)
+ err := c.cc.Invoke(ctx, "/keywords_filter.zvoice.com.Filter/Validate", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *filterClient) FindAll(ctx context.Context, in *FilterReq, opts ...grpc.CallOption) (*FindAllRes, error) {
+ out := new(FindAllRes)
+ err := c.cc.Invoke(ctx, "/keywords_filter.zvoice.com.Filter/FindAll", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// FilterServer is the server API for Filter service.
+// All implementations must embed UnimplementedFilterServer
+// for forward compatibility
+type FilterServer interface {
+ Validate(context.Context, *FilterReq) (*ValidateRes, error)
+ FindAll(context.Context, *FilterReq) (*FindAllRes, error)
+ mustEmbedUnimplementedFilterServer()
+}
+
+// UnimplementedFilterServer must be embedded to have forward compatible implementations.
+type UnimplementedFilterServer struct {
+}
+
+func (UnimplementedFilterServer) Validate(context.Context, *FilterReq) (*ValidateRes, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method Validate not implemented")
+}
+func (UnimplementedFilterServer) FindAll(context.Context, *FilterReq) (*FindAllRes, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method FindAll not implemented")
+}
+func (UnimplementedFilterServer) mustEmbedUnimplementedFilterServer() {}
+
+// UnsafeFilterServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to FilterServer will
+// result in compilation errors.
+type UnsafeFilterServer interface {
+ mustEmbedUnimplementedFilterServer()
+}
+
+func RegisterFilterServer(s grpc.ServiceRegistrar, srv FilterServer) {
+ s.RegisterService(&Filter_ServiceDesc, srv)
+}
+
+func _Filter_Validate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(FilterReq)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(FilterServer).Validate(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/keywords_filter.zvoice.com.Filter/Validate",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(FilterServer).Validate(ctx, req.(*FilterReq))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Filter_FindAll_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(FilterReq)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(FilterServer).FindAll(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/keywords_filter.zvoice.com.Filter/FindAll",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(FilterServer).FindAll(ctx, req.(*FilterReq))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// Filter_ServiceDesc is the grpc.ServiceDesc for Filter service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var Filter_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "keywords_filter.zvoice.com.Filter",
+ HandlerType: (*FilterServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "Validate",
+ Handler: _Filter_Validate_Handler,
+ },
+ {
+ MethodName: "FindAll",
+ Handler: _Filter_FindAll_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "proto/filter.proto",
+}
diff --git a/ai-chat-service/services/keywords-filter/sensitive.go b/ai-chat-service/services/keywords-filter/sensitive.go
new file mode 100644
index 0000000..8b1083e
--- /dev/null
+++ b/ai-chat-service/services/keywords-filter/sensitive.go
@@ -0,0 +1,23 @@
+package keywords_filter
+
+import (
+ "ai-chat-service/pkg/config"
+ grpc_client "ai-chat-service/services/grpc-client"
+ "sync"
+)
+
+var sensitivePool grpc_client.ClientPool
+var sensitiveOnce sync.Once
+
+type sensitiveClient struct {
+ grpc_client.DefaultClient
+}
+
+func GetSensitiveClientPool() grpc_client.ClientPool {
+ sensitiveOnce.Do(func() {
+ cnf := config.GetConfig()
+ c := &sensitiveClient{}
+ sensitivePool = c.GetPool(cnf.DependOn.Sensitive.Address)
+ })
+ return sensitivePool
+}
diff --git a/ai-chat-service/services/services.go b/ai-chat-service/services/services.go
new file mode 100644
index 0000000..eae9ae1
--- /dev/null
+++ b/ai-chat-service/services/services.go
@@ -0,0 +1,11 @@
+package services
+
+import (
+ "context"
+ "google.golang.org/grpc/metadata"
+)
+
+func AppendBearerTokenToContext(ctx context.Context, accessToken string) context.Context {
+ md := metadata.Pairs("Authorization", "Bearer "+accessToken)
+ return metadata.NewOutgoingContext(ctx, md)
+}
\ No newline at end of file
diff --git a/ai-chat-service/services/tokenizer/tokenizer.go b/ai-chat-service/services/tokenizer/tokenizer.go
new file mode 100644
index 0000000..f97d9dd
--- /dev/null
+++ b/ai-chat-service/services/tokenizer/tokenizer.go
@@ -0,0 +1,43 @@
+package tokenizer
+
+import (
+ "ai-chat-service/pkg/config"
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "github.com/sashabaranov/go-openai"
+ "net/http"
+)
+
+type tokensInfo struct {
+ Code int `json:"code"`
+ Tokens int `json:"num_tokens"`
+ Msg string `json:"msg"`
+}
+
+var httpClient = &http.Client{}
+
+func GetTokens(message *openai.ChatCompletionMessage, model string) (int, error) {
+ cnf := config.GetConfig()
+ url := fmt.Sprintf("%s/tokenizer/%s", cnf.DependOn.Tokenizer.Address, model)
+ info := &tokensInfo{}
+ if err := postJSON(url, message, info); err != nil {
+ return 0, err
+ }
+ if info.Code != 200 {
+ return 0, fmt.Errorf("%v", info.Msg)
+ }
+ return info.Tokens, nil
+}
+
+func postJSON(url string, requestData *openai.ChatCompletionMessage, responseData *tokensInfo) error {
+ requestBody, err := json.Marshal(requestData)
+ if err != nil {
+ return err
+ }
+ resp, err := httpClient.Post(url, "application/json", bytes.NewReader(requestBody))
+ if err != nil {
+ return err
+ }
+ return json.NewDecoder(resp.Body).Decode(responseData)
+}
diff --git a/chatgpt-web-backend/cmd/main.go b/chatgpt-web-backend/cmd/main.go
index 100b2b2..ee072a8 100644
--- a/chatgpt-web-backend/cmd/main.go
+++ b/chatgpt-web-backend/cmd/main.go
@@ -1,196 +1,196 @@
-package main
-
-import (
- "context"
- "fmt"
- "log"
- "net/http"
- "net/http/httputil"
- "net/url"
- "os"
- "os/exec"
- "strings"
- "time"
-
- "github.com/Arvintian/chatgpt-web/pkg/controllers"
- "github.com/Arvintian/chatgpt-web/pkg/middlewares"
- "github.com/Arvintian/chatgpt-web/pkg/utils"
- "github.com/Arvintian/go-utils/cmdutil"
- "github.com/gin-gonic/gin"
- "github.com/spf13/cobra"
- "k8s.io/klog/v2"
-)
-
-type ChatGPTWebServer struct {
- Host string `name:"host" env:"SERVER_HOST" usage:"http bind host" default:"0.0.0.0"`
- Port int `name:"port" env:"SERVER_PORT" usage:"http bind port" default:"7080"`
- BasicAuthUser string `name:"auth-user" env:"BASIC_AUTH_USER" usage:"http basic auth user"`
- BasicAuthPassword string `name:"auth-password" env:"BASIC_AUTH_PASSWORD" usage:"http basic auth password"`
- FrontendPath string `name:"frontend-path" env:"FRONTEND_PATH" default:"/app/public" usage:"frontend path"`
- SocksProxy string `name:"socks-proxy" env:"SOCKS_PROXY" usage:"socks proxy url"`
- ChatSessionTTL int `name:"chat-session-ttl" env:"CHAT_SESSION_TTL" default:"30" usage:"chat session ttl minute"`
- ChatMinResponseTokens int `name:"chat-min-response-tokens" env:"CHAT_MIN_RESPONSE_TOKENS" default:"600" usage:"chat min response tokens"`
- OpenAIKey string `name:"openapi-key" env:"OPENAI_KEY" usage:"openai key"`
- OpenAIBaseURL string `name:"openapi-base-url" env:"OPENAI_BASE_URL" default:"https://api.openai.com/v1" usage:"openai base url"`
- OpenAIModel string `name:"openai-model" env:"OPENAI_MODEL" default:"gpt-3.5-turbo-0301" usage:"openai params model"`
- OpenAIMaxTokens int `name:"openai-max-tokens" env:"OPENAI_MAX_TOKENS" default:"4096" usage:"openai params max-tokens"`
- OpenAITemperature int `name:"openai-temperature" env:"OPENAI_TEMPERATURE" default:"80" usage:"openai params temperature"`
- OpenAIPresencePenalty int `name:"openai-presence-penalty" env:"OPENAI_PRESENCE_PENALTY" default:"100" usage:"openai params presence-penalty"`
- OpenAIFrequencyPenalty int `name:"openai-frequency-penalty" env:"OPENAI_FREQUENCY_PENALTY" default:"0" usage:"openai params frequency-penalty"`
- Version bool `name:"version" usage:"show version"`
-}
-
-var Version = "0.0.0-dev"
-
-func (r *ChatGPTWebServer) Run(cmd *cobra.Command, args []string) error {
- if r.Version {
- return r.ShowVersion()
- }
- gin.SetMode(gin.ReleaseMode)
- if err := r.updateAssetsFiles(); err != nil {
- return err
- }
- go r.startTokenizer(cmd.Context())
- go r.httpServer(cmd.Context())
-
- <-cmd.Context().Done()
- return nil
-}
-
-func (r *ChatGPTWebServer) httpServer(ctx context.Context) {
- chatService, err := controllers.NewChatService(r.OpenAIKey, r.OpenAIBaseURL, r.SocksProxy, controllers.ChatCompletionParams{
- Model: r.OpenAIModel,
- MaxTokens: r.OpenAIMaxTokens,
- Temperature: float32(r.OpenAITemperature) / 100.0,
- PresencePenalty: float32(r.OpenAIPresencePenalty) / 100.0,
- FrequencyPenalty: float32(r.OpenAIFrequencyPenalty) / 100.0,
- ChatSessionTTL: time.Duration(r.ChatSessionTTL) * time.Minute,
- ChatMinResponseTokens: r.ChatMinResponseTokens,
- })
- if err != nil {
- klog.Fatal(err)
- }
-
- addr := fmt.Sprintf("%s:%d", r.Host, r.Port)
- klog.Infof("ChatGPT Web Server on: %s", addr)
- server := &http.Server{
- Addr: addr,
- }
- entry, proxy := gin.New(), gin.New()
- entry.Use(gin.Logger())
- entry.Use(gin.Recovery())
- chat := entry.Group("/api")
- if len(r.BasicAuthUser) > 0 {
- accounts := gin.Accounts{}
- users := strings.Split(r.BasicAuthUser, ",")
- passwords := strings.Split(r.BasicAuthPassword, ",")
- if len(users) != len(passwords) {
- panic("basic auth setting error")
- }
- for i := 0; i < len(users); i++ {
- accounts[users[i]] = passwords[i]
- }
- chat.POST("/chat-process", gin.BasicAuth(accounts), middlewares.RateLimitMiddleware(1, 2), chatService.ChatProcess)
- } else {
- chat.POST("/chat-process", middlewares.RateLimitMiddleware(1, 2), chatService.ChatProcess)
- }
- chat.POST("/config", func(ctx *gin.Context) {
- ctx.JSON(200, gin.H{
- "status": "Success",
- "data": map[string]string{
- "apiModel": "ChatGPTAPI",
- "socksProxy": r.SocksProxy,
- },
- })
- })
- chat.POST("/session", func(ctx *gin.Context) {
- ctx.JSON(200, gin.H{
- "status": "Success",
- "message": "",
- "data": gin.H{
- "auth": false,
- },
- })
- })
- upstreamURL, err := url.Parse(strings.TrimSuffix(r.OpenAIBaseURL, "/v1"))
- if err != nil {
- klog.Fatal(err)
- }
- upstream := httputil.NewSingleHostReverseProxy(upstreamURL)
- if r.SocksProxy != "" {
- proxyUrl, err := url.Parse(r.SocksProxy)
- if err != nil {
- klog.Fatal(err)
- }
- upstream.Transport = &http.Transport{
- Proxy: http.ProxyURL(proxyUrl),
- }
- }
- apis := proxy.Group("/v1")
- apis.Any("/*relativePath", func(ctx *gin.Context) {
- ctx.Request.Host = upstreamURL.Host
- upstream.ServeHTTP(ctx.Writer, ctx.Request)
- })
- proxy.NoRoute(func(ctx *gin.Context) {
- http.FileServer(http.Dir(r.FrontendPath)).ServeHTTP(ctx.Writer, ctx.Request)
- })
- entry.NoRoute(func(ctx *gin.Context) {
- proxy.ServeHTTP(ctx.Writer, ctx.Request)
- })
-
- server.Handler = entry
- go func(ctx context.Context) {
- <-ctx.Done()
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- if err := server.Shutdown(ctx); err != nil {
- log.Printf("Server shutdown with error %v", err)
- }
- }(ctx)
- if err := server.ListenAndServe(); err != http.ErrServerClosed {
- log.Fatalf("Server listen and serve error %v", err)
- }
-}
-
-func (r *ChatGPTWebServer) startTokenizer(ctx context.Context) {
- // devnull, err := os.OpenFile(os.DevNull, os.O_WRONLY, 0755)
- // if err != nil {
- // klog.Error(err)
- // os.Exit(1)
- // }
- args := strings.Split("nuxt --module tokenizer.py --workers 2", " ")
- klog.Infof("Start Tokenizer with %v", args)
- cmd := exec.CommandContext(ctx, args[0], args[1:]...)
- cmd.Stderr = os.Stderr
- cmd.Stdout = os.Stdout
- if err := cmd.Run(); err != nil {
- klog.Error(err)
- os.Exit(1)
- }
-}
-
-func (r *ChatGPTWebServer) updateAssetsFiles() error {
- pairs := map[string]string{}
- old := `{avatar:"https://raw.githubusercontent.com/Chanzhaoyu/chatgpt-web/main/src/assets/avatar.jpg",name:"ChenZhaoYu",description:'Star on Github'}`
- new := `{avatar:"https://raw.githubusercontent.com/Chanzhaoyu/chatgpt-web/main/src/assets/avatar.jpg",name:"ChatGPT",description:'Star on Github'}`
- pairs[old] = new
- old = `{}.VITE_GLOB_OPEN_LONG_REPLY`
- new = `{VITE_GLOB_OPEN_LONG_REPLY:"true"}.VITE_GLOB_OPEN_LONG_REPLY`
- pairs[old] = new
- old = ``
- new = ``
- pairs[old] = new
- return utils.ReplaceFiles(r.FrontendPath, pairs)
-}
-
-func (r *ChatGPTWebServer) ShowVersion() error {
- fmt.Println(Version)
- return nil
-}
-
-func main() {
- root := cmdutil.Command(&ChatGPTWebServer{}, cobra.Command{
- Long: "ChatGPT Web Server",
- })
- cmdutil.Main(root)
-}
+package main
+
+import (
+ "context"
+ "fmt"
+ "log"
+ "net/http"
+ "net/http/httputil"
+ "net/url"
+ "os"
+ "os/exec"
+ "strings"
+ "time"
+
+ "github.com/Arvintian/chatgpt-web/pkg/controllers"
+ "github.com/Arvintian/chatgpt-web/pkg/middlewares"
+ "github.com/Arvintian/chatgpt-web/pkg/utils"
+ "github.com/Arvintian/go-utils/cmdutil"
+ "github.com/gin-gonic/gin"
+ "github.com/spf13/cobra"
+ "k8s.io/klog/v2"
+)
+
+type ChatGPTWebServer struct {
+ Host string `name:"host" env:"SERVER_HOST" usage:"http bind host" default:"0.0.0.0"`
+ Port int `name:"port" env:"SERVER_PORT" usage:"http bind port" default:"7080"`
+ BasicAuthUser string `name:"auth-user" env:"BASIC_AUTH_USER" usage:"http basic auth user"`
+ BasicAuthPassword string `name:"auth-password" env:"BASIC_AUTH_PASSWORD" usage:"http basic auth password"`
+ FrontendPath string `name:"frontend-path" env:"FRONTEND_PATH" default:"/app/public" usage:"frontend path"`
+ SocksProxy string `name:"socks-proxy" env:"SOCKS_PROXY" usage:"socks proxy url"`
+ ChatSessionTTL int `name:"chat-session-ttl" env:"CHAT_SESSION_TTL" default:"30" usage:"chat session ttl minute"`
+ ChatMinResponseTokens int `name:"chat-min-response-tokens" env:"CHAT_MIN_RESPONSE_TOKENS" default:"600" usage:"chat min response tokens"`
+ OpenAIKey string `name:"openapi-key" env:"OPENAI_KEY" usage:"openai key"`
+ OpenAIBaseURL string `name:"openapi-base-url" env:"OPENAI_BASE_URL" default:"https://api.openai.com/v1" usage:"openai base url"`
+ OpenAIModel string `name:"openai-model" env:"OPENAI_MODEL" default:"gpt-3.5-turbo-0301" usage:"openai params model"`
+ OpenAIMaxTokens int `name:"openai-max-tokens" env:"OPENAI_MAX_TOKENS" default:"4096" usage:"openai params max-tokens"`
+ OpenAITemperature int `name:"openai-temperature" env:"OPENAI_TEMPERATURE" default:"80" usage:"openai params temperature"`
+ OpenAIPresencePenalty int `name:"openai-presence-penalty" env:"OPENAI_PRESENCE_PENALTY" default:"100" usage:"openai params presence-penalty"`
+ OpenAIFrequencyPenalty int `name:"openai-frequency-penalty" env:"OPENAI_FREQUENCY_PENALTY" default:"0" usage:"openai params frequency-penalty"`
+ Version bool `name:"version" usage:"show version"`
+}
+
+var Version = "0.0.0-dev"
+
+func (r *ChatGPTWebServer) Run(cmd *cobra.Command, args []string) error {
+ if r.Version {
+ return r.ShowVersion()
+ }
+ gin.SetMode(gin.ReleaseMode)
+ if err := r.updateAssetsFiles(); err != nil {
+ return err
+ }
+ // go r.startTokenizer(cmd.Context())
+ go r.httpServer(cmd.Context())
+
+ <-cmd.Context().Done()
+ return nil
+}
+
+func (r *ChatGPTWebServer) httpServer(ctx context.Context) {
+ chatService, err := controllers.NewChatService(r.OpenAIKey, r.OpenAIBaseURL, r.SocksProxy, controllers.ChatCompletionParams{
+ Model: r.OpenAIModel,
+ MaxTokens: r.OpenAIMaxTokens,
+ Temperature: float32(r.OpenAITemperature) / 100.0,
+ PresencePenalty: float32(r.OpenAIPresencePenalty) / 100.0,
+ FrequencyPenalty: float32(r.OpenAIFrequencyPenalty) / 100.0,
+ ChatSessionTTL: time.Duration(r.ChatSessionTTL) * time.Minute,
+ ChatMinResponseTokens: r.ChatMinResponseTokens,
+ })
+ if err != nil {
+ klog.Fatal(err)
+ }
+
+ addr := fmt.Sprintf("%s:%d", r.Host, r.Port)
+ klog.Infof("ChatGPT Web Server on: %s", addr)
+ server := &http.Server{
+ Addr: addr,
+ }
+ entry, proxy := gin.New(), gin.New()
+ entry.Use(gin.Logger())
+ entry.Use(gin.Recovery())
+ chat := entry.Group("/api")
+ if len(r.BasicAuthUser) > 0 {
+ accounts := gin.Accounts{}
+ users := strings.Split(r.BasicAuthUser, ",")
+ passwords := strings.Split(r.BasicAuthPassword, ",")
+ if len(users) != len(passwords) {
+ panic("basic auth setting error")
+ }
+ for i := 0; i < len(users); i++ {
+ accounts[users[i]] = passwords[i]
+ }
+ chat.POST("/chat-process", gin.BasicAuth(accounts), middlewares.RateLimitMiddleware(1, 2), chatService.ChatProcess)
+ } else {
+ chat.POST("/chat-process", middlewares.RateLimitMiddleware(1, 2), chatService.ChatProcess)
+ }
+ chat.POST("/config", func(ctx *gin.Context) {
+ ctx.JSON(200, gin.H{
+ "status": "Success",
+ "data": map[string]string{
+ "apiModel": "ChatGPTAPI",
+ "socksProxy": r.SocksProxy,
+ },
+ })
+ })
+ chat.POST("/session", func(ctx *gin.Context) {
+ ctx.JSON(200, gin.H{
+ "status": "Success",
+ "message": "",
+ "data": gin.H{
+ "auth": false,
+ },
+ })
+ })
+ upstreamURL, err := url.Parse(strings.TrimSuffix(r.OpenAIBaseURL, "/v1"))
+ if err != nil {
+ klog.Fatal(err)
+ }
+ upstream := httputil.NewSingleHostReverseProxy(upstreamURL)
+ if r.SocksProxy != "" {
+ proxyUrl, err := url.Parse(r.SocksProxy)
+ if err != nil {
+ klog.Fatal(err)
+ }
+ upstream.Transport = &http.Transport{
+ Proxy: http.ProxyURL(proxyUrl),
+ }
+ }
+ apis := proxy.Group("/v1")
+ apis.Any("/*relativePath", func(ctx *gin.Context) {
+ ctx.Request.Host = upstreamURL.Host
+ upstream.ServeHTTP(ctx.Writer, ctx.Request)
+ })
+ proxy.NoRoute(func(ctx *gin.Context) {
+ http.FileServer(http.Dir(r.FrontendPath)).ServeHTTP(ctx.Writer, ctx.Request)
+ })
+ entry.NoRoute(func(ctx *gin.Context) {
+ proxy.ServeHTTP(ctx.Writer, ctx.Request)
+ })
+
+ server.Handler = entry
+ go func(ctx context.Context) {
+ <-ctx.Done()
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+ if err := server.Shutdown(ctx); err != nil {
+ log.Printf("Server shutdown with error %v", err)
+ }
+ }(ctx)
+ if err := server.ListenAndServe(); err != http.ErrServerClosed {
+ log.Fatalf("Server listen and serve error %v", err)
+ }
+}
+
+func (r *ChatGPTWebServer) startTokenizer(ctx context.Context) {
+ // devnull, err := os.OpenFile(os.DevNull, os.O_WRONLY, 0755)
+ // if err != nil {
+ // klog.Error(err)
+ // os.Exit(1)
+ // }
+ args := strings.Split("nuxt --module tokenizer.py --workers 2", " ")
+ klog.Infof("Start Tokenizer with %v", args)
+ cmd := exec.CommandContext(ctx, args[0], args[1:]...)
+ cmd.Stderr = os.Stderr
+ cmd.Stdout = os.Stdout
+ if err := cmd.Run(); err != nil {
+ klog.Error(err)
+ os.Exit(1)
+ }
+}
+
+func (r *ChatGPTWebServer) updateAssetsFiles() error {
+ pairs := map[string]string{}
+ old := `{avatar:"https://raw.githubusercontent.com/Chanzhaoyu/chatgpt-web/main/src/assets/avatar.jpg",name:"ChenZhaoYu",description:'Star on Github'}`
+ new := `{avatar:"https://raw.githubusercontent.com/Chanzhaoyu/chatgpt-web/main/src/assets/avatar.jpg",name:"ChatGPT",description:'Star on Github'}`
+ pairs[old] = new
+ old = `{}.VITE_GLOB_OPEN_LONG_REPLY`
+ new = `{VITE_GLOB_OPEN_LONG_REPLY:"true"}.VITE_GLOB_OPEN_LONG_REPLY`
+ pairs[old] = new
+ old = ``
+ new = ``
+ pairs[old] = new
+ return utils.ReplaceFiles(r.FrontendPath, pairs)
+}
+
+func (r *ChatGPTWebServer) ShowVersion() error {
+ fmt.Println(Version)
+ return nil
+}
+
+func main() {
+ root := cmdutil.Command(&ChatGPTWebServer{}, cobra.Command{
+ Long: "ChatGPT Web Server",
+ })
+ cmdutil.Main(root)
+}
diff --git a/chatgpt-web-backend/pkg/tokenizer/tokenizer.go b/chatgpt-web-backend/pkg/tokenizer/tokenizer.go
index ba85afb..4c9d446 100644
--- a/chatgpt-web-backend/pkg/tokenizer/tokenizer.go
+++ b/chatgpt-web-backend/pkg/tokenizer/tokenizer.go
@@ -1,43 +1,43 @@
-package tokenizer
-
-import (
- "bytes"
- "encoding/json"
- "fmt"
- "net/http"
-
- "github.com/sashabaranov/go-openai"
-)
-
-type tokenInfo struct {
- Code int `json:"code"`
- Count int `json:"num_tokens"`
- Msg string `json:"msg"`
-}
-
-func GetTokenCount(message openai.ChatCompletionMessage, model string) (int, error) {
- url := fmt.Sprintf("http://127.0.0.1:5000/tokenizer/%s", model)
- info := tokenInfo{}
- if err := postJSON(url, &message, &info); err != nil {
- return 0, err
- }
- if info.Code != 200 {
- return 0, fmt.Errorf("%v", info.Msg)
- }
- return info.Count, nil
-}
-
-func postJSON(url string, requestData *openai.ChatCompletionMessage, responseData *tokenInfo) error {
- requestBody, err := json.Marshal(requestData)
- if err != nil {
- return err
- }
-
- resp, err := http.Post(url, "application/json", bytes.NewBuffer(requestBody))
- if err != nil {
- return err
- }
- defer resp.Body.Close()
-
- return json.NewDecoder(resp.Body).Decode(responseData)
-}
+package tokenizer
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "net/http"
+
+ "github.com/sashabaranov/go-openai"
+)
+
+type tokenInfo struct {
+ Code int `json:"code"`
+ Count int `json:"num_tokens"`
+ Msg string `json:"msg"`
+}
+
+func GetTokenCount(message openai.ChatCompletionMessage, model string) (int, error) {
+ url := fmt.Sprintf("http://127.0.0.1:5000/tokenizer/%s", model)
+ info := tokenInfo{}
+ if err := postJSON(url, &message, &info); err != nil {
+ return 0, err
+ }
+ if info.Code != 200 {
+ return 0, fmt.Errorf("%v", info.Msg)
+ }
+ return info.Count, nil
+}
+
+func postJSON(url string, requestData *openai.ChatCompletionMessage, responseData *tokenInfo) error {
+ requestBody, err := json.Marshal(requestData)
+ if err != nil {
+ return err
+ }
+
+ resp, err := http.Post(url, "application/json", bytes.NewBuffer(requestBody))
+ if err != nil {
+ return err
+ }
+ defer resp.Body.Close()
+
+ return json.NewDecoder(resp.Body).Decode(responseData)
+}
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..bf9b06d
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,9 @@
+version: '3.3'
+
+services:
+ tokenizer:
+ image: tokenizer:1.0.0
+ container_name: tokenizer
+ ports:
+ - "5000:3002"
+ restart: unless-stopped
\ No newline at end of file
diff --git a/keywords-filter/.gitignore b/keywords-filter/.gitignore
new file mode 100644
index 0000000..9e1976b
--- /dev/null
+++ b/keywords-filter/.gitignore
@@ -0,0 +1 @@
+runtime
\ No newline at end of file
diff --git a/keywords-filter/Dockerfile b/keywords-filter/Dockerfile
new file mode 100644
index 0000000..5f87177
--- /dev/null
+++ b/keywords-filter/Dockerfile
@@ -0,0 +1,19 @@
+# 编译阶段
+FROM quay.io/0voice/golang:1.20 as stage0
+RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
+ADD ./ /src/keywords-filter
+WORKDIR /src/keywords-filter
+RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o keywords-filter ./filter-server
+
+FROM quay.io/0voice/alpine:3.18 as stage1
+ADD ./grpc_health_probe-linux-amd64 /usr/bin/grpc_health_probe
+RUN chmod +x /usr/bin/grpc_health_probe
+MAINTAINER nick
+WORKDIR /app/
+ADD ./dev.config.yaml /app/config.yaml
+ADD ./dict.txt /app/dict.txt
+COPY --from=stage0 /src/keywords-filter/keywords-filter ./
+# 指定入口程序
+ENTRYPOINT ["./keywords-filter"]
+# 指定容器的启动命令或者入口程序的参数
+CMD ["--config=config.yaml","--dict=dict.txt"]
diff --git a/keywords-filter/dev.config.yaml b/keywords-filter/dev.config.yaml
new file mode 100644
index 0000000..c180289
--- /dev/null
+++ b/keywords-filter/dev.config.yaml
@@ -0,0 +1,8 @@
+server:
+ ip: 0.0.0.0
+ port: 50053
+ accessToken: "ang1chubdev1ozhome256487d22sapguuv1ozhom"
+log:
+ # panic,fatal,errro,warn,info,debug,trace
+ level: "info"
+ logPath: "runtime/logs/app.log"
\ No newline at end of file
diff --git a/keywords-filter/dev.kw.config.yaml b/keywords-filter/dev.kw.config.yaml
new file mode 100644
index 0000000..efdb8e3
--- /dev/null
+++ b/keywords-filter/dev.kw.config.yaml
@@ -0,0 +1,8 @@
+server:
+ ip: 0.0.0.0
+ port: 50054
+ accessToken: "ang1chubdev1ozhome256487d22sapguuv1ozhom"
+log:
+ # panic,fatal,errro,warn,info,debug,trace
+ level: "info"
+ logPath: "runtime/logs/app.log"
\ No newline at end of file
diff --git a/keywords-filter/dict.txt b/keywords-filter/dict.txt
new file mode 100644
index 0000000..767570d
--- /dev/null
+++ b/keywords-filter/dict.txt
@@ -0,0 +1,13992 @@
+ AV
+ hz
+ sm
+ PK
+ PX
+ C4
+ usk
+ flg
+ GCD
+ gcd
+ GHB
+ rfa
+ sex
+ TND
+ voa
+ .ru
+ .cc
+ SQ
+ tmd
+ nnd
+ 89-
+ cnd
+ dpp
+ TMD
+ xxx
+ t56
+ LSD
+ qy6
+ TEL
+淫
+乳
+阴
+奸
+裸
+骚
+穴
+嫖
+碼
+陰
+姦
+枪
+炮
+肏
+屄
+弓
+弩
+氰
+铊
+氟
+氯
+胂
+磷
+ GPS
+砷
+ TNT
+ PCP
+肝
+肾
+肼
+膦
+床
+K粉
+ 18dy
+ pn95
+3退
+A级
+A片
+ fuck
+J巴
+ lama
+ nacb
+ nmis
+ porn
+ shit
+ suck
+ svdc
+ taip
+ TNND
+ wo98
+操B
+插B
+大b
+二B
+狗b
+傻B
+傻X
+ F·B
+ T·W
+ Z·W
+ Y·D
+ S·F
+a片
+2奶
+k粉
+ cdjp
+ dafa
+ dfdz
+ falu
+ >jnv
+9评
+G点
+ MDMA
+ SARS
+红K
+ .exe
+6合
+ c-sz
+ hqzg
+ it01
+ wj2y
+ FUCK
+反G
+六4
+法L
+9坪
+h漫
+h图
+ 99dv
+嫩b
+ RX65
+T牌
+ qvod
+3箭
+ 654K
+ 55MM
+ AK47
+ ATOM
+b毛
+3健
+3棱
+ CP99
+G水
+ lqb78
+ zsgnw
+ lqb18
+ cxmyw
+ dk555
+ laohj
+ we399
+ h59me
+ boxun
+17大
+18禁
+3d肉
+Kx粉
+ naive
+ paper
+黄JU
+ FALun
+ yinh
+ anime
+ bitch
+ Bjork
+ bjork
+ Party
+ fldfh
+ 598gj
+ ab003
+ baiok
+ buslz
+ djkdh
+ haosf
+ hy898
+ jsxys
+ ka888
+ ka999
+ kaobi
+ meiti
+ qqywf
+ s3186
+ typou
+ weizi
+ wt800
+ xgzrc
+ xj818
+ zdbmm
+ zs007
+ zt286
+bb弹
+fa轮
+看jj
+ daai8
+ zqfpw
+台du
+89之
+ tusha
+FL功
+自fe
+ 9ping
+ zifen
+XX功
+看JJ
+ S2940
+ HCCH2
+ 630XP
+54手
+92手
+63式
+77手
+38式
+TV棒
+64手
+'*'酮
+ TVUSB
+ DM528
+ 762mm
+ qiang
+ ADBOX
+80色
+qi狗
+ GLOCK
+ M1911
+假BI
+54狗
+64狗
+色BB
+92式
+64式
+54式
+77式
+BB弹
+槍qq
+fa票
+K 粉
+六合
+刻章
+法轮
+乱伦
+做鸡
+罗干
+鬼村
+昏药
+春药
+疆独
+藏独
+禁书
+特码
+共狗
+达赖
+暴动
+反中
+拉登
+幼女
+喷剂
+罢工
+毛片
+套牌
+军火
+针孔
+女优
+朱蒙
+征途
+私服
+两会
+肉棍
+退党
+反华
+反共
+换妻
+偷拍
+露点
+走光
+丑化
+党国
+抵制
+怀旧
+倒退
+共奴
+大珐
+反动
+策屁
+赛马
+特马
+色情
+可儿
+乱交
+台湾
+鸡巴
+露毛
+肉棒
+龟头
+玉龟
+奢恋
+毛派
+邓派
+冰毒
+办证
+诈骗
+政治
+大荣
+西藏
+贪官
+迷药
+罢食
+蜜洞
+泄题
+罢餐
+天浴
+偷电
+盗电
+明慧
+拉凳
+江氏
+假币
+動乱
+性奴
+假钞
+无界
+升达
+杨林
+代考
+替考
+ iow.cn
+ tzz.cn
+搜客
+柑
+ mp654k
+退欓
+ 98qian
+ k20128
+ dzboo5
+ szbzcn
+ 51test
+ ksj8cn
+ 3ufcom
+ lnimcn
+ zgque6
+ bj0099
+ wsbz68
+ dkw800
+ ktdbzj
+ jczj08
+ jcnlae
+ 80hhcn
+ 97xxoo
+ dzb028
+劣乐
+ cz3456
+ 1Pondo
+ hentai
+ huanet
+ incest
+ Judies
+ Kundun
+ making
+ simple
+ wangce
+ yuming
+爱迪
+八九
+八老
+巴赫
+罢吃
+罢饭
+罢课
+白军
+白梦
+包夜
+保钓
+报禁
+鲍戈
+鲍彤
+暴動
+暴干
+暴乱
+暴亂
+暴政
+北韩
+贝领
+被逼
+被虐
+被迫
+逼样
+变态
+婊子
+冰火
+波霸
+博彩
+博讯
+薄格
+苍焱
+藏獨
+操逼
+操比
+操蛋
+操你
+操死
+操他
+插插
+插她
+插你
+插他
+插我
+柴玲
+常劲
+常委
+潮吹
+车仑
+陈军
+陈蒙
+陈庆
+成人
+城管
+程凯
+程真
+赤匪
+赤化
+抽插
+臭作
+处女
+吹萧
+春藥
+痤疮
+打倒
+大逼
+大比
+大彩
+大法
+大纪
+大禁
+大陆
+大史
+代办
+代辦
+代开
+代開
+代写
+代孕
+耽美
+弹劾
+弹夹
+党棍
+党禁
+党魁
+荡妇
+登辉
+底裤
+弟疼
+弟痛
+弟子
+調教
+丁元
+顶级
+东社
+东突
+东洲
+动乱
+独裁
+独夫
+赌球
+多党
+多黨
+多维
+屙民
+俄国
+恶党
+恶搞
+恶警
+二逼
+发愣
+发抡
+发仑
+发伦
+发囵
+发沦
+发纶
+发轮
+发论
+发票
+發倫
+發淪
+發輪
+發論
+發票
+法功
+法会
+法愣
+法抡
+法仑
+法伦
+法囵
+法沦
+法纶
+法倫
+法淪
+法輪
+法论
+法論
+法谪
+法正
+砝仑
+砝伦
+砝轮
+反党
+反攻
+废统
+分裂
+粉刺
+封杀
+風花
+腐败
+腐敗
+干她
+干妳
+干你
+干他
+甘油
+肛交
+肛门
+高潮
+高干
+高幹
+高官
+高瞻
+睾丸
+戈扬
+哥疼
+哥痛
+鸽派
+革命
+蛤蟆
+更衣
+工力
+公安
+公款
+功法
+功学
+功友
+攻台
+共产
+共党
+共黨
+共匪
+共军
+狗逼
+狗操
+狗粮
+狗娘
+广闻
+龜頭
+郭平
+国军
+国贼
+er批
+汉风
+何勇
+和弦
+河殇
+黑车
+嘿咻
+红兽
+红志
+红智
+宏恩
+宏法
+宏志
+宏治
+洪传
+洪吟
+洪志
+洪治
+洪智
+紅志
+紅智
+胡江
+胡派
+胡平
+胡温
+胡瘟
+胡系
+虎机
+护法
+护士
+换偶
+換妻
+黃菊
+黄祸
+黄局
+黄菊
+黄色
+黄翔
+簧片
+慧网
+昏藥
+活佛
+活体
+鸡八
+鸡吧
+基督
+激情
+极景
+纪元
+加府
+贾系
+假鈔
+监听
+贱逼
+贱比
+江胡
+江驴
+江罗
+江牌
+江派
+江青
+江宋
+江系
+江贼
+江朱
+江猪
+僵贼
+疆獨
+讲法
+交班
+交媾
+交警
+叫春
+教徒
+接班
+姐疼
+姐痛
+锦涛
+近平
+近親
+禁看
+经文
+精液
+警察
+静坐
+九评
+绝版
+军车
+军妓
+軍火
+卡通
+开苞
+康本
+抗议
+空难
+空難
+恐共
+口技
+口交
+狂操
+狂插
+狂干
+狂搞
+捆绑
+喇嘛
+烂逼
+烂比
+烂货
+劳改
+劳教
+老江
+老毛
+雷管
+冷宽
+李录
+李禄
+李鹏
+李鵬
+連發
+联总
+炼功
+林彪
+林斌
+凌锋
+凌辱
+菱恝
+刘刚
+刘青
+流脑
+流亡
+六彩
+六四
+鲁俊
+陆肆
+陆委
+亂倫
+抡功
+伦公
+伦功
+伦攻
+沦公
+沦功
+沦攻
+轮大
+轮公
+轮功
+轮攻
+倫公
+倫功
+倫攻
+淪公
+淪功
+淪攻
+輪公
+輪功
+輪攻
+论公
+论功
+论攻
+論公
+論功
+論攻
+羅幹
+妈逼
+妈个
+妈批
+媽個
+麻古
+麻衣
+麻醉
+马馼
+码会
+卖逼
+卖比
+卖国
+猫肉
+貓肉
+毛共
+毛贼
+美服
+美甲
+美腿
+妹疼
+妹痛
+猛插
+蒙独
+蒙汗
+迷魂
+迷香
+迷藥
+秘录
+绵恒
+民国
+民警
+民联
+民殇
+民意
+民运
+民運
+民阵
+民猪
+民主
+明Hui
+明hui
+魔教
+母子
+内裤
+内射
+奶子
+闹事
+你爸
+牛逼
+牛比
+女女
+女優
+虐待
+诺龙
+喷精
+喷尿
+彭钢
+屁股
+屁眼
+骗局
+騙局
+迫害
+破处
+破网
+蒲团
+祁建
+齐墨
+汽狗
+千源
+前考
+钱达
+强暴
+强歼
+强卫
+抢盐
+乔石
+窃听
+亲美
+秦晋
+情妇
+情色
+请愿
+庆红
+球彩
+权斗
+群交
+群射
+人大
+人权
+日逼
+日你
+日您
+日批
+日他
+肉洞
+肉欲
+辱师
+三级
+三級
+三退
+三唑
+色狼
+色友
+色欲
+沙鹰
+傻逼
+煞笔
+上访
+尚勇
+少妇
+射精
+神佛
+沈彤
+升達
+升天
+盛雪
+失密
+师涛
+石戈
+示威
+手狗
+手铐
+首长
+首長
+兽交
+书记
+書記
+舒淇
+熟女
+双规
+爽死
+氵去
+水扁
+税力
+丝袜
+私彩
+私处
+私营
+思潮
+斯诺
+宋平
+素女
+台獨
+台独
+台盟
+谭力
+唐捷
+涛哥
+天怒
+天权
+天葬
+舔奶
+挺胡
+同房
+童屹
+统独
+统战
+捅你
+捅我
+偷窥
+偷情
+透视
+屠杀
+吐血
+团派
+退团
+脱党
+脱光
+脱团
+脱衣
+外蒙
+汪岷
+亡党
+亡国
+王策
+王丹
+王刚
+网特
+网赚
+伪水
+尾行
+瘟家
+文革
+翁虹
+瓮安
+我操
+我草
+我日
+我色
+无毛
+無界
+五不
+伍凡
+武警
+吸储
+吸儲
+洗脑
+洗瑙
+下体
+限制
+香功
+肖强
+邪党
+邪恶
+邪教
+谢安
+新党
+刑警
+行房
+邢铮
+性爱
+性愛
+性福
+性感
+性交
+性息
+胸部
+胸罩
+熊炎
+熊焱
+修炼
+修煉
+薛伟
+学潮
+学联
+学运
+血卡
+亚热
+言禁
+颜射
+艳舞
+阳具
+阳痿
+杨巍
+杨周
+一党
+一黨
+伊東
+乙醚
+义解
+亦凡
+櫻井
+游行
+右派
+幼齿
+幼交
+诱惑
+舆论
+欲望
+圆满
+援交
+岳武
+杂种
+脏独
+造爱
+造反
+则民
+择民
+泽东
+泽民
+贼民
+炸药
+张钢
+张健
+张林
+赵南
+哲民
+真相
+真象
+镇压
+正法
+郑义
+政变
+支那
+制服
+中功
+中共
+猪操
+专柜
+专政
+专制
+專政
+專制
+子弹
+自殘
+自焚
+自摸
+自拍
+自杀
+自慰
+作爱
+坐交
+坐台
+做爱
+做雞
+做鸭
+黄镇
+黄敬
+薄熙
+徐明
+老丁
+贪污
+ www.cn
+ xp.com
+ u88.cn
+ jkk.tw
+ www.am
+ sdo.ms
+ 171.cn
+鹰派
+禁播
+二奶
+周容
+陈云
+方毅
+吴德
+耿飚
+彭冲
+王震
+彭真
+谢非
+吴仪
+王克
+刘淇
+处男
+血恋
+偷欢
+ censor
+ fa lun
+ fanhua
+妓女
+我靠
+登陆
+玉茎
+王爷
+雏妓
+赌博
+国歌
+股歌
+啊扁
+官场
+群砍
+炸弹
+买春
+被插
+鸟巢
+缺陷
+色戒
+复活
+阿扁
+氨水
+爆炸
+丙酮
+布赫
+催眠
+催情
+大麻
+地震
+毒素
+疯药
+豪江
+濠江
+火药
+剑奴
+降頭
+借种
+老温
+麻姑
+麻药
+马药
+吗啡
+迷幻
+迷昏
+迷情
+缅古
+杀手
+手雷
+偷香
+舞男
+邪僧
+性病
+性媾
+性药
+性夜
+鸦片
+盐酸
+艳降
+艳遇
+罂粟
+早泄
+北姑
+波胆
+春宫
+吹箭
+叫鸡
+卖春
+人祸
+大庄
+盗取
+男妓
+盘口
+赔率
+三陪
+下流
+尤物
+骚货
+摇奖
+ 116738
+ 200100
+ 251700
+ 581578
+ 8happy
+ ake163
+ bet365
+ cks123
+ cnepep
+ cosway
+ Cosway
+ czj163
+ eweber
+ gogoer
+ gzyrly
+ ha2.cn
+ hngyjt
+ jdh011
+ lhjykq
+ midasc
+ niaita
+ now.cn
+ qdjywq
+ rorcll
+ sar120
+ wengan
+ wes.tw
+ xingsc
+ yuyify
+ zxzgjx
+阿宾
+安定
+挫仑
+气狗
+三挫
+论文
+斑蝥
+办怔
+辦證
+包养
+报码
+暴菊
+爆菊
+鞭满
+变牌
+厕奴
+长狗
+贷开
+弹种
+盗号
+电狗
+电鸡
+赌具
+根浴
+狗友
+华闻
+黄冰
+贱货
+贱人
+江毒
+警徽
+菊暴
+菊爆
+军刺
+军转
+開票
+磕彰
+嗑药
+六死
+漏题
+卖身
+卖血
+灭共
+男奴
+嫩逼
+浓精
+女奴
+泡友
+陪聊
+氣槍
+铅弹
+亲共
+情杀
+犬交
+人弹
+剩火
+尸博
+熟妇
+骰子
+推翻
+无码
+希脏
+霰弹
+性虐
+一肖
+蝇毒
+咏妓
+有码
+脏毒
+中特
+助考
+庄家
+左棍
+雞巴
+禁片
+巨波
+色界
+色诱
+爽片
+ xxfysd
+操她
+操它
+出售
+干它
+价格
+开票
+猫池
+目漂
+批发
+凭办
+招商
+焊接
+黄赌
+蓝芒
+紫田
+唐子
+何山
+张戎
+虐杀
+应招
+林海
+黄琦
+刘荻
+颜均
+李志
+赵岩
+封锁
+推油
+朱德
+万里
+泛绿
+泛蓝
+自由
+双轨
+伊东
+调教
+近亲
+连发
+樱井
+风花
+共产党
+伪大
+陆独
+共独
+殃视
+打压
+蒋公
+独立
+共贼
+亡共
+集会
+维权
+罢市
+买断
+聚集
+信访
+征地
+拆迁
+复员
+示wei
+讨薪
+暴行
+紫阳
+九凭
+法lun
+九抨
+反日
+屠华
+参拜
+抗日
+围攻
+靖国
+灭日
+惨案
+军区
+军队
+保过
+包过
+贷款
+带考
+司考
+押题
+切腹
+打手
+开锁
+套现
+一码
+彩宝
+合彩
+足交
+富姐
+做台
+找女
+找男
+证件
+导弹
+肉牛
+肉羊
+牧业
+报税
+伟哥
+爱欲
+税票
+牛羊
+扑克
+作弊
+麻将
+面瘫
+趣谷
+暗杀
+奶交
+菩提
+麻果
+病毒
+足疗
+足浴
+搬迁
+种猪
+精子
+女装
+男装
+鞋帽
+办證
+月嫂
+洗牙
+牙石
+洁牙
+牙疼
+龋齿
+虫牙
+正牙
+拔牙
+牙科
+防弹
+警棍
+疫苗
+水军
+飞标
+飞镖
+探头
+破解
+斗欧
+毒品
+自考
+警服
+电棍
+报关
+偷税
+逃税
+漏税
+税务
+审计
+年检
+签证
+离婚
+逃婚
+白洁
+苍主
+叱咤
+创魂
+宠奴
+刀霸
+呻吟
+情欲
+東宮
+ FDZONE
+麻烟
+冷却
+偷電
+监聼
+跟听
+摄像
+克隆
+罚没
+走私
+短信
+ D2S500
+雷霆
+稀土
+米粒
+mai人
+丁烯
+丙腈
+丁腈
+苄醇
+苯醌
+杜廷
+山奈
+升汞
+白砒
+砒霜
+帝绿
+苔绿
+塔崩
+索曼
+沙林
+光气
+氮芥
+烟碱
+蒜醇
+华果
+腈果
+蚜螨
+亚砜
+亚果
+硫丹
+大隆
+敌鼠
+安妥
+甘伏
+窃电
+钢珠
+冰Ice
+媚药
+疯丸
+撬锁
+矿脂
+甲撑
+单刃
+双刃
+火棉
+硝宇
+泰安
+铵煤
+铵木
+铵磺
+铵邻
+铵萘
+铵胍
+岩石
+雷汞
+雷银
+虎头
+秃鹰
+武器
+瓦斯
+按摩
+刀具
+爱刀
+铀235
+霸王
+杀伤
+匕首
+奖券
+兵团
+纵情
+毒碱
+超速
+隐形
+丁香
+弹头
+删帖
+器官
+猎箭
+自爆
+农药
+黑市
+黑梯
+虎骑
+爆破
+色医
+驾照
+护照
+健卫
+艳情
+金钟
+折刀
+兰博
+猎豹
+送养
+领养
+骆冰
+妞妞
+色图
+乙腈
+大宝
+赌场
+艳帝
+梭哈
+人皮
+禽兽
+黄站
+美男
+麻狗
+涉毒
+冰糖
+猎狗
+皮碗
+双管
+解码
+拦截
+屏蔽
+硬币
+面具
+猎艳
+伪币
+狩猎
+点色
+冰砖
+发漂
+高爆
+高考
+跟踪
+艳母
+地磅
+卧底
+牙签
+唐僧
+出台
+阳江
+野战
+东宫
+ DM7000
+改火
+军用
+A4U平
+A4U网
+A4U站
+狗专
+气皇
+长刺
+狙击
+qie听
+Zha药
+白粉
+白刃
+暴力
+采花
+彩票
+JIA币
+白冰
+钞票
+短狗
+黑狗
+火狗
+假rmb
+军狗
+军品
+开刃
+镁粉
+手拷
+战刀
+追月
+春泄
+ fapiao
+戈博
+工商
+麻谷
+甩刀
+假比
+考研
+雷豹
+力霸
+春堂
+鲍鱼
+露鲍
+嫂嫂
+迷离
+蜜桃
+名刀
+耻蜜
+虐恋
+秦氏
+氢弹
+散弹
+色域
+山猪
+兽兽
+淘刀
+舔弄
+硝铵
+冰古
+纯古
+晶冰
+战狗
+艳史
+投票
+报仇
+纯冰
+票据
+文凭
+武力
+精鹰
+本色
+好色
+刷票
+赌波
+夺爱
+夺妻
+官能
+画魂
+宦妻
+剑魔
+江湖
+巨轮
+狼车
+猎情
+龙使
+掠爱
+萝莉
+眉姐
+密诱
+脑王
+逆侠
+破局
+情乱
+人欲
+如焉
+色惑
+绳师
+胎记
+庭妍
+袭警
+戏舞
+亵渎
+玄战
+艳福
+艳飘
+隐杀
+众香
+气狙
+罢考
+码报
+假钱
+马报
+狠操
+外挂
+传销
+双鹰
+弹药
+虎牙
+刺刀
+甩棍
+助勃
+鹰牌
+军刀
+伪钞
+涩爱
+官战
+春色
+核弹
+跳刀
+军刃
+砍刀
+ cocain
+抽奖
+迁都
+中奖
+假证
+ SevBBS
+卖槍
+妓院
+罩杯
+青楼
+内衣
+亵衣
+色魔
+初夜
+蕾丝
+老鸨
+蹂躏
+勾引
+偷精
+吹箫
+失身
+失禁
+虐爱
+虐情
+一夜
+情人
+小妞
+玩偶
+娇妻
+流氓
+情夫
+春光
+春梦
+猛男
+艳星
+艳行
+艳记
+艳事
+寡妇
+金瓶
+禁果
+浴女
+外遇
+同居
+缠绵
+暧昧
+饥渴
+出轨
+堕落
+坠落
+沉沦
+御用
+调情
+调戏
+风流
+不良
+寻欢
+合欢
+偷腥
+挑情
+同眠
+菲彩
+跑马
+证务
+卖胆
+勃起
+视频
+基友
+脚交
+滥交
+口活
+篡逆
+丹警
+金血
+蛮村
+贱妇
+胸摧
+發缥
+发缥
+口爆
+揉奶
+大奶
+耳机
+杀死
+拉丹
+压迫
+非典
+回民
+ falong
+主席
+改革
+开放
+杂志
+中俄
+诽闻
+无能
+ 36tl.cn
+ 9aab.cn
+ gfwo.cn
+ hroc.cn
+ qxsw.cn
+ xx44.cn
+原装k
+ mnltscn
+cet4答
+中daan
+ gmtkwcn
+ 22w33cn
+ gwykscn
+ hd101cn
+ ztyzcom
+ sj516cn
+ hykswcn
+ ygafnet
+ 3zszcom
+ bakqcom
+ a89acom
+ 47aicom
+nine评
+ 1795628
+ 5569118
+ 949-081
+ freenet
+ hongzhi
+ HuangJu
+ huzhuxi
+ minghui
+ playboy
+ safeweb
+ toolbar
+ tuidang
+ Undergo
+ unixbox
+ ustibet
+ wstaiji
+发-票
+發-票
+法.轮
+龚平
+胡J涛
+江core
+江z民
+九-评
+九.评
+色-情
+替.考
+玄`机
+ G·M·D
+ L·H·Z
+偷 拍
+H动漫
+H漫画
+ bignews
+ chinamz
+ fangong
+ ry80.cn
+ 0033.cn
+ 020wuzi
+ 30t.net
+ 3197918
+ 3197919
+ 35so.cn
+ 4dq.com
+ 5bzj.cn
+ 779.net
+ 7caiyun
+ 8892484
+ 9kj.com
+ aganbio
+ tom.com
+ asyr520
+ caxieji
+ da11.cn
+ dotmore
+ e80.com
+ fipa.cn
+ gyp.com
+ hrzj998
+ htte.cn
+ jcx.com
+ jim.net
+ jpkg.cn
+ my6e.cn
+ oolaiya
+ pyqq.cn
+ sixfour
+ srogold
+ tbcgold
+ tpypump
+ ucenter
+ wapgame
+ wowgold
+ xqzj168
+ ysee.cn
+ jiuping
+t牌车
+法0功
+法o功
+李洪x
+ 7580185
+价 格
+ hrw.org
+GONG党
+共X党
+ xuechao
+法X功
+九ping
+李洪X
+法O功
+1夜情
+3级片
+3唑仑
+甲苯2
+4二酮
+K他命
+Ting器
+ BOLT630
+3利达
+3步倒
+2踢脚
+2羟基
+3仙丹
+4乙锡
+2硼烷
+5硼烷
+2硝酚
+2恶英
+3赛昂
+3氮苯
+1本道
+十8禁
+ CNK6080
+LBM4型
+M92F手
+M92F式
+4级证
+黄b色
+3唑纶
+ NEWB630
+6和采
+ heroine
+尘诱2
+king粉
+群P图
+E乐博
+92狗qq
+E周刊
+ IP17908
+智能H3
+ 14gm.com
+ 3456.net
+ 55po.com
+ 7evk.com
+ 9352.com
+ ab222.cn
+ cctve.cn
+ dotoo.cn
+ ghkj.net
+ heidc.cn
+ jsh8.com
+ ok129.cn
+ quna.com
+ ttyie.cn
+ weeky.cn
+ ym59.com
+ sonyf707
+ 51297514
+ freegate
+64运动
+zd份子
+传奇sf
+辦譪qq
+ pj899com
+ 33465607
+和谐zf
+廱閠px
+厦门px
+px事件
+px项目
+反对px
+反對px
+px項目
+ spe59263
+项目px
+pl123号
+ 21018728
+ 21018908
+ 21478521
+ 26544455
+ 51267950
+ 51517198
+ 54457055
+ 57198536
+ 60365563
+ 60370027
+ 61592271
+ 62985375
+ 78233985
+ 79457053
+ 82168838
+ 83121803
+ 83405002
+ 84718900
+ 87549294
+ 87582796
+89死难
+ hrichina
+huang菊
+ ILLUSION
+MC军团
+MC軍團
+ tianwang
+ tibetalk
+ triangle
+ wow gold
+ xinsheng
+佳龙it
+江ze民
+露拉3D
+我XX你
+BT下载
+QQ宠物
+ Ketamine
+偷啪dv
+ WoW Gold
+ ws88.net
+ xcity.cn
+ xicp.net
+ xihuchem
+ XXWLAQZY
+ zcld.net
+ zgcej.cn
+3d轮盘
+六he彩
+sf传奇
+ 08ys.com
+ 55798676
+ 81978137
+ bxzw.com
+ fzboyang
+反party
+89事件
+64时期
+ liuhecai
+3D轮盘
+六HE彩
+bt下载
+zm病危
+qq物语
+ playerTV
+ Dreambox
+1羟基2
+49环氧
+ banzheng
+ MARUHAMA
+ Flexispy
+SNL6B型
+bt电影
+2甲2硫
+S4氧代
+海豹M9
+国产95
+女同BT
+英国B5
+av资源
+手槍QQ
+kb之家
+av直播
+gv下载
+gv资源
+gv动漫
+3p图片
+av快播
+庐江6p
+狗管qq
+3P艳照
+庐江5p
+5p庐江
+Av影院
+luo聊QQ
+木仓QQ
+av影院
+18岁禁
+賣槍QQ
+警衔QQ
+买冰QQ
+楼凤QQ
+ FlexiSPY
+色bb吧
+亚洲BT
+日韩BT
+欧美BT
+欧美GV
+真善忍
+毛一鲜
+黎阳平
+张小平
+反政府
+陈良宇
+胡新宇
+金伯帆
+马加爵
+色空寺
+蒋彦永
+关机房
+干扰器
+快操我
+乖乖药
+卖答案
+买答案
+新唐人
+摇头丸
+戴海静
+中纪委
+领导人
+家乐福
+活摘器
+切波特
+噶玛吧
+社民党
+九jiu评
+六开网
+露胸图
+要射了
+小弟弟
+双儿篇
+江二世
+江核心
+江老贼
+江魔头
+陶驷驹
+江理论
+江昏君
+江路线
+违禁品
+追踪器
+大扎荣
+太王记
+大祚荣
+民告官
+蚁力神
+渊苏文
+童奴工
+波佳达
+菊花洞
+刘全喜
+十七大
+李沛瑶
+梁保华
+沧澜曲
+黑天使
+十景缎
+风尘劫
+胡錦濤
+六决不
+轮盘机
+百家乐
+连线机
+模拟机
+礼品机
+卢跃刚
+玫瑰园
+杨元元
+趙紫陽
+人民报
+崔英杰
+萬人暴
+张大权
+博白县
+女死囚
+劉奇葆
+女友坊
+白小姐
+曾道人
+奴事件
+海乐神
+酣乐欣
+高莺莺
+广东王
+红海湾
+新生网
+大紀元
+死刑过
+一四我
+四我周
+重题工
+灭绝罪
+大揭露
+宾致网
+共铲党
+ 6'*'928838
+张筱雨
+搞皮叛
+村骗乡
+三呆婊
+酒级别
+林西亮
+祸布斯
+逢必乱
+喝党酒
+痰太浓
+拜德良
+张锡铭
+凌沧洲
+眔聽王
+拍肩药
+ 857606349
+佬唬机
+ 529543905
+kcn和khs
+消聲器
+吃女婴
+食女婴
+嬰兒湯
+婴儿汤
+婴兒汤
+猪肉版
+vpn代理
+绿坝娘
+杜崇烟
+三鹿版
+蟹药店
+拉面剂
+飞易vpn
+vpn翻墙
+ ultrasurf
+藏青会
+谴责cnn
+供产谠
+傥文化
+供铲傥
+股票歌
+股市版
+股民苦
+轮子功
+贡产谠
+ www99kicn
+幼香阁
+霸奴娇
+摸奶门
+藏字石
+温加饱
+无官正
+胡紧掏
+亡秦石
+温小萌
+温云松
+温假保
+朱容鸡
+京c53011
+胡紧套
+温嫁饱
+汪兆钧
+林保华
+共残党
+杨友林
+曹炎焱
+颜跃明
+宁b00077
+高智晟
+蕐彥永
+共惨党
+ lhj114com
+ shsdlb163
+张博树
+虎劲涛
+汪达林
+罗永忠
+邓玉娇
+赵无眠
+普恩富
+哄铲谠
+拱产谠
+涂远高
+胡妖邦
+姜折民
+供产档
+工产谠
+辛灏年
+批评谠
+江折民
+徐其耀
+汪兆均
+赵昌林
+罗静虹
+谭海华
+皖ok0332
+徐国元
+武思伦
+湘dy5707
+郑筱萸
+陈相贵
+佘祥林
+孔德新
+苗国辉
+王直桂
+刘清江
+柴铁民
+批判邓
+陈振翊
+王同信
+常俊亚
+俞大纯
+姬胜德
+钟圣文
+向首明
+毕晓哲
+镡京湘
+杨晓陆
+黄齐帆
+吾子续
+任其良
+奥nmd运
+无子诗
+任不寐
+吴振海
+岩帅王
+刁爱青
+耿庆国
+翁文波
+龙小霞
+骂四川
+吕笃功
+吴升标
+阳晓东
+猪容鸡
+张沛良
+肖敬明
+黄伟木
+翟秀枝
+王建泽
+林嘉祥
+猪叫石
+唐雪凝
+曾金燕
+林松岭
+杨佳案
+杨湘洪
+唐徳刚
+中泡委
+张伯笠
+崔阎王
+推碑图
+奥巴毛
+ 137388878
+ 171752945
+ 271265850
+301医院
+314事件
+371工程
+ 375792088
+ 4618-9173
+ 51ini.com
+ 563924795
+571工程
+ 576591512
+ 597708162
+6.4事件
+ 601184337
+ 634706444
+ 756235557
+ 811693788
+ 811782205
+ 859800299
+ 870530092
+ 910049455
+ 937158678
+ 949081180
+ 951400296
+ 974997851
+ freechina
+ huangdies
+ hypermart
+JGT发帖
+ peacehall
+ QQGGDDYYL
+ RedCorner
+ renminbao
+ Triazolam
+ UltraSurf
+ wenjiabao
+ woyaobaby
+ zhengjian
+ zhouenlai
+ zhurongji
+爱姐妹
+愛姐妹
+安魂网
+安立敏
+安眠药
+巴拉斯
+巴特尔
+白立朴
+白皮书
+包送车
+包娃衣
+北京帮
+被立王
+避孕套
+变声器
+變聲器
+病不起
+病业说
+伯希来
+捕鱼机
+捕鱼器
+擦鞋机
+蔡崇国
+藏春阁
+藏春閣
+藏妇会
+曹长青
+曹刚川
+草你妈
+禅密功
+長瀨愛
+超声波
+朝河蘭
+陈炳基
+陈建华
+陈金龙
+陈破空
+陈希同
+陈小同
+陈雄彪
+陈宣良
+陈一谘
+陈志坤
+陈总统
+程方鹏
+程铁军
+程渭山
+迟浩田
+除湿机
+慈悲功
+粗口歌
+崔会烈
+催泪弹
+打保单
+打飞机
+打砸抢
+大参考
+大盖帽
+大蓋帽
+大花逼
+大记元
+大跃进
+大澤惠
+代发贴
+代发帖
+代缴税
+戴海靜
+戴相龙
+挡坦克
+党妈妈
+党文化
+邓二世
+邓小平
+邓笑贫
+鄧小平
+狄玉明
+第三党
+第四代
+电子狗
+電子狗
+钓鱼岛
+丁关根
+丁子霖
+定情粉
+定情药
+董宜胜
+动态网
+冻干粉
+賭博粉
+杜智富
+多美康
+恩诺欣
+发正念
+法国游
+法拉盛
+樊守志
+反人类
+反社会
+饭岛爱
+飯島愛
+方励之
+方舟子
+方祖岐
+防拍器
+仿云石
+飞机票
+斐得勒
+费良勇
+分家在
+分析王
+封从德
+冯东海
+冯素英
+冯勇彬
+府软弱
+付申奇
+傅成玉
+傅申奇
+傅志寰
+干死你
+干以胜
+幹擾器
+高立新
+高文谦
+高自联
+搞晚会
+搞晚會
+割肉人
+葛振峰
+工自联
+公子党
+公子族
+勾清明
+狗卵子
+古怪歌
+古拉格
+关卓中
+光端机
+桂世镛
+郭伯雄
+郭罗基
+郭岩华
+国民党
+韩东方
+韩联潮
+韩杼滨
+何德普
+核设施
+核污染
+贺邦靖
+黑皮书
+黑社会
+黑社會
+黑手党
+红病历
+红灯区
+红卫兵
+红血丝
+宏踏鞋
+洪巨平
+洪哲胜
+呼喊派
+胡春华
+胡锦滔
+胡锦淘
+胡进涛
+胡景涛
+胡下台
+胡耀邦
+胡耀帮
+胡中央
+华藏功
+华国锋
+华建敏
+黃麗滿
+黄慈萍
+黄褐斑
+黄华华
+黄金书
+黄丽满
+黄霉素
+黄作兴
+回良玉
+悔过书
+昏迷剂
+霍英东
+积克馆
+吉炳轩
+贾庆林
+贾廷安
+贾育台
+贾治邦
+賈慶林
+假教育
+监控器
+監聽寶
+監聽器
+監聽王
+减肥药
+简鸿章
+建国党
+剑教材
+江八点
+江恶人
+江公子
+江黑心
+江祸心
+江家帮
+江姐问
+江姐問
+江锦恒
+江人马
+江三秀
+江神经
+江梳头
+江戏子
+江宰民
+江择min
+江泽慧
+江澤民
+江者民
+江浙民
+江作秀
+姜春云
+姜凤阁
+降灾民
+酱猪媳
+交友网
+焦焕成
+教养院
+揭批书
+解厚铨
+解学智
+解振华
+金道铭
+金舜禹
+金尧如
+金银焕
+进口车
+京夫子
+经租房
+晶白体
+净白体
+净水器
+靖志远
+军警靴
+军械所
+卡耐基
+开天目
+開髮票
+看中国
+康成元
+康涛杰
+靠你妈
+控制器
+扣应队
+酷刑罪
+邝锦文
+赖昌星
+攔截器
+郎咸平
+老虎機
+雷鸣球
+黎安友
+黎阳评
+黎陽評
+黎智英
+李长春
+李長春
+李崇礼
+李崇仁
+李崇禧
+李传卿
+李大尸
+李大师
+李弘旨
+李红痔
+李宏智
+李洪宽
+李洪痣
+李洪誌
+李鸿志
+李鸿智
+李继耐
+李兰菊
+李岚清
+李嵐清
+李老师
+李良辉
+李瑞环
+李瑞環
+李少民
+李淑娴
+李旺阳
+李文斌
+李向东
+李小朋
+李小鹏
+李远哲
+李遠哲
+李总理
+李总统
+里藏春
+连胜德
+练习器
+梁光烈
+梁擎墩
+廖锡龙
+林长盛
+林金钱
+林樵清
+林慎立
+令狐安
+令计划
+刘宾深
+刘宾雁
+刘春良
+刘国凯
+刘华清
+刘俊国
+刘凯中
+刘奇葆
+刘千石
+刘山青
+刘少奇
+刘士贤
+刘文胜
+刘晓波
+刘晓竹
+刘永川
+六●四
+六一零
+龙虎豹
+龙新民
+龍虎豹
+吕京花
+吕秀莲
+铝热剂
+罗礼诗
+雒树刚
+马大维
+马良骏
+马三家
+马时敏
+马自达
+麦角酸
+毛厕东
+毛厕洞
+毛光烈
+毛如柏
+毛一鮮
+蒙古独
+蒙进喜
+迷歼药
+迷殲藥
+民进党
+闵耀中
+名山县
+魔难论
+末世论
+莫伟强
+牟新生
+木犀地
+南京大
+能力主
+倪育贤
+倪志福
+你妈的
+你奶奶
+你娘的
+你全家
+你他妈
+钮茂生
+女教師
+女神教
+欧泽高
+帕萨特
+拍花子
+拍肩迷
+潘国平
+喷雾型
+彭丽媛
+平银芳
+破碎机
+蒲海清
+濮洪九
+朴鸣呼
+曝光王
+七宗罪
+荨麻疹
+钱国梁
+钱其琛
+钱运录
+潜在用
+抢答器
+抢粮记
+抢圣火
+羟丁酸
+竊聽器
+钦本立
+清官团
+清华帮
+群发器
+群發器
+热比娅
+仁青加
+日死你
+萨斯病
+赛克网
+三面翻
+上海帮
+尚福林
+烧国旗
+邵家健
+盛光祖
+盛华仁
+失忆药
+失意药
+失意藥
+十八大
+十八禁
+十八摸
+石云生
+石宗源
+时时彩
+实际神
+视眼镜
+手拍肩
+刷淘宝
+刷信誉
+双十节
+司马晋
+司马璐
+司徒华
+斯鑫良
+四川独
+四人帮
+四小码
+四种当
+四種當
+宋书元
+宋祖英
+苏丹达
+苏绍智
+苏晓康
+宿命论
+他娘的
+它妈的
+塔形流
+太阳城
+太子党
+太子黨
+覃志刚
+探测狗
+探測狗
+汤光中
+唐柏桥
+唐家璇
+腾文生
+滕久明
+滕文生
+天安门
+天安門
+天灭中
+天要灭
+天要亡
+天音功
+田凤山
+田纪云
+通示达
+统一教
+统治术
+偷听器
+透視器
+凸点装
+涂运普
+退改离
+脫衣舞
+外围码
+万润南
+万晓东
+万言书
+王宝森
+王炳章
+王超华
+王辅臣
+王涵万
+王沪宁
+王进发
+王军涛
+王力雄
+王瑞林
+王润生
+王若望
+王松昌
+王韦景
+王维林
+王希哲
+王秀丽
+王冶坪
+隗福临
+尉健行
+慰安妇
+魏京生
+魏新生
+温宝宝
+温家宝
+温家保
+温家堡
+温假饱
+温下台
+温爷爷
+温元凯
+温总理
+溫家寶
+瘟假鸨
+文字狱
+文字獄
+邬书林
+无帮国
+无网界
+吳邦國
+吴百益
+吴邦国
+吴方城
+吴官正
+吴弘达
+吴宏达
+吴基传
+吴仁华
+吴学灿
+吴学璨
+吴野渡
+無網界
+無修正
+五毛党
+伍绍祖
+武腾兰
+武藤兰
+武藤蘭
+奚国华
+项怀诚
+项小吉
+项宗西
+消防队
+消防隊
+消业论
+硝化棉
+小参考
+小电影
+小来子
+小泽圆
+小澤園
+谢长廷
+谢选骏
+谢中之
+新景隆
+新语丝
+新诸侯
+星火报
+性伴侣
+性教官
+性网站
+性網站
+性游戏
+徐邦秦
+徐才厚
+徐匡迪
+徐适龄
+徐水良
+许家屯
+学生妹
+学位证
+学习班
+学自联
+雅马哈
+严家其
+严家祺
+阎明复
+杨怀安
+杨建利
+杨思敏
+杨勇芳
+杨月清
+楊思敏
+姚月谦
+搖頭丸
+摇头玩
+业力轮
+叶子楣
+夜总会
+夜總會
+一本道
+一通功
+遗忘药
+抑制剂
+易丹轩
+易志熹
+银行卡
+尹庆民
+隱形鏡
+由喜贵
+于大海
+于浩成
+于幼军
+余英时
+於淼林
+於幼軍
+宇明网
+玉蒲團
+元极功
+袁纯清
+袁伟民
+远志明
+云石灯
+在十月
+昝爱宗
+曾培炎
+曾慶紅
+张宏堡
+张丕林
+张万年
+张伟国
+张文彬
+张文斌
+张五常
+张意伟
+张昭富
+张志良
+张志清
+張丕林
+張五常
+張小平
+赵海青
+赵品潞
+赵铁锤
+赵晓微
+侦听器
+真善美
+正见网
+支联会
+中国猪
+周天法
+朱容基
+朱镕基
+朱鎔基
+朱颜血
+猪聋畸
+壮阳药
+习仲勋
+贺国强
+贺子珍
+周永康
+李德生
+王岐山
+姚依林
+李源潮
+李干成
+戴秉国
+刘延东
+刘瑞龙
+俞正声
+薄一波
+周小川
+周建南
+江绵康
+李小琳
+朱云来
+胡海峰
+共框非
+性启蒙
+弘法体
+李屠夫
+圆明网
+艳照门
+次下跪
+叶剑英
+李先念
+汪东兴
+韦国清
+乌兰夫
+刘伯承
+许世友
+纪登奎
+苏振华
+余秋里
+张廷发
+陈永贵
+陈锡联
+聂荣臻
+徐向前
+邓颖超
+杨尚昆
+杨得志
+宋任穷
+胡乔木
+廖承志
+秦基伟
+陈慕华
+李铁映
+李锡铭
+杨汝岱
+吴学谦
+胡启立
+芮杏文
+邹家华
+谭绍文
+王汉斌
+任建新
+于永波
+傅全有
+王乐泉
+王兆国
+刘云山
+张立昌
+张德江
+定位器
+上分器
+退币王
+性生活
+艳丽片
+001工程
+妈妈的
+媽媽的
+他妈的
+他媽的
+倔宠儿
+错别字
+毒鸡蛋
+潜规则
+现场脱
+节电王
+刘德华
+沁园春
+无删版
+社会:
+炸超市
+炸广州
+王志平
+包尔汉
+曹查理
+醋酸酐
+崔晓汉
+地西泮
+赌恒指
+发帖机
+高句丽
+共残拳
+海洛因
+黑索今
+黄龙云
+鸡鸭恋
+可卡因
+猎头者
+麻黄素
+毛新宇
+毛远新
+毛致用
+灭门惨
+内蒙古
+虐之恋
+七日情
+抢劫药
+全树仁
+燃烧弹
+沙菲片
+手榴弹
+双姝艳
+瘟假报
+五套法
+性妲已
+许宗衡
+伊波拉
+怡红院
+异丙嗪
+朱小丹
+总输记
+女人费
+三秒倒
+投注站
+PCB抄板
+PCB样机
+PCB线路
+安街逆
+安门事
+败培训
+办本科
+辦毕业
+毕业證
+苍蝇水
+察象蚂
+代发邮
+代理票
+导人最
+得财兼
+灯草和
+等屁民
+电话监
+甸果敢
+都当警
+发牌绝
+粉末型
+钢针狗
+共王储
+国库折
+果敢地
+豪圈钱
+华帝国
+华门开
+划老公
+挥发型
+活不起
+机定位
+机号定
+机号卫
+机卡密
+江太上
+金扎金
+敬请忍
+举国体
+可提玛
+克千术
+来福猎
+李咏曰
+丽媛离
+聊斋艳
+令家党
+伦理片
+玛雅预
+氓培训
+民储害
+南充针
+拍肩型
+牌技网
+普通嘌
+惹的国
+人真钱
+认牌绝
+韶关斗
+韶关旭
+失眠药
+世界通
+试答案
+是躲猫
+手机跟
+手机监
+手机窃
+手机追
+售单管
+售冒名
+售五四
+售信用
+术牌具
+水阎王
+替人体
+天朝特
+维汉员
+委坐船
+瘟加饱
+瘟假饱
+乌蝇水
+无抵押
+喜贪赃
+香烟型
+协晃悠
+新建户
+姓忽悠
+晕倒型
+炸立交
+针刺案
+针刺事
+众像羔
+州三箭
+装弹甲
+安眠藥
+暗访包
+拜大哥
+避孕膜
+波推龙
+不查都
+不查全
+踩踏事
+苍山兰
+操了嫂
+操嫂子
+插屁屁
+车牌隐
+惩贪难
+充气娃
+冲凉死
+答案包
+打标语
+打错门
+打死人
+大嘴歌
+代表烦
+代您考
+代讨债
+代追债
+贷借款
+党后萎
+导爆索
+导叫失
+导小商
+到花心
+的同修
+等级證
+递纸死
+电警棒
+蝶舞按
+顶花心
+顶贴机
+顶帖器
+东京热
+东伊运
+東京熱
+董元辰
+毒蛇钻
+段桂清
+躲猫猫
+俄羅斯
+儿园惨
+儿园砍
+儿园杀
+儿园凶
+发贴机
+法能功
+范燕琼
+仿真证
+佛同修
+福香巴
+府包庇
+妇销魂
+富民穷
+冈本真
+岡本真
+港馬會
+港鑫華
+搞媛交
+告洋状
+跟帖器
+狗日的
+乖乖粉
+官商勾
+国家妓
+国统会
+國內美
+哈狗帮
+海访民
+和狗交
+和狗性
+和狗做
+紅色恐
+胡适眼
+护卫团
+激光汽
+级办理
+级答案
+集体腐
+甲虫跳
+甲流了
+简易炸
+江丑闻
+江嫡系
+揭贪难
+姐服务
+姐兼职
+姐上门
+警用品
+就爱插
+就要色
+绝食声
+开邓选
+砍杀幼
+砍伤儿
+康生丹
+康跳楼
+考考邓
+考联盟
+考前付
+考试保
+控制媒
+骷髅死
+乐透码
+李晓英
+力月西
+利他林
+联盟党
+聯繫電
+领土拿
+龙虎斗
+隆手指
+陆同修
+伦理大
+伦理毛
+落霞缀
+漫步丝
+忙爱国
+妹上门
+门保健
+门徒会
+門服務
+免电灯
+摩小姐
+木齐针
+幕前戲
+妞上门
+女技师
+女上门
+鸥之歌
+拍肩神
+普提功
+切听器
+勤捞致
+清純壆
+情妹妹
+琼花问
+娶韩国
+全真证
+容弹量
+柔胸粉
+如厕死
+三网友
+色电影
+色妹妹
+色小说
+杀指南
+山涉黑
+上门激
+烧瓶的
+韶关玩
+社会混
+深喉冰
+神七假
+沈昌功
+生被砍
+生踩踏
+生意宝
+圣殿教
+狮子旗
+十八等
+实体娃
+士的年
+士的宁
+式粉推
+视解密
+手木仓
+售纯度
+售防身
+售狗子
+售热武
+售三棱
+售左轮
+书办理
+丝情侣
+丝足按
+司法黑
+四博会
+四大扯
+苏家屯
+速取证
+蹋纳税
+泰兴幼
+泰州幼
+特工资
+特上门
+田田桑
+田停工
+铁血师
+同盟党
+偷啪,dv
+偷肃贪
+偷偷贪
+王立军
+王益案
+网民案
+网民诬
+伪政府
+温影帝
+纹了毛
+五套功
+五月天
+午夜电
+午夜极
+雾型迷
+习进平
+习晋平
+洗澡死
+陷害案
+陷害罪
+香港彩
+硝化甘
+新疆叛
+新疆限
+新搪人
+性服务
+性伙伴
+徐玉元
+学位證
+亚硒酸
+严晓玲
+言论罪
+氧化汞
+恙虫病
+要泄了
+液体炸
+伊皮恩
+遗情书
+乙醇腈
+乙硼烷
+乙酸汞
+婴儿命
+雍战胜
+永伏虫
+幽谷三
+游精佑
+愚民同
+愚民政
+与狗性
+冤民大
+鸳鸯洗
+原装弹
+袁腾飞
+援藏网
+韵徐娘
+遭便衣
+遭到警
+择油录
+张春桥
+张宏宝
+张文中
+张志新
+针刺伤
+针刺死
+政论区
+植物冰
+指纹膜
+指纹套
+中办发
+昼将近
+主神教
+属灵教
+装消音
+尊爵粉
+黄小说
+性技巧
+ 11msu.com
+ 1667677'*'
+ 5579-8676
+ 562109065
+ 631008986
+ 634681434
+ 707700266
+ 764411233
+ 813988700
+ 893919854
+ 931711182
+ 983612714
+ 992910953
+ rrmrw.com
+ weld8.com
+ wsf76.com
+阿勒泰
+毕业证
+蹭网卡
+车牌号
+电子眼
+工婚恋
+后附款
+零定金
+媒人网
+免定金
+哪里找
+奶油冰
+企业家
+情侣装
+秋秋号
+熟媒人
+探伤机
+网恋网
+先验票
+易德富
+张会计
+找小姐
+找鸭子
+真本科
+ yxly6.com
+鸡皮肤
+精华液
+去鸡皮
+马嘉爵
+傅怡彬
+太石村
+ bbc.co.uk
+明心网
+明思网
+银龙岛
+留园网
+蒋世华
+綦彦臣
+吴一然
+李毅斌
+欧阳懿
+陶海东
+蔡陆军
+杜导斌
+罗长福
+王小宁
+马亚莲
+郑贻春
+李建平
+许万平
+任自元
+李元龙
+郭起真
+陈秋兰
+白秀华
+邓力群
+周恩来
+宋庆龄
+孙中山
+彭德怀
+董必武
+陈独秀
+瞿秋白
+向忠发
+蒋介石
+宋美龄
+蒋经国
+蒋方良
+马英九
+长濑爱
+小泽园
+朝河兰
+大泽惠
+女教师
+无修正
+於幼军
+司法部
+公检法
+检察院
+信产局
+不爱党
+反对党
+辛灝年
+ tiananmen
+四事件
+4事件89
+法某功
+邓矮子
+伊斯兰
+劣等人
+白头山
+四六级
+收小弟
+帮招人
+国办发
+眼角膜
+天下彩
+卖自己
+做网站
+ dragonmen
+斗地主
+男妇科
+畜牧局
+短期租
+脂膜炎
+牛郎店
+长寿枕
+鼻炎枕
+颈椎病
+腰椎病
+香薰SPA
+牙周炎
+牙周病
+口腔科
+防刺服
+长警棒
+警戒带
+华域通
+制幻剂
+性器具
+射鱼器
+江病危
+监视器
+会计证
+八段锦
+宝莲灯
+彩虹剑
+成龙记
+成仁记
+春闺梦
+春欲手
+大练士
+大侠魂
+百性阁
+御花王
+俗人岛
+夜猫网
+恶魔岛
+不夜城
+品色堂
+買到槍
+加密狗
+截听器
+火车票
+遥控器
+慢转器
+调校器
+倒转器
+节电器
+减重器
+通行证
+复制器
+复制机
+复制卡
+隐性笔
+遥控锁
+探测门
+检测器
+接收机
+买小孩
+飞天冲
+开门红
+二踢脚
+飞天雷
+卖角膜
+卖骨髓
+硝酸汞
+碘化汞
+溴化汞
+羰基镍
+硒酸钠
+癸硼烷
+戊硼烷
+乌头碱
+藜芦碱
+碘甲烷
+丙烯醛
+二羟基
+丙炔醇
+乙烯砜
+地高辛
+花青甙
+黄降汞
+红降汞
+三仙丹
+醋酸汞
+红矾钠
+羰基铁
+四乙锡
+钒酸酐
+锇酸酐
+祖母绿
+翡翠绿
+巴黎绿
+草地绿
+二硼烷
+硼乙烷
+十硼烷
+十硼氢
+五硼烷
+芥子气
+白路新
+附子精
+赛丸丁
+尼古丁
+计明胺
+杰莫灵
+卡巴考
+丙烯腈
+氮丙坏
+吖丙啶
+高哌啶
+烯丙胺
+甲基碘
+二硝酚
+烯丙醛
+败脂醛
+巴豆醛
+烯丙醇
+苯硫酚
+巯基苯
+卡巴醌
+卡波醌
+二噁英
+马桑苷
+回苏灵
+纽瓦克
+谷赛昂
+杀螨隆
+多灭灵
+克螨隆
+脱麦隆
+大灭虫
+杀螟畏
+毒虫畏
+杀虱多
+氧乐果
+治线灵
+西梅脱
+敌死通
+三赛昂
+益赛昂
+易赛昂
+乙赛昂
+保棉丰
+伐线丹
+力满库
+阿米吨
+棉花宁
+福太农
+扑打杀
+扑打散
+敌敌畏
+杀螟松
+速灭虫
+速灭松
+苏米松
+稻丰散
+益尔散
+爱乐散
+敌克威
+庚硫威
+久效威
+肟吸威
+灭害威
+灭多威
+灭多虫
+灭索威
+乙肟威
+克百威
+呋喃丹
+虫螨威
+自克威
+兹克威
+伐虫脒
+抗螨脒
+抗虫威
+多防威
+肟杀威
+棉果威
+虫草灵
+杀线威
+草肟威
+敌蝇威
+涕灭威
+涕灭克
+铁灭克
+腈叉威
+恶虫威
+苯恶威
+异索威
+异索兰
+农螨丹
+灭扫利
+凯素灵
+凯安宝
+保棉丹
+康素灵
+放线酮
+农抗101
+地乐施
+特乐酚
+地乐酚
+敌磺钠
+敌克松
+地可松
+不膏津
+硫特普
+触杀灵
+苏化203
+治螟灵
+西力生
+谷乐生
+灭蚜胺
+法尼林
+敌锈酮
+毒菌锡
+艾氏剂
+狄氏剂
+毒杀芬
+克灭鼠
+克杀鼠
+杀鼠灵
+华法灵
+灭鼠灵
+杀鼠迷
+立克命
+溴鼠隆
+敌拿鼠
+鼠得克
+灭鼠安
+野鼠净
+灭鼠丹
+扑灭鼠
+灭鼠优
+抗鼠灵
+抗鼠灭
+没鼠命
+毒鼠强
+鼠立死
+鼠特灵
+鼠克星
+灭鼠宁
+伏鼠醇
+杀它仗
+溴敌隆
+乐万福
+地戈辛
+助听器
+VPN代理
+32-羟基
+迷欲水
+克他命
+失忆水
+蒙汉药
+乖乖水
+听话药
+亲密药
+快樂丸
+欢乐丸
+甩头丸
+打牌药
+赢钱药
+微音器
+切聼器
+凯安拓
+富国者
+优比特
+卫星狗
+卫星眼
+反雷达
+预警器
+翻牌机
+征服者
+金战神
+南极星
+路耐士
+硝酸钾
+硝基胍
+硝基脲
+持屈儿
+海西尔
+黑索金
+喷特儿
+继爆管
+导火索
+烟火剂
+梯恩梯
+苦味酸
+赛力散
+敌蚜胺
+胡椒醛
+青蒿素
+黄体酮
+黃麻素
+小口径
+野营刀
+警示器
+勃朗宁
+侦查证
+乐透乐
+野人谷
+高仿真
+雷明登
+反测速
+硝酸胺
+可可碱
+咖啡因
+氮化铅
+花和尚
+硝酸甘
+驾驶证
+干扰王
+鸡尾酒
+浓硫酸
+翻转架
+潜伏者
+小黑豹
+硝酸铵
+朝鲜版
+大黑鹰
+力思曼
+麻黄碱
+羟亚胺
+自制式
+大威力
+操表姐
+接收器
+飞鹰A25
+导爆管
+左轮狗
+工字牌
+韦小宝
+亚梨沙
+吡啶胺
+OO2甲基
+123苯并
+OO2乙基
+雪狼T91
+影音盒
+吐根碱
+爱与性
+A4U在线
+级电影
+暴光王
+引暴器
+起爆器
+起暴器
+启暴器
+启爆器
+引爆器
+tnt制作
+tnt哪里
+伯莱塔
+巴雷特
+单管猎
+黄麻素
+人品币
+开心水
+麦角醇
+手拉AWP
+土仿狗
+武士刀
+小飞虎
+小飞狼
+信用卡
+追风150
+水果冰
+影音棒
+仿真狗
+化学冰
+咖啡硷
+咖啡碱
+可可精
+姐妹花
+莋弊噐
+IED制作
+排漏弹
+雷明顿
+雷鸣登
+力斯曼
+春军团
+美洲豹
+咪咪爱
+金狐狸
+御花园
+摩洛客
+浓硝酸
+燃烧剂
+共享盒
+捕狗药
+色人阁
+色上色
+射钉弹
+射孔弹
+变号器
+改号器
+杀破狼
+松岛枫
+色网址
+幼幼论
+逍遥游
+小蜜蜂
+叶雨茗
+导航狗
+折叠狗
+阿兵哥
+警查证
+储蓄卡
+借记卡
+网银卡
+信号弹
+尼泊尔
+马士革
+译码器
+苯基醇
+附体记
+曲马多
+广陵传
+鸿图记
+护花剑
+花穿越
+降头师
+金赢传
+冷香谷
+猎芳谱
+猎魂纪
+领域战
+乱游记
+美人图
+梦想家
+妙人间
+魔尊曲
+千夫斩
+青云路
+穹游记
+群芳谱
+三折剑
+色哥哥
+色间道
+神风曲
+双姝记
+天如月
+嬉美图
+相河记
+消遥尊
+逍遥王
+逍遥尊
+小新娘
+邪艳曲
+修罗劫
+玄媚剑
+玄女经
+艳魂咒
+艳欲路
+妖刀记
+妖晶记
+鹰狼传
+游龙传
+诱君欢
+玉女盟
+珍珠令
+紫情绳
+生殖器
+大祚榮
+公开信
+火箭筒
+加弹器
+少精症
+手拉m14
+手拉狙
+开山刀
+花间曲
+手拉鸡
+猎木仓
+气木仓
+热兵器
+燃烧瓶
+起爆药
+弹簧刀
+蝴蝶刀
+妈妈色
+小鸡鸡
+色老汉
+潘金莲
+致幻剂
+代打卡
+聊天室
+艾滋病
+亡灵全
+电视棒
+翻牌器
+换牌器
+身份证
+电视卡
+彩信猫
+发爆器
+办假証
+色大嫂
+百凤宫
+色中色
+性酒吧
+老公们
+通天报
+认证书
+飞叶子
+草榴网
+黄图哥
+包射网
+唐人阁
+色客网
+妖狐网
+小雄传
+真人888
+爱良窝
+豪享博
+楼凤网
+情狐
+媚毒
+原点
+疯诉
+污黑
+路人
+琼觞
+缠上
+村医
+浴城
+村奴
+姐夫
+球讯网
+日博365
+博宝金
+浪妹网
+明升M88
+销售ppk
+色聊网
+幼色网
+性影院
+性春吧
+Fing霸QQ
+卖心脏
+刀努网
+薄码DVD
+崔情水
+崔情粉
+白虎妹
+思巢网
+色播播
+色播器
+溜冰妹
+多夜情
+祼聊网
+气弹槍
+神之欲
+花荫露
+仿五四
+pcp配件
+三客优
+毒龙钻
+风月阁
+色窝窝
+释欲堂
+极乐岛
+都市缘
+救国P2P
+色老头
+快色吧
+色一色
+色老妈
+tnt配方
+色婷婷
+妻色网
+卖藏刀
+买藏刀
+99%的冰
+神仙水
+人兽情
+性中性
+賣槍支
+色色岛
+找殺手
+增值税
+龙卷风
+十六大
+小灵通
+花园网
+18DY电影
+2005言论
+ Government
+ 360vk.info
+ 799789.com
+ 86cryp.com
+ 928ddz.com
+ dc8888.com
+ dgldit.com
+ girl668.cn
+ hxzj08.com
+ lenven.net
+ ok0411.com
+ qyao909.cn
+ rhtzxc.com
+ rtgjfz.com
+ sosook.com
+ souker.com
+ toomore.cn
+ tuxilei.cn
+ usb3721.cn
+ vikecn.com
+ wtianx.com
+ wxttfs.com
+ xinkeor.cn
+ zjjvip.com
+百乐2号
+逢8必灾
+ 3caoh22ph3
+j糸己元
+ wwwvipf4cn
+巨h慎入
+ seseyvmjcn
+超虐高h
+ liuxue1668
+代榘l票
+帶榘l票
+何新1990
+8341部队
+陈liangyu
+ 8008103456
+ johntitoer
+普寧626
+A集中营
+a级情片
+>真美妙
+ vangda.com
+>我是猪
+>我該死
+E科士威
+拍肩,药
+ 1140177463
+ 12394'*'154
+ 1298635486
+ 1569053324
+ 1738617380
+ 1789178010
+ 1819006630
+ 1961025666
+ 1969140008
+ 5621o9 o65
+ ayisou.com
+ c3h.com.cn
+ coooov.com
+ fangpz.com
+ liuyue.net
+ uuuwan.com
+ xueyaj.com
+ yvxuan.com
+ acomcn.com
+ ggkkjj.com
+ xcomcn.com
+ 17xyou.com
+ Falun Dafa
+ Li Hongzhi
+ epochtimes
+ oppression
+8023部队
+免费q币
+core病危
+J总病危
+h搜神记
+十8和谐
+雪狼T9-1
+ PixelawDog
+ StrongHDTV
+4乙基铅
+2乙基汞
+4乙基锡
+4氧化锇
+丙烯1醇
+2吡咯酮
+抗霉素A
+甲基1605
+high乐神
+手机Jian
+ qiān dàn
+2硝基苯
+2硝基萘
+3硝基苯
+泽4氮烯
+a级大片
+4碳酰镍
+2氧化氮
+3氮化钠
+2甲弗林
+3氮杂苯
+ 1963661267
+间苯3酚
+1元模具
+3级影片
+女人的b
+zg60华旦
+手拉1911
+成都T恤
+叶子hash
+狮王2012
+h片网址
+专卖g水
+直销g水
+订购g水
+宾馆群p
+宾馆群P
+庐江群P
+欧美H片
+销售cp99
+petn制取
+国产H片
+petn制作
+PETN合成
+动漫H片
+快播H片
+Happy水QQ
+ooxx人妻
+嫩B电影
+毒 配方
+日本H色
+供應M300
+销售M300
+18年纪念
+1969 尼木
+神鬼18妓
+27军军长
+美国c2007
+ 02260504639
+ 13295168065
+ 13731903527
+64小時绞
+ 1357'*''*'378
+第一次3p
+眼镜oo型
+oo型眼镜
+sf一条龙
+红朝43年
+南航b2959
+97年南航
+t195和5034
+鲁h9656警
+b-阻断剂
+ garden_news
+ humanrights
+ rexuebaobao
+ sanew-cable
+ zhenshanren
+8.9事件
+安-眠-药
+法+輪+功
+干 你 妈
+共+产+党
+共+產+黨
+共+铲+党
+共.产.党
+共chang党
+護士24點
+老 婊 子
+李 洪 志
+蒙-汗-药
+迷-魂-药
+真n善n忍
+IM买卖通
+炸ZF大楼
+64杀学生
+93夜之女
+f.l.g旗帜
+38集团军
+卖qq号码
+黄 牙 签
+奶 油 冰
+BEELY官方
+ sigline.gif
+高压狗QQ
+5氧化2钒
+4氧化2氮
+2-吡咯酮
+46级考试
+日本MARUI
+36磅纯度
+81蚜克丁
+2仲丁基4
+ FlexiSpyPRO
+ asianapples
+ spyflexispy
+德国A1000
+ 18289325866
+ 15990489698
+qq賣獵槍
+狼友av网
+爱bb影院
+OK娱乐城
+av播放器
+快播av站
+亚洲3p图
+Hgame下载
+夫妻玩6P
+庐江6P门
+庐江县6p
+3U娱乐城
+安徽5P门
+膛线管qq
+安徽5p门
+欧美se图
+亚洲se图
+气动狗QQ
+掌心雷QQ
+高仿证qq
+警官证qq
+就去97色
+真人21点
+黄se图片
+黄se电影
+黄se网址
+杜冷丁QQ
+黄se小说
+黄se网站
+最新se站
+冰钻石qq
+购买xwodi
+qi槍专卖
+高压狗qq
+qq卖手槍
+qq卖獵槍
+销售CS狗
+卖腎源QQ
+卖腎臟QQ
+买腎源QQ
+卖冰钻QQ
+卖鉆石QQ
+卖冰磚QQ
+李 宏 志
+真 善 忍
+死亡笔记
+帝国之梦
+投毒杀人
+强硬发言
+侦探设备
+手机复制
+天鹅之旅
+盘古乐队
+血腥图片
+手机魔卡
+轮暴致死
+黄网导航
+汕尾事件
+仁寿警方
+杀人事件
+赣江学院
+日本小泉
+车牌反光
+人体艺术
+传真群发
+美女做愛
+放荡青春
+电车之狼
+对日强硬
+军长发威
+公产小丑
+联国专员
+迪里夏提
+伊扎布特
+公产王朝
+边坝时间
+对华广播
+你退了吗
+茶余饭后
+秘密花园
+痴男发威
+超越红墙
+导演专访
+交换夫妻
+浮情浪子
+雪染飘朱
+凌虐玉门
+黑灯舞厅
+烈火凤凰
+鹿鼎记趣
+母之欲火
+四海龙女
+考验答案
+激流中国
+渊盖苏文
+昔有山西
+今有广东
+方丈哭曰
+经典语录
+春节晚会
+现代中国
+十大恶词
+性学教授
+出墙红杏
+ go-vern-ment
+新诗年鉴
+美国凯德
+中央军委
+苏东解体
+反右题材
+山西洪洞
+巨额骗储
+五奶小青
+红楼绮梦
+夫妇乐园
+黑星女侠
+狂风暴雨
+俪影蝎心
+舌战法庭
+清华网管
+一卡多号
+黑窑奴役
+山不过来
+股市民谣
+禁断少女
+官逼民反
+中原油田
+油田总部
+香港马会
+奴役童工
+计生风暴
+智能H3
+口头检查
+三句硬话
+阻无通畅
+民为法执
+美国之音
+求救遭拒
+手足口病
+ 51ganrao.com
+ 52kanshu.net
+ 58yinshi.com
+ 97sesevk.com
+ chaolicy.com
+ city2046.com
+ hd315.gov.cn
+ hihigirls.cn
+ hyidc.com.cn
+ idea4ever.cn
+ myqzy.com.cn
+ pifuxuan.com
+ sosalary.com
+ texishop.com
+ tooogooo.com
+ wokuangmo.cn
+ xuxulove.com
+ yjtx2008.com
+博翔团队
+皇冠投注
+替比夫定
+营销利剑
+出千工具
+香港总彩
+看底牌器
+董存瑞问
+考包粽子
+畅日套餐
+人民政腐
+届届失业
+吴琼hua问
+董cun瑞问
+体委高俅
+部长大禹
+何邪社会
+毒署署长
+三个呆婊
+警痞难辨
+莫友甲板
+慈夫万岁
+小姐陪吸
+官官皆贪
+劉胡蘭問
+专家万税
+朱閒基传
+逗逗小胡
+拒廉变腐
+小平无奈
+董存瑞说
+毛岸英问
+民工滔滔
+民间语录
+如此公仆
+一个涨字
+明年米贵
+福娃哭了
+逢是灾年
+磴在汶川
+举国同震
+神州共震
+震其国土
+震到国外
+震不死人
+不育不运
+四个大当
+搞怪福娃
+布什胡哥
+胡哥布什
+六零年苦
+中国悍匪
+日李万姬
+你乃人民
+裆的干部
+毛胜蒋败
+凯德原装
+刾德原裝
+香港ghb水
+手檆嘎犉
+炸彈製作
+教你做弹
+自殺手冊
+国足要命
+超越紅牆
+翻墙软件
+680u7d密道
+680p7d专业
+翻墙工具
+重启联通
+国足可笑
+远离国足
+牛奶三宝
+奶业内幕
+问奶牛去
+三鹿笑话
+三鹿黑幕
+三鹿300万
+面粉掺假
+海米抹红
+绿坝克星
+界浏览器
+桔子有虫
+橘子有虫
+种毒食品
+食品黑幕
+粪水腌制
+翻墙访问
+北航甲流
+足坛反赌
+黑道狂神
+侮辱藏人
+吾尔开希
+僧侣被捕
+中国断交
+焚烧寺庙
+凯度顿珠
+干扰火炬
+辱我中华
+果敢难民
+果敢战事
+針刺事件
+针扎事件
+針扎事件
+司机罢运
+贡傥覆灭
+不明针状
+不明針狀
+缅甸战事
+称供污圆
+新疆七五
+排华运动
+策反份子
+零八憲章
+家家难民
+石油兄鉴
+崇尚熊市
+忠告股民
+鱼肉散户
+股民跳楼
+新股民吧
+股市笑话
+套牢莽莽
+咏股伤怀
+股灾风光
+炒股國歌
+股市歡迎
+股民自编
+中石油版
+股市之痛
+股市被套
+问中石油
+股股下流
+股民别哭
+股市对联
+告股民书
+炒股泪歌
+股民默哀
+股民亏损
+益西彭措
+洪法交流
+远唤上师
+遥唤上师
+大糸己元
+修行盛世
+失传正统
+济世灵文
+ himalayansky
+ karmapajenno
+禁室培欲
+亚洲嫩苞
+消魂午夜
+街拍美臀
+紧身美臀
+插的好爽
+腋毛美女
+口罩同好
+胯下失守
+姐弟销魂
+群虐老婆
+鹿城娱乐
+缩紧后庭
+逃亡艳旅
+小姐秘籍
+清梅飘香
+浴室系列
+照日天劫
+玲珑孽怨
+妹妹爽图
+西苑风月
+魔刀丽影
+前妻禁欲
+特甲少女
+大腿舔食
+香艳文学
+欲海双艳
+都市花盗
+鋘售假幣
+考中答案
+鑫萢集坒
+杭州辩证
+ masterkey258
+考试助手
+ www7selangcn
+ passboxgmcom
+ 075533941960
+ wa12568yahoo
+英杰教育
+ gjzjid666com
+ wwwtenyuncom
+ takeflash163
+ xsddz2008com
+ chinachsicom
+ dabiaodkwcom
+ cuiqingnetcn
+ ltotiwangcom
+考后给钱
+ luoliaowzcom
+ zhukao360com
+ zhongguokjcf
+教育考王
+诚信辦譪
+香港一类
+ www198988net
+ hengxinkaocn
+ sofghg01sina
+ xinde158sohu
+启鸣考务
+ benma5588com
+ lwygh8796163
+保高分过
+ sacredbuddha
+ xsbdz2008com
+ lunwen999com
+ wwwzbgamenet
+ dewang518com
+ qq1030515241
+程通办理
+ qq1036371099
+恒顺贷考
+ 053266637977
+ wuhuan123com
+五星宏辉
+ 015806579353
+ xsjdz2010com
+ wwwyiyeflcom
+冠诚考务
+上海舒莲
+泰盛环球
+ 588688kswcom
+ wwwkanbbinfo
+ shuibi88sohu
+ wwwjqcshagcn
+ gzdadeedu163
+ cctvgouwucom
+ gzdadeeducom
+ jiachao666nl
+ qq1106392111
+ qq1220096578
+ wwwwin388com
+ wwwtyd1688cn
+ kuaidi123com
+ 045181087569
+ sifazhukaocn
+ qq1198752945
+ lihuanan2009
+ pinsedidaicn
+ liuxuerzh163
+ chengxinjycn
+ 52mingdaocom
+ 91chengrencn
+ 025bsdeducom
+ 82suncitycom
+ 189721783333
+ 80suncitynet
+ luolewdwdcom
+ yycetkuucncn
+ 113928444430
+ jiupinchacom
+緒上辦譪
+天水辦譪
+ 151581596416
+ 82sumcitycom
+竣捷考务
+英杰考务
+ chinafzkjcom
+ chnanplascom
+ indiastudycn
+无耻语录
+向党挑衅
+警车被砸
+官员别墅
+杀人卖尸
+殺人賣屍
+童工暗流
+童工市场
+兆山羡鬼
+零八宪章
+尸油辣条
+豪华葬母
+杨海举报
+雷人提案
+争议提案
+骇人提案
+袭击哨兵
+李佳事件
+麈柄坚挺
+父亲龙修
+巴东烈女
+永麦酒店
+石首命案
+抢尸行动
+石首尸首
+旭日打斗
+共慿主義
+河蟹社会
+韶关群殴
+万人抗暴
+油乱涨价
+韶关事件
+惨遭石刑
+霾雾侵袭
+痞子治国
+央视无耻
+朱瑟里诺
+万人上书
+任意羁押
+中央澄清
+温总太太
+托管造林
+百姓冤沉
+脱亚入世
+警车凭啥
+马德卖官
+厅长落马
+白勒依勒
+福娃变换
+胡总好棒
+郴州巨贪
+涉嫌倒把
+瀛台宴请
+巴克曼法
+招考黑幕
+军道杀拳
+想涨工资
+哄骗职工
+软弱外交
+东海中日
+落户古雷
+烧砸学校
+白桦气田
+买通砀山
+改卷内幕
+东莞童奴
+机场打砸
+蟾蜍搬家
+蟾蜍迁徙
+捐款作假
+非法裁减
+中日东海
+恶心部门
+中国洋奴
+杀婴凶手
+问责风暴
+植树造零
+开原游街
+杨佳列传
+三位昏官
+伸冤条幅
+普宁传闻
+刀客不朽
+袭击衙役
+离弃供谠
+离弃供傥
+小平转世
+李蕊蕊案
+揭黑厅幕
+检阅小姐
+亳州特警
+紫陽軟禁
+进京抓女
+丽媛习近
+马雅预言
+巨贪肖扬
+陇南事件
+赦免杨佳
+杨佳杀警
+上海杀警
+杨佳万岁
+白领陨落
+黑领升起
+黑领崛起
+集体端掉
+红鱼政权
+灰色宾馆
+警号0472'*'
+沈婷之权
+谴责跑跑
+永康俞家
+石首事件
+浮山教案
+谭作人案
+周济捣蛋
+林昭因病
+刘和涉嫌
+谷歌退出
+ 028-68228818
+ 075521043777
+4.25事件
+ LittleBuddha
+ Reminiscence
+ shehuibaitai
+《苹果》
+《天音》
+阿不来提
+艾司唑仑
+艾斯海提
+爱国运动
+八荣八耻
+巴音朝鲁
+办高利贷
+办理大专
+辦理文憑
+辦理證件
+报告汇编
+北京当局
+北京高层
+北京海艺
+北京黑幕
+北京京郊
+北京美女
+北京小姐
+北京战争
+北京政权
+北京之春
+北美讲坛
+苯巴比妥
+变革之风
+变声电话
+變聲電話
+兵种教材
+波动少女
+波動少女
+财政是爹
+草莓牛奶
+超常科学
+陳方安生
+成佛做主
+传九退三
+春夏之交
+大家论坛
+大庆工潮
+大型地网
+大學騷亂
+代发广告
+代刻印章
+代人发帖
+党保平安
+党内权力
+党内权争
+党内危机
+党政人事
+德国宝马
+地方召会
+地块规划
+地下教会
+地下刊物
+地下先烈
+帝國之夢
+电动葫芦
+電車之狼
+電話攔截
+叮丙诺菲
+东方闪电
+东方时空
+董存瑞問
+动态代理
+賭博專用
+多吉才让
+多难兴邦
+反腐总攻
+方针定调
+防身药水
+放下生死
+飞扬论坛
+粉嫩小洞
+粉饰太平
+风雨神州
+服务人员
+服务上门
+服务小姐
+妇的哀羞
+复转军人
+高校騷亂
+高薪养廉
+高压锅炉
+哥言语录
+歌功颂德
+个人崇拜
+股票开户
+观音法门
+广安事件
+廣安事件
+国家安全
+国家机密
+国之利刃
+航星洗涤
+和平修练
+黑瞎子岛
+红魂网站
+红旗漫漫
+红色贵族
+红色角落
+红色恐怖
+红头文件
+虎胆雄心
+虎膽雄心
+花花公子
+华夏文摘
+话紫禁城
+换届隐忧
+黃色電影
+黃色圖片
+黄海事件
+惠澤社群
+及川奈央
+吉祥宝贝
+纪律检查
+家用天线
+家用卫星
+假人民币
+建定防火
+江泉集团
+江三条腿
+江泽公审
+阶级敌人
+揭个黑幕
+金澤文子
+津人治津
+禁忌试玩
+禁忌試玩
+京郊旅游
+惊悚空间
+精确答案
+驚悚空間
+警用教材
+警用设备
+军事标号
+军事地图
+军政名单
+軍長發威
+咖啡文化
+开机信息
+刊文回谢
+抗菌纤维
+考后付款
+考前发放
+恐怖分子
+恐怖牢笼
+恐怖牢籠
+恐懼殺手
+拉帮游说
+拉票贿选
+拉萨事件
+劳工观察
+李三共志
+李月月鸟
+连队资料
+联名上书
+练功群众
+两岸关系
+两个中国
+两派争斗
+两性狂情
+辽阳工潮
+猎杀熊猫
+临震预报
+灵修团体
+铃声下载
+令狐计划
+留四进三
+六月联盟
+六月聯盟
+绿叶电器
+伦理电影
+轮子小报
+毛都露出
+美国参考
+美女視頻
+蒙古回归
+蒙古之友
+咪达唑仑
+迷失北京
+秘密潜入
+民族矛盾
+民族问题
+末世劫难
+木子论坛
+奶头真红
+南华早报
+年春衫薄
+派系斗争
+盤古樂隊
+跑官要官
+泡沫经济
+皮指纹测
+品牌香烟
+槍決女犯
+槍決現場
+槍支彈藥
+强开工具
+秦青的幸
+轻舟快讯
+清场内幕
+清海师父
+权力瓜分
+权力核心
+群体灭绝
+群体事件
+群體事件
+人工少女
+人民真实
+人事任免
+人事推测
+人事预测
+人事预言
+仁吉旺姆
+瑞丽公司
+三个代表
+三個代表
+三浦愛佳
+山寨手机
+善恶有报
+商务时空
+上海交大
+上门小姐
+少儿不宜
+涉台政局
+神的教会
+神洲电影
+沈默殺手
+时代互联
+时代论坛
+时事论坛
+世界之门
+收取小费
+手工发贴
+手机铃声
+手机游戏
+手機復制
+手機跟蹤
+司法警官
+絲襪寫真
+死亡筆記
+死亡日志
+死亡日誌
+四川朱昱
+台海盾牌
+臺灣獨立
+滔天大罪
+淘宝白号
+淘宝收藏
+特别党费
+特务机构
+天鵝之旅
+天国乐团
+天互数据
+天津事件
+天伦王朝
+天宇二手
+偷窺有罪
+头号警花
+投毒殺人
+透視眼鏡
+透視照片
+突破技术
+屠龙别记
+外交论坛
+万达卫浴
+万能钥匙
+萬能鑰匙
+网络代理
+伪装美女
+偽裝美女
+魏东死亡
+温切斯特
+温休曾退
+文件秘密
+窝囊中国
+我虽死去
+乌兰木伦
+巫毒娃娃
+吳瓊花問
+吾尔开西
+吾尔凯西
+梧桐文化
+五出三进
+武汉办証
+侮辱老师
+夕樹舞子
+西山会议
+吸血莱恩
+吸血萊恩
+香港明报
+香港总部
+向巴平措
+消业之说
+心藏大恶
+新华举报
+新华内情
+新式军服
+新约教会
+信用危机
+兴华论谈
+星崎未來
+修改成绩
+学生信仰
+学生运动
+雪山狮子
+血色京机
+血色京畿
+血色黎明
+血腥圖片
+燕玲论坛
+燕南评论
+业力回报
+夜半加税
+夜勤病栋
+液压马达
+一帆通讯
+一军两策
+一中一台
+亿龙汽车
+异见人士
+异议人士
+易购手机
+易切削钢
+隱形噴劑
+英語槍手
+永磁吸盘
+优化官员
+友通科技
+诱发恶性
+宇宙真理
+宇宙主佛
+玉森集团
+域名备案
+战斗条令
+战役学纲
+找工总行
+找建总行
+找农总行
+找人发帖
+針孔攝像
+偵探設備
+争鸣论坛
+整形美容
+正浩净化
+正见周刊
+正念正行
+证券从业
+中国之春
+中國當局
+中华大众
+中华讲清
+中华时事
+中雷产品
+中央文件
+中央资料
+重庆钢构
+周刊纪事
+专科毕业
+专业顶帖
+专业发帖
+专业维修
+专业修理
+自殺指南
+自制手槍
+法新闻社
+白宫事件
+追查国际
+法网恢恢
+洪发交流
+绝食抗暴
+师傅法身
+联邦政府
+秘密文件
+机密文件
+政府文件
+隐私图片
+卫星电视
+广电总局
+飞凤春宵
+应召女郎
+雪肌夜叉
+禁宮秘史
+少女换衣
+ chinaliberal
+ haokafei.com
+秘密潛入
+师父法身
+电话询问
+中国特色
+当代八乱
+办公室手
+广元橘子
+正统文化
+震撼记录
+感动中国
+血腥时间
+最强阵容
+两岸才子
+中国性城
+基地组织
+校园招聘
+三鹿集团
+三鹿奶粉
+三鹿事件
+赤色杀意
+美国原装
+四川橘子
+风雷游戏
+幸运用户
+进入网站
+yahoo!奇摩
+百度空间
+有奖活动
+炸公交车
+ www.2hand.cn
+《九剑》
+《神灯》
+《仙笛》
+爱的精灵
+爱的色放
+爱情万岁
+案之孽杀
+八大谎言
+包娼包赌
+不再情牵
+差额选举
+赤足惊魂
+慈禧野史
+大乌拉尔
+倒卖土地
+电视共享
+丁丙诺啡
+毒残酷迫
+羔羊医生
+宫闱情变
+官商暴利
+国际公法
+國際公法
+黑狱圣女
+花街狂奔
+幻想玉女
+荒唐禁令
+吉瑟利努
+极度兽性
+家庭教师
+家有艳妻
+禁忌游戏
+绝世遗言
+空军会议
+恐怖袭击
+六大成绩
+灭亡中国
+七大谎言
+倩女销魂
+强震海啸
+氢氧化钠
+卿本佳人
+情难自制
+人肉腊肠
+入联公投
+山中艳谭
+尸蛊艳谭
+师生绮恋
+世纪大案
+世纪血腥
+双面媚娘
+双面女友
+四大怪事
+桃色香居
+特区爱奴
+田螺艳鬼
+玩女无罪
+我为卿狂
+无水乙醇
+五月樱唇
+午夜女郎
+西厢艳谭
+虾录情圣
+夏日狂情
+先烈来电
+新紅唇劫
+刑讯逼供
+杏林春暖
+性趣高手
+凶宅胭脂
+血染红唇
+鸭之一族
+艳绛勾魂
+杨白劳问
+一脱求生
+隐身装备
+与鸭共舞
+玉女聊斋
+欲火龙珠
+中港丽人
+中国储君
+中国太子
+中央十七
+中央团系
+钟馗嫁妹
+梓健特药
+美女写真
+开平受辱
+微型监控
+追踪定位
+足球投注
+527我爱妻
+led显示屏
+当官要精
+导人的最
+邓爷爷转
+都当小姐
+都进中央
+高就在政
+公开小姐
+官也不容
+还中国外
+兼职上门
+酒像喝汤
+据说全民
+克分析仪
+拉开水晶
+理各种证
+美元的月
+牌分析仪
+盛行在舞
+十类人不
+售一元硬
+争相自首
+志不愿跟
+作各种证
+《争鸣》
+阿凡提机
+爱液横流
+把病人整
+把学生整
+百乐二呓
+办理本科
+办理各种
+办理真实
+办理证书
+办理资格
+帮人怀孕
+谤罪获刑
+包青天机
+报复执法
+北京风波
+北省委门
+被指抄袭
+辩词与梦
+冰在火上
+博会暂停
+博园区伪
+部忙组阁
+部是这样
+财众科技
+策没有不
+抽着大中
+抽着芙蓉
+出成绩付
+穿透仪器
+传送答案
+春水横溢
+答案提供
+打死经过
+打砸办公
+当代七整
+当官在于
+党风日下
+党前干劲
+刀架保安
+等人老百
+等人是老
+等人手术
+地产之歌
+第二首都
+点金商务
+点数优惠
+电话交友
+洞小口紧
+恶势力操
+恶势力插
+发贴工具
+法力像佛
+法院给废
+房贷给废
+夫妻交换
+福尔马林
+福娃的預
+福娃頭上
+府集中领
+复印件生
+复印件制
+富婆给废
+改号软件
+港澳博球
+个邪的党
+各类考试
+工程吞得
+攻官小姐
+共青背景
+共字玄机
+狗屁专家
+鼓动一些
+官匪一家
+官因发帖
+光学真题
+广场事件
+国际投注
+国家软弱
+国家吞得
+国统纲领
+哈药直销
+红客联盟
+化学扫盲
+皇家轮盘
+回汉冲突
+火车也疯
+基本靠吼
+绩过后付
+集体打砸
+家一样饱
+家属被打
+解密软件
+进来的罪
+经典谎言
+警车雷达
+警方包庇
+警匪一家
+警民冲突
+究生答案
+九龙论坛
+酒象喝汤
+康没有不
+考前答案
+考前密卷
+考前预测
+考试机构
+考试联盟
+空和雅典
+控诉世博
+矿难不公
+拉线飞机
+狼全部跪
+雷人女官
+类准确答
+李大轮子
+理是影帝
+理做帐报
+力骗中央
+了件渔袍
+猎好帮手
+流血事件
+龙湾事件
+旅游新报
+罗斯小姐
+妈了个逼
+蟆叫专家
+买官卖官
+卖地财政
+猫眼工具
+每周一死
+免费电影
+民九亿商
+铭记印尼
+幕没有不
+泥马之歌
+你的西域
+怒的志愿
+女人和狗
+女任职名
+女士服务
+仆不怕饮
+奇迹的黄
+骑单车出
+千禧弘法
+钱三字经
+强权政府
+抢其火炬
+禽流感了
+清除负面
+区的雷人
+群起抗暴
+群体性事
+群众冲击
+人在云上
+任于斯国
+日月气功
+软弱的国
+瑞安事件
+三股势力
+扫了爷爷
+杀害学生
+煽动不明
+煽动群众
+商务快车
+涉嫌抄袭
+神韵艺术
+圣火护卫
+圣战不息
+十大谎言
+十个预言
+实学历文
+守所死法
+司长期有
+私房写真
+死法分布
+死刑现场
+死要见毛
+诉讼集团
+太王四神
+泰兴镇中
+涛一样胡
+讨厌中国
+天推广歌
+庭审直播
+通钢总经
+网民获刑
+伪基百科
+谓的和谐
+闻被控制
+我的西域
+吾爾開希
+务员答案
+务员考试
+西服进去
+席临终前
+席指着护
+先烈纷纷
+现金投注
+现在的党
+泄漏的内
+兴中心幼
+行长王益
+性推广歌
+学生领袖
+血腥清场
+丫与王益
+一小撮别
+乙撑亚胺
+乙烯甲醇
+影子政府
+有偿服务
+有偿捐献
+有奶不一
+右转是政
+宇宙毁灭
+育部女官
+预测答案
+真钱斗地
+证到付款
+证生成器
+指纹考勤
+制证定金
+中的班禅
+中国不强
+中央黑幕
+种公务员
+种学历证
+重阳兵变
+州大批贪
+宙最高法
+住英国房
+转是政府
+赚钱资料
+追债公司
+自动群发
+总会美女
+足球玩法
+左转是政
+办理文憑
+办理专科
+插入爽网
+答案传输
+考生答疑
+美女服务
+妹妹服务
+取得本科
+取得专科
+热辣美图
+人体写真
+少儿勿入
+少女图片
+声色场所
+ 196.914.0008
+ kwjy-edu.com
+ xkpx-edu.com
+安防系统
+办出生证
+办真学历
+本科业证
+地税发嘌
+公司网址
+联系方式
+买大专文
+买真学历
+免费试用
+全国包送
+商品销售
+天逸代攷
+网页游戏
+武逆乾坤
+星辉汽贸
+易搜手机
+宅男社区
+宅女社区
+招代理商
+恶意灌水
+传奇世界
+信息群发
+确吉尼玛
+星崎未来
+夕树舞子
+金泽文子
+三浦爱佳
+执法犯法
+土匪政府
+国家信息
+不办人事
+ gongchandang
+学院爆动
+猜宝工具
+押宝工具
+电表遥控
+电表干扰
+民族冲突
+劣等民族
+圣战组织
+海军部署
+陆军部署
+空军部署
+四大舰队
+提供答案
+代理记帐
+司法考试
+征兵计划
+收购文物
+有偿献血
+网络电话
+域名注册
+网络空间
+电子邮局
+主机租用
+网站建设
+域名服务
+养殖基地
+企业增资
+代理记怅
+月赚千元
+群发软件
+疯狂免费
+上网娱乐
+富婆找鸭
+远程遥控
+游戏代币
+炎症治疗
+精美女包
+借腹生子
+试管婴儿
+酒店预订
+养殖总场
+转让车票
+破坏火炬
+丰胸美体
+搬家公司
+小吃技术
+山鸡养殖
+山鸡孵化
+会计培训
+电脑培训
+烟囱新建
+烟囱拆除
+犯罪记录
+宾馆住宿
+生殖中心
+胚胎移植
+不孕不育
+围巾披肩
+服饰配件
+仁济医院
+性欲冷淡
+男人元素
+增大增粗
+性保健品
+回收烟酒
+烟酒回收
+立体培训
+汽车租赁
+家政服务
+祛斑胶囊
+肌肉劳损
+发型设计
+烫发染发
+牙齿松动
+牙龈出血
+牙齿出血
+牙齿美白
+口腔美容
+四环素牙
+美白牙齿
+口腔修复
+活动义齿
+全口义齿
+口腔正畸
+牙齿正畸
+口腔卫生
+牙齿检查
+私人牙医
+口腔保健
+口腔护理
+防爆盾牌
+防爆头盔
+警用皮鞋
+强光手电
+警用水壶
+防割手套
+水晶照片
+网络推手
+软文发布
+快速删贴
+清理负面
+删贴公司
+负面撤稿
+后庭专区
+肛栓母狗
+男根增长
+先帝病危
+江总病危
+江已病危
+空调移机
+钢琴搬运
+小说合集
+奇摩登入
+爱上小姨
+安然轻尘
+暗夜情魔
+霸艳邪君
+霸占芙蓉
+百花故事
+百花盛放
+百年庆典
+北京byebye
+冰峰魔恋
+不得不贱
+不死邪神
+不死医神
+步步生莲
+残阳絮语
+苍穹之怒
+藏娇都市
+超级教师
+超级农民
+超级仙医
+超级学生
+超级异能
+处子之作
+穿越进化
+春乡艳少
+春意凛然
+纯属挑逗
+大唐寻芳
+丹药大亨
+帝王艳梦
+第一无赖
+氣狗销售
+销售钻石
+帝国夜色
+夜色贵族
+农夫电影
+夜色王朝
+网上赌钱
+收养宝宝
+真钱游戏
+收养孩子
+供应假幣
+手机改号
+ FlexiSpy PRO
+手驽配件
+tnt的制作
+翻转车牌
+政协车证
+论坛群发
+电子监控
+车防盗器
+拐卖婴儿
+拐卖儿童
+买卖婴儿
+重铬酸钠
+迭氮化钠
+马钱子碱
+番木鳖碱
+丙撑亚胺
+巯基乙醇
+苯基硫醇
+环己烯酮
+氨基吡啶
+乙酸苯汞
+海葱糖甙
+放线菌素
+硝酸高汞
+碘化高汞
+溴化高汞
+四碳酰镍
+维也纳绿
+维埃克斯
+路易氏剂
+亚当氏气
+二氧化氮
+过氧化氮
+三氮化钠
+胚芽儿碱
+计末林碱
+甲基联胺
+无水联胺
+硫代苯酚
+半方形酸
+嘧啶苯芥
+二甲二硫
+二甲弗林
+氧化乐果
+乙基乐果
+马拉赛昂
+己酮肟威
+特氨叉威
+卡巴呋喃
+间异丙威
+甲氨叉威
+丁醛肟威
+放线菌酮
+地乐消酚
+硫酸甲酯
+谷仁乐生
+化合物118
+化合物497
+普罗米特
+杀鼠嘧啶
+红海葱甙
+矢车菊甙
+米尔法兰
+自力霉素
+安非他明
+安非它命
+电表反转
+电表校验
+海关拍卖
+考试设备
+海关查获
+教研大纲
+可控牌靴
+猜宝仪器
+速度预警
+雷达警示
+雷达测速
+雷达探测
+高速预警
+牌照喷雾
+雷达之星
+活性碳粉
+克西里尔
+奥克托金
+代那买特
+震源药柱
+基特拉辛
+手槍钻石
+帖子删除
+电影下载
+特殊服务
+公关删除
+花都逍遥
+欧美女同
+有偿捐赠
+羟间唑啉
+收费清理
+粉尘女子
+兼职服务
+玩女大王
+考生名单
+遥控复制
+遥控干扰
+娱乐论坛
+毕业学历
+防拍克星
+测速雷达
+迅雷下载
+萘基硫脲
+逼羊为狼
+遍地桃花
+超级公子
+地狱召唤
+恶女戏夫
+魅夜帝国
+嬉游花丛
+萧府之败
+欲医天下
+至尊狼威
+34H基甲基
+赤道卫星
+异性社区
+阿兰得龙
+高仿纸币
+甲基苯胺
+甲基苯丙
+甲卡西酮
+考生考号
+森林之豹
+森林之虎
+车牌执照
+东京丸井
+车牌翻转
+防身器材
+防卫棍刀
+负面新闻
+负面信息
+个性号码
+无线通话
+定时引爆
+视讯妹妹
+门禁复制
+莫洛托夫
+男人最爱
+美眉娱乐
+脱氧麻黄
+人人有色
+号码软件
+显号软件
+沙漠之鹰
+恐怖份子
+森林之狐
+森林之狼
+森林之鹰
+负面帖子
+炒作公司
+变号软件
+手机偷听
+美女后宫
+北朝鲜冰
+捷克左轮
+赵氏猎鹰
+红烧兔子
+娱乐会所
+网络负面
+特种部队
+网络危机
+阿兰德龙
+乌斯普龙
+喋血鸳鸯
+东北大炕
+东风传奇
+东瀛日记
+都市藏娇
+都市春潮
+都市黄昏
+都市奇兵
+都市擒芳
+多情皇帝
+多情医仙
+恶女总裁
+放纵深圳
+飞凤灵蛇
+风月草民
+风月大帝
+风姿物语
+封魔印章
+疯狂求欢
+福艳天下
+妇科男医
+高州水库
+隔岸芳烬
+隔墙有眼
+沟女物语
+古镛文集
+官人我要
+鬼不走门
+寒潭鹤影
+七日欢恋
+河图作品
+黑道狂徒
+黑道女友
+黑色帝国
+黑色柔情
+红楼遗秘
+红旗飘飘
+红杏暗香
+红映残阳
+后宫学院
+花心天子
+荒莽神话
+荒唐传说
+皇朝秘史
+魂一指令
+混混教师
+活色逍遥
+火爆男妃
+火浣神衣
+机甲武圣
+极度香艳
+极品二少
+极品复仇
+极品公子
+极品家教
+极品男人
+极品农民
+极品色妃
+极品少将
+极品太女
+极品巫男
+极品邪龙
+极品邪神
+驾驶生涯
+剑荡天下
+剑起云深
+剑指天下
+江山美色
+娇娇师娘
+娇艳人生
+骄龙荡魔
+狡猾家丁
+劫花传奇
+金粉世家
+尽揽婀娜
+禁忌之旅
+惊尘溅血
+惊伦六日
+囧囧仙妻
+九流术士
+九世魔情
+绝代霸主
+绝代商骄
+绝色大唐
+绝色家族
+绝世狂龙
+空姐羔羊
+傀儡皇帝
+狼后传奇
+狼之天下
+浪迹神雕
+浪迹香都
+浪子彦青
+炼狱天使
+烈女斗夫
+临时俘虏
+伶人往事
+另类穿越
+龙魔传说
+龙与女仆
+龙语兽修
+乱云飞渡
+满世妖娆
+没尸找尸
+写真图片
+美妻地狱
+美色无边
+梦幻倚天
+梦回天阙
+梦想人生
+人妖杂交
+迷欲侠女
+妙手神医
+妙手神织
+明日帝国
+摹拟爱情
+魔皇至尊
+魔甲销魂
+魔美双修
+魔神艳传
+魔神紫星
+魔兽领主
+莫爱邪君
+逆天邪传
+狞王武霸
+奴隶帝国
+怒之典章
+女人是海
+诺贝尔奖
+痞子偶像
+瓶安如意
+扑倒宰相
+妻定神闲
+妻妾成群
+弃妃倾城
+千年玄冰
+日本美女
+巧取豪夺
+俏惹郎心
+倾城护爱
+情海狂龙
+情天大帝
+情缘欲海
+秋韵夜语
+囚禁新娘
+群魔丽影
+人性禁岛
+人在深圳
+日出之王
+溶解权力
+如果的事
+如影逐形
+三宝局长
+散花天女
+色酷全书
+色香射雕
+森下悠里
+山村情事
+少龙传奇
+少龙外传
+深纯弄潮
+圣魔邪灵
+圣女传奇
+十年孤剑
+仕途官道
+守护美女
+书剑别传
+双面艳姬
+桃之夭夭
+天地之间
+天降神龙
+天降神妻
+天使风狂
+天下太平
+田野花香
+听话娃娃
+微热少年
+我的天下
+我和处长
+无德皇后
+无良公子
+无限征服
+华夏神龙
+妩媚情殇
+武林花劫
+武林花主
+武林状元
+误坠花丛
+西苑魅影
+仙侠魔踪
+乡春满艳
+乡村神医
+乡野情梦
+小村神医
+小夫少妻
+小妾丫鬟
+小青系列
+小镇飞花
+邪气凛然
+邪神传说
+携美人生
+谢雕易遍
+性医春歌
+胸大有罪
+修罗都市
+玄女心经
+押寨夫人
+艳妃惑夫
+艳妃偷夫
+艳色都市
+艳香迷醉
+夜诱娘子
+一城风絮
+一丝不挂
+一指擎天
+一柱擎天
+医世无忧
+以后时代
+银剑天使
+鹰翔长空
+永堕黑暗
+游龙嬉春
+游龙戏凤
+诱欲校园
+雨过桃花
+玉麟传奇
+玉体横陈
+欲海狂龙
+欲海梦蝶
+欲海神龙
+欲火难眠
+欲火难耐
+女人的洞
+越境鬼医
+云雨欲魔
+云踪魅影
+知乐全集
+执子之手
+至尊夺研
+至尊邪帝
+中国特工
+中国影帝
+重建帝国
+逐艳人生
+紫屋魔恋
+纵欲返古
+醉回七九
+醉卧红尘
+天线宝宝
+学历认证
+制作脏弹
+出租网管
+财税代理
+连锁销售
+上门服务
+学生服务
+根敦确吉
+金大物流
+神雕外传
+浪妇阿姨
+色文小说
+商务租车
+少女发春
+神韵千年
+文心藏阁
+航空母箭
+人民币假
+转让机打
+变性晓薇
+逍遥皇帝
+洪荒魔尊
+套弄花心
+桃源洞口
+美女真人
+农夫导航
+香港开奖
+股民电话
+股民名单
+股民资源
+股民资料
+股民信息
+成都校服
+三国称霸
+帅哥靓妹
+个人身份
+录像火机
+全系列阀
+自办频道
+兼职小姐
+我要官人
+獵槍銷售
+联兴棋牌
+366娱乐城
+日月图库
+淘金盈网
+永利高网
+东方心经
+先锋百乐
+金盛国际
+涂山国际
+名门国际
+名人国际
+扑鱼达人
+阳光地带
+修改证书
+邪性总裁
+狼欲国度
+村色撩人
+狼客娱乐
+受辱禁处
+爱城论坛
+色色论坛
+只爱色色
+无双国土
+强制深喉
+我爱色吧
+色哥导航
+耻悦人妻
+自制地雷
+金彩国际
+女神国际
+极品人生
+三优娱乐
+金赞娱乐
+删百度帖
+售香港ghb
+第四色网
+极品人妻
+鸿利国际
+汔狗销售
+警备车证
+楼凤大全
+猎刀订购
+订购猎刀
+猎刀直销
+代人收债
+腰刀转让
+销售迷烟
+爆竹供应
+直销缅果
+缅果供应
+缅果购买
+缅果提供
+提供猎刀
+警衔提供
+提供警帽
+提供fm2粉
+销售汽gou
+腰刀销售
+销售色站
+色站销售
+直销爆竹
+缅果销售
+销售jia币
+jia币销售
+销售情蛊
+销售fm2粉
+短刀销售
+买卖猎刀
+冰钻供应
+订购迷烟
+迷烟专卖
+提供迷烟
+全讯网777
+工口小说
+工口图片
+工口动画
+工口漫画
+工口动漫
+工口游戏
+草榴地址
+月沉吟
+美人劫
+美人殇
+销魂殿
+断珠蕊
+姑妄言
+欢喜缘
+后庭花
+画眉缘
+花放春
+换夫妻
+空空幻
+露春红
+两肉缘
+林兰香
+寐春卷
+闹花丛
+情海缘
+柳花传
+桃花庵
+桃花影
+舞春云
+巫梦缘
+杏花天
+绣屏缘
+一片情
+鱼水谐
+鸳鸯阵
+怡情阵
+枕瑶钗
+戏蛾记
+醉春风
+灯月缘
+捣玉台
+春又春
+碧玉楼
+弁而钗
+伴花眠
+痴娇丽
+酬鸾凤
+职业删贴
+梦先觉
+若相惜
+惜情记
+玲珑配
+金钱帮
+白衣传
+紫极舞
+舞倾城
+混沌决
+供应ghb水
+ghb水销售
+销售缅果
+销售锇酸
+供应铀毒
+真钱轮盘
+短刀直销
+樱花泪
+浮缘枝
+槐树里
+美人情
+怯春寒
+殷若溪
+小渔村
+短刀专卖
+草榴影院
+腰刀供应
+警号销售
+专卖ghb水
+直销ghb水
+订购ghb水
+就去品色
+直销军衔
+供应锇酸
+luo聊表演
+臊冰订购
+供应特普
+供应硼烷
+台秃专卖
+转让腰刀
+提供腰刀
+腰刀提供
+订购腰刀
+腰刀订购
+腰刀买卖
+买卖腰刀
+猎刀销售
+香香社区
+浪妹社区
+弯刀买卖
+买卖弯刀
+弯刀提供
+锇酸供应
+投注娱乐
+百博亚洲
+优博娱乐
+色站大全
+艳照下载
+Xiao77论坛
+直销臊冰
+直销腰刀
+直销警灯
+直销警号
+直销警帽
+猎刀供应
+转让猎刀
+猎刀转让
+直销警衔
+烟花直销
+爆竹直销
+烟花专卖
+狗管专卖
+销售狗管
+直销狗管
+转让狗管
+庐江艳照
+黄片下载
+供应fm2粉
+素人电影
+人妻系列
+素人合集
+雇凶打人
+雇凶复仇
+藏刀供应
+藏刀转让
+提供藏刀
+藏刀销售
+销售猎刀
+销售藏刀
+销售腰刀
+销售靴刀
+专卖臊冰
+供应臊冰
+提供臊冰
+色聊服务
+在线棋牌
+直刀专卖
+直销猎刀
+冰妹服务
+买卖臊冰
+欧美色站
+销售台秃
+黄网图片
+日韩色站
+烟花供应
+直销烟花
+供应警帽
+供应警号
+太恩制作
+下载黄片
+黑彩代理
+楼凤陪睡
+替人收债
+传授赌技
+色网地址
+色站网址
+欧洲色站
+调妻派对
+找人讨债
+警衔供应
+专卖警衔
+买卖警衔
+购买警衔
+性吧有你
+气GOU专卖
+销售木仓
+供应木仓
+木仓专卖
+销售警衔
+汽gou销售
+色色影视
+警号专卖
+专卖警号
+在线祼聊
+销售警灯
+代人寻仇
+警灯销售
+新全讯网
+92 式销售
+64 式销售
+帮人泄愤
+色播资源
+祼聊表演
+提供土冰
+缅人绍雄
+卖娃广告
+物流面单
+藏民档案
+逼爽导航
+提供物冰
+亚洲狼图
+寻仇了事
+楼凤论坛
+购买唐刀
+舔到你射
+中国楼凤
+复仇咨询
+复仇顾问
+速食全套
+白嫩妹妹
+进口美秃
+在线黄片
+四房看看
+兼职陪睡
+洽谈复仇
+自制左轮
+售人民币
+车主数据
+土冰合成
+五码吹潮
+复仇接洽
+三棱尖刀
+三利达网
+仿真头套
+赌彩平台
+代理复仇
+老板数据
+老人名录
+手机名录
+替人泄愤
+销售长刀
+销售CO2狗
+色片下载
+真人祼聊
+收费祼聊
+给我豹豹
+抢手总裁
+商界狂龙
+蔷薇妖娆
+七虐弃妃
+花花游龙
+公车被干
+香醉迷艳
+腰刀专卖
+黄片种子
+供应猎刀
+供应腰刀
+黄片网站
+供应山埃
+汽gou专卖
+色虫影院
+色虎影院
+同城陪睡
+色色快播
+亚洲色站
+皇冠平台
+逍遥社区
+色色基地
+咪咪基地
+汽车套开
+包爽爆射
+美尻套图
+各地凤楼
+厕所盗摄
+幼童买卖
+美女中出
+色猫影院
+猎刀买卖
+色吧社区
+投注取现
+真钱下注
+色吧亚洲
+小姐威客
+马古配方
+气gou专卖
+专卖猎刀
+气Gun专卖
+哇哇影院
+办假学历
+爆竹专卖
+草榴社區
+销售烟花
+spyera软件
+包爽包射
+真人色片
+足球下注
+手槍买卖
+幼幼电影
+汽槍买卖
+在线下注
+电购数据
+销售醱票
+办职称证
+壮阳保健
+提供小姐
+幼幼极品
+深喉服务
+漂漂美眉
+喷雾迷葯
+從後插入
+精品电影
+欧美电影
+另类电影
+明星情爱
+欧美情爱
+欧美色片
+亚洲色片
+人妻中出
+幼幼同志
+多人杂交
+狼友论坛
+线上投注
+乐酷搏彩
+援助交际
+舌尖漫游
+九九娱乐
+碧月吟阁
+皇家花园
+绝色皇城
+靓女主播
+尽情纵欲
+咪咪娱乐
+制毒工艺
+矢泽种子
+现金棋牌
+玛雅论坛
+老板手机
+特殊名录
+车主名录
+夜店小姐
+真人轮盘
+色站导航
+聚色导航
+美女貼吧
+替人跑事
+帮人了难
+气槍专卖
+办军官证
+製作炸藥
+步槍销售
+皇冠足球
+古柯买卖
+买凶杀人
+疯插港姐
+婷婷基地
+四房播播
+学历办理
+美女祼聊
+亚洲原创
+欧美原创
+办理凭文
+千门六决
+网络投注
+皇冠开户
+电话改号
+任意改号
+人妖妹妹
+高管名录
+猎刀专卖
+美尻中出
+手槍销售
+步槍供應
+腎脏中介
+供应步槍
+供应獵槍
+供应手槍
+銷售步槍
+銷售手槍
+銷售獵狗
+銷售獵槍
+提供獵槍
+提供獵狗
+提供手槍
+提供步槍
+供應步槍
+供應獵狗
+供應獵槍
+供應手槍
+人兽杂交
+销售手槍
+销售獵狗
+销售獵槍
+腎源供应
+供应腎源
+腎臟中介
+腎臟供应
+找人敲诈
+找人毀容
+找人勒索
+找人绑架
+替人讨債
+专业復仇
+找人消災
+真槍销售
+专业毀容
+专业勒索
+彩信改号
+销售LQB362
+供应LQB362
+提供LQB362
+LQB362到货
+LQB362出货
+LQB362订购
+LQB362电话
+幫人殺人
+幫人砍人
+替人綁架
+幫人綁架
+替人毀容
+幫人毀容
+替人敲詐
+幫人勒索
+幫人敲詐
+幫人討債
+復仇了仇
+代人報仇
+毒的制作
+找人復仇
+替人復仇
+找人報仇
+购买槍支
+交换人妻
+替人讨债
+帮人消灾
+帮人杀人
+替人复仇
+雇人复仇
+替人追债
+替人出气
+帮人出气
+职业复仇
+专业复仇
+帮人讨债
+雇人打架
+帮人勒索
+找人复仇
+替人打架
+代人了仇
+代人报复
+代人出气
+帮人打架
+帮人了仇
+复仇了仇
+帮人报复
+替人报复
+帮人追债
+帮人敲诈
+替人杀人
+帮人清债
+替人清债
+替人消灾
+替人敲诈
+替人勒索
+帮人毁容
+替人毁容
+帮人绑架
+替人绑架
+帮人砍人
+替人砍人
+替人消災
+幫人消災
+代人報復
+代人出氣
+幫人打架
+職業復仇
+專業復仇
+職業報仇
+專業報仇
+雇人報仇
+雇人復仇
+替人討債
+替人追債
+幫人追債
+幫人出氣
+替人報仇
+替人報復
+幫人報復
+幫人了仇
+替人出氣
+替人清債
+替人殺人
+幫人清債
+冰磚配方
+冰磚出货
+冰磚订购
+冰钻订购
+冰钻出货
+手抢专卖
+手抢到货
+卖high粉QQ
+冰钻到货
+冰磚到货
+毒的配方
+猎槍销售
+办警官证
+气槍买卖
+气槍购买
+槍支买卖
+鉆石销售
+冰磚销售
+冰鉆销售
+替人了仇
+供应冰钻
+十八和谐
+一边一国
+突厥斯坦
+边界新约
+维基百科
+我的奋斗
+新xin唐tang
+ 360mother.com
+ 5qshop.com.cn
+ ailuoliao.com
+ dgchun-lan.cn
+ feifeijob.com
+ hainanidc.com
+ job-yahoo.com
+ lekachina.com
+ newegg.com.cn
+ officestation
+ wdyj88.com.cn
+ xsjdz2010.com
+为a股自尽
+1215出师表
+654k全金属
+访问youtube
+ hotspotshield
+ rentiandiling
+色即是空3
+ 0085266344408
+ wwwzydk444com
+ jishu22126com
+ wwwsz56888com
+ wwwhuayidkwcn
+ chengaiai4490
+ wuweixin68163
+ youxin2727com
+ bsto178xtd365
+ szjyjg0871163
+ ailiaotiancom
+ ok1997okyahoo
+ 591luoliaocom
+ tsbz08hotmail
+ health21cncom
+ wwwkchaomacom
+ dingxiangname
+ sanyang668163
+ gzqietingqicn
+ hybz08hotmail
+ ygzj258369163
+ szlin16890126
+ jheduzx126com
+ laohujibbscom
+ 400suncitycom
+ dai22289gmail
+ xunkong123com
+ tengshivodcom
+ botongkejicom
+ mmfuwusvvkcom
+ funpnet759277
+ 99lianmengnet
+ 52luoliaowcom
+ feiyue8998com
+ qazwsx654321p
+ essayonlinecn
+ pandra2003163
+ szjsedu163com
+ wwwxyxl5168cn
+ zptokbc060com
+ 51xiaguangcom
+ nbzhutancomcn
+ maopianwangcn
+ tianyakefu126
+ huang92896163
+ chengkao360cn
+ kjxxwss163com
+ yuandongzj163
+ zzddzxinmecom
+ laohupojiecom
+ 82rsunitcycom
+ laohupj580com
+dfii出海战
+惊现5女尸
+4次拨打110
+预言2012年
+頰言2012年
+天和佳祥b
+ 0577-26889666
+ 0755-21013177
+2011年英语
+ jiangdongriji
+ ninna.justice
+ www.cipfg.org
+警用钱包
+隐私1图片
+隱私1圖片
+2008年灾年
+全国揭晓
+共和国2049
+开平,受辱
+考试,答案
+美女,写真
+微型,监控
+追踪,定位
+ 134 24o8 1398
+ 135-4406-6974
+ 137.2555-7876
+ 137.2878-1212
+ 159-1095-5681
+ boxue-edu.com
+ decai-edu.com
+ www.beely.com
+免费刷Q币
+泰国Vervata
+手槍 钻石
+ BBINFOSTATION
+3氨基丙烯
+4硝基甲烷
+4二硝基苯
+镰刀菌酮X
+丝裂霉素C
+二仲丁基4
+6亚硫酸酯
+2硝基甲苯
+3硝基甲苯
+4硝基苯胺
+4氢吡喃酮
+2异丙氨基
+2甲基吡啶
+硫酸2甲酯
+1乙酰硫脲
+硫代乙2醇
+甲基化2硫
+2硝叔丁酚
+2硝另丁酚
+美女1笑散
+找1夜晴网
+1元人民币
+硫酸3乙锡
+汞制剂2号
+混世邪神2
+重生寡1991
+迎z秋庆祝
+3d木马78910
+18MM电影网
+e乐博官网
+假结婚证Q
+h游戏下载
+提供shen源
+有声h小说
+提供fing霸
+high药销售
+专卖high药
+high药专卖
+供应high药
+提供high药
+h动漫图片
+h动漫快播
+HIGH药直销
+王民生群p
+蒋大彬群p
+high药直销
+PETN的配方
+三夫妻ed2k
+petn的合成
+提供high粉
+54自制槍QQ
+Fing霸提供
+Fing霸专卖
+Fing霸销售
+专卖Fing霸
+提供Fing霸
+QVOD色播网
+色狗 电影
+e夜情电话
+e夜情论坛
+e夜情交友
+qq卖77猎槍
+high粉配方
+high粉订购
+high粉出货
+high粉到货
+high粉销售
+供应high粉
+根敦.确吉
+18岁的雪儿
+60天的攻防
+ 51xiaguang.com
+ essayonline.cn
+ gongzqq.com.cn
+ jianzhan88.com
+ outlets365.com
+ zhuangzhigm.cn
+京et也很牛
+47辆车相撞
+软件ui丑陋
+全球80人口
+64小时绝食
+悠游字在13
+ cuttingthrough
+ arrivalinlhasa
+ echoesofpotala
+ chengrenshipin
+少女18岁色
+ wwwszjyjgcomcn
+ wwwdajiyiqicom
+ wwwncs168comcn
+13797020693室
+ 7770blogbuscom
+ tao20032008163
+ luoliaozhancom
+ www2008gwydacn
+ woyao2000gmail
+ greatenglishcn
+ allnettoolscom
+ huaidizhiyahoo
+ lyou1234520163
+ cfzj197hotmail
+ driversvisacom
+ 823629831qzone
+ huatai88888com
+ shuguang888com
+ chaoliukejicom
+ yangfangzhou99
+ isleadingchina
+ wwwgdgz13800cn
+ wwwhengmei77cn
+ jiachao888nlae
+ kuailetianyacn
+ shch988blog163
+ 15201229670com
+ jiachao666zw78
+ edu137875652cn
+ dingshengzkcom
+ chinacard18com
+彭州80万吨
+17权力布局
+c4制作方法
+ nicolasdemarco
+ The3FeelOnline
+610办公室
+专-业承-接
+QQ充值中心
+充值QQ号码
+盲女72小時
+ bianyaqi.sh.cn
+ bjscdesign.com
+ book1.5d6d.com
+ diy.myrice.com
+ dxy.cniiyi.com
+ firefoxcn.info
+ hljzxq19690724
+ hongaosoft.com
+ hosting.czm.cn
+ iactive.com.cn
+ infoark.com.cn
+ movequickly.cn
+ njgrandeur.com
+ ovefast.com.cn
+ pro-wing.co.jp
+ qichezulin.org
+ registerjz.com
+ rosanna.com.cn
+ silvery.com.tw
+ telenglish.com
+ tianyunsun.com
+ xiaoshanwu.com
+ xinguanghui.cn
+ xizang2008.com
+ yigaosheji.com
+ yongshengxx.cn
+70天大事记
+ 26③850148⑧
+ my.tv.sohu.com
+ open-jyedu.com
+ Yinlong Island
+SM后庭器具
+地税髮票QQ
+FlexiSpy下载
+己烯1炔3醇
+2氧化丁2烯
+2硫化2甲基
+1-乙酰硫脲
+3-氨基丙烯
+id卡拷贝机
+3硝基2甲苯
+6硝基2苯胺
+2硝化乙2醇
+2环己烯1酮
+ DGSTATIONMUANT
+ forestofbreast
+我的wg岁月
+重生之80后
+供应k2香料
+供应k2精灵
+BB体育投注
+办假军牌QQ
+无色毒药QQ
+无味毒药QQ
+色龙bt发布
+女王招奴qq
+av天堂影院
+av欧美影院
+xb综合影院
+泷泽萝拉bt
+快播色片av
+10bet娱乐城
+收养男童qq
+负面消息qq
+帮忙复仇QQ
+订购国秃qq
+qq代人了事
+qq替人了事
+qq专卖警帽
+销售警棒qq
+tt现金娱乐
+qq找人报复
+qq买卖警帽
+qq买卖警号
+qq销售ghb水
+qq提供ghb水
+高清av下载
+qq提供情蛊
+情蛊提供qq
+情蛊购买qq
+缅果订购qq
+缅果直销qq
+购买缅果qq
+订购缅果qq
+冰钻提供qq
+臊冰提供qq
+提供ghb水qq
+国产64销售
+销售警号qq
+销售短刀qq
+销售ghb水qq
+爆竹销售qq
+销售爆竹qq
+迷烟销售qq
+qq销售冰油
+qq销售火铳
+供应冰油qq
+订购冰油qq
+直销冰油qq
+销售冰油qq
+购买冰油qq
+提供冰油qq
+警衔销售qq
+了仇了事qq
+复仇办事qq
+销售美秃qq
+提供缅果qq
+帮人复仇qq
+gv种子下载
+欧美gv种子
+供应缅果qq
+销售迷粉qq
+订购迷粉qq
+鸡婆服务qq
+老师16岁
+90后黑丝网
+人妖av下载
+欧美av种子
+av影片种子
+快播av下载
+买卖缅果qq
+直销happy水
+订购happy水
+av影片下载
+谷子供应qq
+臊冰供应qq
+锡锋供应qq
+专卖腰刀qq
+欧美av下载
+下载av电影
+素人av视讯
+素人av影视
+亚洲av视讯
+日韩av视讯
+欧美av视讯
+亚洲av下载
+美女av图片
+快播av色站
+日韩av下载
+供应弯刀qq
+转让弯刀qq
+专业制证qq
+QQ真人luo聊
+luo聊美女qq
+庐江6P种子
+王民生3P照
+QQ帮人复仇
+QQ招人复仇
+宾馆6P艳照
+有偿讨债qq
+业主资料QQ
+车主名单qq
+楼凤小姐QQ
+藏刀提供qq
+藏刀专卖QQ
+qq代人复仇
+qq帮人复仇
+av动漫在线
+动漫av下载
+av动漫下载
+提供冰钻QQ
+云南情蛊QQ
+专业删贴qq
+购买学历QQ
+av在线观看
+删除帖子QQ
+办高仿证QQ
+兼职小妹qq
+兼职白领qq
+找人毁容QQ
+顺丰面单QQ
+提供happy水
+了仇了事QQ
+警号订购QQ
+丝足上门QQ
+丝足保健QQ
+专业删贴QQ
+假六级证qq
+假四级证qq
+中考答案QQ
+供应Happy水
+替人寻仇QQ
+硝甲西泮QQ
+Happy水提供
+Happy水专卖
+Happy水销售
+专卖Happy水
+提供Happy水
+销售Happy水
+电购面单QQ
+保险数据QQ
+代人复仇qq
+欧美bt种子
+天涯删贴qq
+车主资料QQ
+帮人灭口QQ
+色av色影院
+办理军牌QQ
+办行驶证QQ
+上门陪睡QQ
+帮人复仇QQ
+代人复仇QQ
+97色色导航
+警用服装QQ
+草榴社区QQ
+高纯度99冰
+制造意外QQ
+假警官证QQ
+冷钢专卖QQ
+快播av电影
+3p美女图片
+最新素人av
+56軍刺供应
+假人民幣QQ
+供应77猎槍
+銷售77猎槍
+供應77猎槍
+销售77猎槍
+仿真面皮QQ
+溫切斯特qq
+56軍刺专卖
+81軍刺专卖
+QQ销售冰磚
+QQ订购冰磚
+卖摇头糖QQ
+卖小冰磚QQ
+卖黃體酮QQ
+卖麥角酸QQ
+卖冰鉆石QQ
+卖搖頭糖QQ
+卖白牙簽QQ
+卖黃牙簽QQ
+卖麻黃素QQ
+卖大冰磚QQ
+卖神仙糖QQ
+卖钻石冰QQ
+卖鉆石冰QQ
+QQ供应冰磚
+QQ供应钻石
+QQ销售冰钻
+松花江污染
+公务员工资
+一级黄电视
+亚洲美女总
+中文搜性网
+人妻兽虐曲
+性信息交友
+少女俱乐部
+武林情皇传
+发票代开
+田明建时间
+太王死神记
+清明节到了
+迫近水危机
+老衲痛经啊
+小平讲英语
+陈娘宇下台
+千岛湖之旅
+徐和柴学友
+爱神之传奇
+梦中的女孩
+往事追忆录
+睡着的武神
+济南建设路
+总统的讲话
+痛批政法委
+山西黑砖窑
+敢坐飞机吗
+最牛钉子户
+唐人电视台
+江山美人志
+公务员调资
+双鞋的故事
+先烈的电话
+ gupiaojijing.cn
+告别蒸笼车
+疯狂水果机
+香港六閤彩
+老虎计刷分
+女性自尉器
+小姐全攻略
+宿舍拍艳照
+董存瑞来电
+曾庆一样红
+大学不要钱
+统一叫小泉
+骗到国务院
+泡茶抱小密
+票贩试比高
+当今大谎言
+部长李莲英
+八耻编成经
+宋朝俯卧撑
+易地为官称
+当官靠后台
+马克思来电
+小姐欲脱裤
+难捉摸的官
+两腿之间问
+两面都有胶
+董存瑞他妈
+和小平散步
+恩來只喝酒
+对警车收费
+红太祖本纪
+政策来捣鬼
+党的喉舌死
+小姐搞三讲
+翌年缩至余
+小平的预言
+谁闻民工苦
+有理莫惹官
+油价月月涨
+傥不等于国
+领导年年换
+呼吸税之歌
+股票造的孽
+骗到党中央
+全球征屁税
+他妈是国税
+玉姣嗔面责
+钟央大手掌
+回归大话版
+邓爷爷访美
+开发商之歌
+恩来马上做
+加班无偿化
+教师奴隶化
+上面老换人
+流行大谎言
+喂养叫填权
+只整老百姓
+年太不正常
+共震迎奥运
+暮蒼山蘭舟
+福娃在哭泣
+零八奥运艰
+抗震最不强
+养一窝专家
+泄密开幕式
+火炬传递版
+当官者日志
+十大怪现状
+歪批闭幕式
+一江并两河
+中国怪现象
+油价还得涨
+小平不耐烦
+美女李万姬
+毛邓小故事
+党在玩社会
+人民在流泪
+国家已沉睡
+官员代表答
+干部的口诀
+小姐灌的浆
+率领穷光蛋
+做官样样好
+布什逗小胡
+爱党胜过妈
+党就是咱妈
+恋栈恋权心
+谭豁子列传
+望纽约内外
+四清四不清
+天上導彈亂
+專榠眔聽器
+语音传输器
+美国迷你型
+手机眔听卡
+正宗ghb原液
+售安乐死药
+烟雾弹制作
+闪光弹制作
+地雷的制作
+蚕蛊的制作
+普米族制蛊
+制蛊的方法
+ c6h3no22cl2naoh
+弹制作方法
+金屬彷真槍
+玞槍雷明頳
+索多玛120天
+国足欢迎你
+男足几多愁
+让三鹿给废
+五粮液横流
+再论猪流感
+北京搶口罩
+中国疫情图
+明星之情陷
+工信部缓装
+加菲猫过滤
+街头门事件
+自动挂代理
+猎杀大熊猫
+洗脚妹苹果
+极品浏览器
+三鹿结牛黄
+奶中加入尿
+喝毒奶长大
+东市退奶粉
+鲜非毒之奶
+一鹿顶三鹿
+把奶问青天
+喝牛奶结石
+三鹿欢迎你
+洗衣粉油条
+掀开黑心绵
+减排好奶粉
+三鹿灭鼠药
+表演者三鹿
+奥运油和米
+平度毒面粉
+催长大闸蟹
+母亲王静梅
+喝奶也结石
+孱头式勇猛
+北京话骂人
+滑石粉致癌
+毒食品汇总
+毛发水酱油
+毒美食排行
+三鹿与国足
+问题鸡来源
+柑橘里有蛆
+国产酒致癌
+轶可像刘翔
+过年吃人肉
+孕妇被群殴
+proxifier代理
+上网过滤门
+新疆的畜生
+支援果敢族
+针状物刺伤
+針狀物刺傷
+中国被瓜分
+股民第一歌
+股市欢迎你
+牛市转回来
+杨白劳出来
+股民泪沾裳
+满仓中石油
+熊市无人问
+抄股市大底
+股市怎么了
+牛市中亏损
+股民砸股票
+股市三熊组
+跌停无极限
+接任证监会
+潘长江出来
+平安惹的祸
+狗屁证监会
+股民受损失
+问中国股市
+散户套半年
+股票顺口溜
+笑新老散户
+向股民抽血
+解套的日子
+股民陈永平
+石油把大盘
+牛熊十余秋
+股市顺口溜
+吾工行贤弟
+竞价中石油
+四大哑巴亏
+天天哭亏损
+股民在哀号
+套牢全中国
+股市告别书
+股评在撤谎
+股市新民谣
+证监会会歌
+股民已失眠
+清海無上師
+清海无上师
+真心的报讯
+李哄志邪说
+噶玛巴千诺
+木兰裆裤湿
+性欲极强女
+雪白的肥臀
+射的她满脸
+肉色连裤袜
+从后面被干
+遇日本巨棒
+勾著肛閠壁
+龙战士传说
+舞铃笙三女
+和廖化打赌
+大明奇情录
+三少宋智尧
+西游记探秘
+妻子的小洞
+肉体性追缉
+服务器租用
+新学历证书
+龙王采集器
+汽车电子磅
+快速专业办
+手机萣莅器
+学历证书班
+ ccjy2002hotmail
+ kuailetianya8cn
+ lixiangjy668com
+一手质保答
+ wangzhuan518com
+威特尔电子
+ wwwxinda2009com
+ 123asd11qq22com
+ rmbbeiou51vqpcn
+所售无军号
+可过后付款
+ bjsj4any2000com
+ shanghai6868163
+ 91regcomhtm8152
+ wwwshenhui150cn
+ 460100071088445
+ ttdzj168hotmail
+ 5xinghonghuicom
+ gdgz13800163com
+ www86suncitycom
+办理免入学
+快速领取科
+ wangtongsifucom
+考前零收费
+试过后付款
+学历譪辦理
+jth简称涛儿
+让领导先走
+强征建官员
+豪华别墅群
+政府太无耻
+有警车做伥
+死区是党权
+犯人胡文海
+中办警卫局
+总参警卫局
+中央警卫团
+吴官海诗词
+嫌疑人突死
+日本你听着
+旱日鱼肚白
+红色御林军
+痴汉是犯罪
+周小玲尸油
+征收呼吸税
+小姐代表答
+释放刘西峰
+胡旭曦冤狱
+港人士评邓
+哨兵遭歹徒
+豪华办公楼
+原名吴玉阳
+陈赓之三子
+败类马洪亮
+宝马女局长
+再胡搞几年
+李意珍女儿
+国庆夜独语
+村民林水仙
+邓贵大烈士
+批准邓贵大
+周碧清子女
+父亲刘仕华
+作者萨达姆
+韩伯平回忆
+质问曹征平
+永隆大酒店
+女儿温如春
+张培莉女士
+玩具厂群殴
+厂区内斗殴
+罢车不加油
+相助匿曰党
+张乃明等人
+旭日玩具厂
+油价都调了
+世界风云录
+观音警世诗
+巨贪刘兆久
+郝金安冤案
+司法造冤案
+访民程英才
+血是在广场
+中国怎么了
+我想问总理
+网上问总理
+干部怕退休
+工资有希望
+真打真准备
+黑匣子录音
+巨毒化工厂
+肮脏的台北
+800斤大粪坑
+不招镇坪工
+群丑闹中华
+伍尔维次法
+痛斥保护伞
+包围镇政府
+木有甲板费
+江家和三代
+烧法国国旗
+梅葆玖呼吁
+火炬手被拘
+夜晚姘妇家
+李四光预测
+无知的专家
+麦当劳被砸
+博客门事件
+孙悟空入党
+青蛙们献血
+有地蹦之祸
+局长吴忠凯
+杨佳被关押
+是草的责任
+考试有黑幕
+预测到英九
+杨佳太息曰
+局处级别墅
+犯法太平常
+给领导喂奶
+老百姓遭罪
+机关出上联
+数百人围殴
+一人杀六警
+取悦王维工
+控制人口奖
+购奶粉以养
+鄱阳报警者
+弹铗恨无肉
+百行教师贱
+周迅的女儿
+李蕊蕊被强
+局长张为才
+四次拨打110
+阅兵提前看
+瞎认定非法
+威哉我汉军
+远华案黑幕
+阳朔一尺水
+关证人禁闭
+官员因涉黑
+踢到中国脸
+小日本疯了
+日本的命根
+完全照搬cnn
+政府救楼市
+翻窗上下班
+最牛检察长
+李培英贪贿
+医院不差钱
+大栅栏持刀
+也谈范跑跑
+范跑跑之歌
+段义和指示
+杨佳式说法
+老板石建欧
+杀人者杨佳
+耶稣在中国
+杨佳的博客
+陈和受贿案
+伤者刘秀起
+发明阳谋后
+红鱼党害的
+中原海捕鱼
+唐山原政协
+中华被扭曲
+沈婷的所谓
+湘女嫁新疆
+湘女戴庆媛
+宋子文生平
+党是反宇宙
+二哥俞流青
+辱骂周总理
+所长翁钟文
+局长梁继平
+农民曾祥刚
+抬抬女事件
+学生彭启荣
+古寺大丑闻
+血滴食物里
+弃少捕少杀
+迂腐全荡走
+公酒交私友
+唐福珍死亡
+预言了神五
+制止张金星
+赵颖艾未未
+政府为可恶
+川震豆腐渣
+人士谢长发
+李劲松律师
+村民郭永志
+寻找林昭墓
+假学生程熙
+城市最刻薄
+DalaiLama自傳
+《风波记》
+爱国者同盟
+北京劲展鹏
+北京夜生活
+财政部绝密
+癡漢是犯罪
+迟来的救灾
+持不同政见
+川島和津實
+达米宣教会
+打坦克手册
+大田高山茶
+大中国论坛
+大中华论坛
+党内言事潮
+抵押免担保
+第三道路党
+第五代红人
+电信路藏民
+东方红时空
+东南西北论
+反雷達測速
+佛怀煽仇录
+佛展千手法
+服务器托管
+高品质香烟
+公民大联盟
+共和国之怒
+贯通两极法
+国色天香网
+国新办主任
+海盗的悠闲
+号码生成器
+和解的智慧
+红朝谎言录
+红潮谎言录
+红河谷论坛
+洪水的志向
+紅河谷論壇
+胡哥看奥运
+黃色小電影
+会计电算化
+鸡毛信文汇
+疾病业债说
+监狱管理局
+教师资格证
+解体的命运
+精密减速器
+九十三运动
+颗粒包装机
+昆仑女神功
+劳动教养所
+雷達測速器
+历史篡改者
+莲花艺术团
+廉政大论坛
+林昭纪念奖
+陆空军地图
+伦-理-电-影
+伦_理_电_影
+美国维吾尔
+美女野球拳
+美少女麻雀
+夢幻麻將館
+木制工艺品
+皮质类固醇
+青天白日旗
+全范围教会
+热站政论网
+人类罪恶论
+人宇特能功
+日内瓦金融
+入党申请书
+三班仆人派
+上_门_服_务
+上海孤儿院
+身份證生成
+神通加持法
+神州忏悔录
+审查参赛者
+生者和死者
+手机接听器
+谁是新中国
+顺利通过考
+四二五事件
+讨伐中宣部
+天父的儿女
+外交与方略
+为党不为国
+维多利亚包
+維多利亞包
+窝囊的中国
+我在黑暗中
+乌云其木格
+先天健康法
+现代伊兰特
+香港黄大仙
+香港六和采
+小泽玛莉亚
+新观察论坛
+新华通论坛
+新中华战记
+循环轮回论
+雅思成绩单
+亚太正悟网
+盐雾试验箱
+一万个贴子
+医师资格证
+优昙婆罗花
+找政府评理
+拯救紫坪铺
+正邪大决战
+正义党论坛
+脂溢性皮炎
+中国孤儿院
+中南海斗争
+中南海秘闻
+中南海内斗
+中南海内幕
+重庆服装厂
+重庆滤油机
+重庆木门厂
+啄木鸟公司
+啄木鳥公司
+莱仕德事件
+台反文旁虫
+北戴河会议
+中国威胁论
+新闻通气会
+先烈的电电
+现代靓妹仔
+中国性搜网
+震撼你的心
+电表调控器
+最强大阵容
+幸运大玩家
+游戏上分机
+真情大反馈
+办公室守则
+斯皮尔博客
+北京奥运会
+“中国印”
+《花木兰》
+《马前课》
+《梅花诗》
+《推背图》
+《诸世纪》
+哎吔女朋友
+巴西预言家
+变色的花朵
+不文女学堂
+摧花神龙教
+第五代领导
+定制消失笔
+发电俏佳娃
+福娃变乌龟
+羔羊大律师
+高低压三箭
+古方化骨水
+豪情夜生活
+黑暗的社会
+红楼春上春
+哭泣的女人
+苦难的中国
+历史的伤口
+聊斋花弄月
+流感大变种
+潜水股推荐
+人鬼情未了
+人肉叉烧包
+人头豆腐汤
+日本的言论
+杀知识分子
+畲祥林冤案
+社保基金案
+射鸡英雄传
+神秘的死刑
+失忆性行为
+兽性新人类
+死刑犯图片
+唐朝豪放女
+偷食女学生
+偷试隔墙花
+吸我一个吻
+新潮女空姐
+新倾国倾城
+玉女白菊花
+云雨生死恋
+纸包梦惊魂
+致命女人心
+宝在甘肃修
+才知道只生
+俄罗斯轮盘
+国一九五七
+救度众生说
+明镜出版社
+娘两腿之间
+女被人家搞
+汽车走表器
+青海无上师
+群发广告机
+四二六社论
+万法归一功
+卫星高频头
+现在的政府
+血染的风采
+亚硝酸乙酯
+亚硝酰乙氧
+一通健康法
+乙酰替硫脲
+原一九五七
+找政法委副
+震惊一个民
+中国复兴党
+中国共和党
+中国人民党
+中国正义党
+中南海黑幕
+中正纪念歌
+免费爽电影
+桑拿一条龙
+手机密码破
+①千个粉锶
+办假户口本
+辦假户口本
+保真最低价
+富婆俱乐部
+好看的小说
+茂名人才网
+茂名招聘网
+网婚恋网站
+我爱开心网
+新富华机械
+验证后付款
+孕妇装夏装
+找小V姐服WU
+毛囊角化症
+毛周角化症
+《新京报》
+川岛和津实
+信息产业部
+现在的社会
+古月金帛涛
+编成与基地
+防区和任务
+美女全脱图
+越自卫反击
+美女图片网
+生男孩秘方
+香港生孩子
+毛发红糠疹
+结节性痒疹
+性功能障碍
+安睡理疗枕
+颈椎理疗枕
+雀斑分解液
+色素清软膏
+张氏消痤丸
+前胸后背疼
+催泪喷射器
+发帖人招聘
+专业删贴吧
+前核心病危
+太上皇病危
+小鹰号沉没
+爱恋筱莉儿
+爱笑的女孩
+百美娇艳图
+便携式小岛
+沧海行云录
+超级照相机
+超极品教师
+陈苦作品集
+春風化雨錄
+大唐群芳录
+丹鼎艳修录
+鋼珠槍销售
+雷明頓銷售
+手機截聽器
+燃燒彈制作
+射釘槍改裝
+銷售干擾器
+銷售麻黃素
+迷失御花園
+线上娱乐城
+最新版假幣
+手机卡复制
+金属探测器
+影音收发器
+二异丙氨基
+甲氨基甲基
+碘乙酸乙酯
+二甲基吡啶
+21甲基丙基4
+硫酸二甲酯
+甲基狄戈辛
+人造芥子油
+硫代乙二醇
+双环氧乙烷
+对氨基氮苯
+尿嘧啶芳芥
+甲基化二硫
+间位叶蝉散
+增效百虫灵
+甲基特乐酯
+二硝叔丁酚
+二硝另丁酚
+联苯杀鼠奈
+黄金探测器
+美女一笑散
+磅秤校正器
+电表省电器
+复制购物卡
+门禁卡复制
+复制门禁卡
+遥控车牌架
+高仿人民币
+雷达波探测
+硝化纤维素
+斯蒂芬酸铅
+巴力WILDCATC5
+羟基环戊基
+氢化可的松
+41H3H嘧啶2酮
+爸爸的新娘
+娇宠水芙蓉
+梦幻逆玉王
+现代逍遥录
+3S4715R16瑟文
+金属手拉机
+胡椒基甲基
+胡椒基甲酮
+手工猎刀专
+野营生存刀
+蝶舞大唐春
+都市百美录
+都市花缘梦
+都市炼宝王
+都市逍遥侠
+短暂的春秋
+恶魔养殖者
+方寸光合集
+高树三姐妹
+公主复国记
+攻占大小姐
+共和国士兵
+共和国之辉
+寒天行侠传
+豪门小老婆
+何春传奇史
+黑白二小猫
+后宫海贼王
+花香飘满衣
+幻变小艳妻
+混世小农民
+极品器炼师
+极品少年王
+极品桃花运
+捡到个天使
+江山绝色榜
+姐姐的房间
+戒指也疯狂
+金钱美人志
+金庸与明报
+京都的故事
+静静的辽河
+局长成长史
+狂野艳逍遥
+老婆爱上我
+老婆投降吧
+怜花百美缘
+六朝清羽记
+龙吟百美缘
+冒牌大英雄
+妹妹爱上我
+迷男作品集
+蜜糖俏女佣
+母爱的升华
+泥人作品集
+弄花香满衣
+女人也疯狂
+女神的诡计
+陪睡的女人
+骑士的血脉
+潜龙作品集
+秦守作品集
+情戏浴美人
+擎羊舞风云
+全职业天才
+三国百花吟
+色麒麟修真
+神医擒美录
+圣女修道院
+失落作品集
+时尚女记者
+田野的春天
+推妻入友怀
+退出党团队
+王只准宠我
+王曼媛之死
+危险性学生
+我和久美子
+我是大魔鬼
+武林启示录
+舞月间情录
+仙剑御香录
+限量版男人
+乡村野疯狂
+相公好无理
+逍遥小散仙
+销魂百指令
+销魂十指令
+邪性碧血剑
+新青年卡卡
+新五朵金花
+玄朱神人录
+血指销魂迷
+艳女销魂泪
+一剑破天骄
+战乱的星系
+这就是绝杀
+正气寻妇录
+智取小姨子
+重生之心动
+醉笑卧乡野
+金身改进版
+少女发育图
+输卵管疾病
+性文学小说
+仿真人民币
+国家防火墙
+神也是男人
+美女伴我游
+欲海天龙传
+奥运外地人
+成都服装厂
+成都工作服
+防辐射孕妇
+杏林轩健康
+卷帘车牌架
+剧毒化学品
+QQ賣45MM狗糧
+新妻倩如
+注册送现金
+白金娱乐城
+利澳现金网
+华宝娱乐城
+利博娱乐城
+鸿运娱乐城
+帝豪娱乐城
+七乐娱乐城
+新星娱乐城
+大众娱乐城
+海立方娱乐
+广发娱乐城
+中信娱乐城
+大赢家赚钱
+钻石娱乐城
+供应香港ghb
+我爱色色吧
+色娃娃社区
+婷婷五色天
+性吧发布器
+冯仰妍快播
+圣母机器人
+曼娜回忆录
+门事件种子
+同志女论坛
+一生酒色网
+校园群芳记
+百色性导航
+供应伞兵刀
+美女捰聊网
+天天干影院
+嘻嘻色影院
+色狗狗影院
+哥哥插影院
+叶倩彤全集
+天天色导航
+撸撸射影院
+幼幼片下载
+射雕黄蓉传
+后宫群芳图
+警花白燕妮
+娃娃色社区
+供应博伊刀
+牌九娱乐城
+鼎丰娱乐城
+金龙娱乐城
+销售awp配件
+直销awp配件
+订购awp配件
+供应awp配件
+提供awp配件
+awp配件提供
+awp配件销售
+awp配件订购
+awp配件直销
+awp配件供应
+航宇娱乐城
+永利娱乐场
+欧洲娱乐场
+德晋娱乐城
+世博娱乐城
+专售迷晕药
+永利博娱乐
+天马娱乐城
+银泰娱乐城
+娃娃色导航
+亿博娱乐城
+北京找楼凤
+色农夫影院
+红宝石娱乐
+皇星娱乐城
+金彩娱乐城
+真人二八杠
+汇丰娱乐城
+金宝博滚球
+楼凤信息网
+订购丛林刀
+丛林刀转让
+专卖求生刀
+销售警用刀
+丛林刀提供
+色导航联盟
+专卖礼花弹
+买卖等级证
+销售致癌药
+供应致癌药
+丛林刀专卖
+专卖丛林刀
+麻雷子销售
+直销手拉狗
+供应手拉狗
+订购手拉狗
+购买手拉狗
+转让手拉狗
+手拉狗直销
+手拉狗供应
+手拉狗提供
+手拉狗购买
+手拉狗订购
+供应礼花弹
+提供礼花弹
+采购礼花弹
+礼花弹销售
+礼花弹购买
+礼花弹直销
+订购礼花弹
+销售礼花弹
+购买礼花弹
+礼花弹订购
+帮人复仇网
+手拉狗销售
+直销开他敏
+购买致癌药
+买卖可待因
+提供丛林刀
+供应丛林刀
+转让丛林刀
+丛林刀供应
+购买气动狗
+供应气动狗
+提供气动狗
+直销气动狗
+转让气动狗
+气动狗直销
+气动狗供应
+气动狗提供
+气动狗购买
+订购气动狗
+气动狗订购
+气动狗销售
+提供安钠咖
+安钠咖提供
+专卖古可叶
+杜冷丁专卖
+皇冠注投网
+迷晕药直销
+迷晕药销售
+迷晕药购买
+迷晕药提供
+长治筋购买
+苍蝇粉提供
+失忆粉订购
+苍蝇粉购买
+失忆粉供应
+失忆粉直销
+失忆粉购买
+失忆粉提供
+苍蝇粉供应
+苍蝇粉订购
+苍蝇粉直销
+苍蝇粉销售
+pcp新贵专卖
+提供掌心雷
+提供三棱刀
+古柯碱提供
+供应学生证
+销售进口pcp
+军官证销售
+提供失意粉
+销售失意粉
+失意粉销售
+失意粉供应
+买卖苍蝇粉
+供应钻石冰
+直销礼花弹
+冷钢刀直销
+冷钢刀销售
+汽木仓销售
+销售手拉狗
+销售汽木仓
+销售pcp套件
+摇头糖销售
+办理警员证
+安钠咖销售
+听话水销售
+销售黎城面
+成品冰销售
+可待因提供
+可待因销售
+网络棋牌室
+安眠酮提供
+订购high粉qq
+转让战术刀
+直销战术刀
+供应战术刀
+长治筋买卖
+直销汽动狗
+订购汽动狗
+供应汽动狗
+购买汽动狗
+销售汽动狗
+汽动狗销售
+汽动狗直销
+转让汽动狗
+汽动狗订购
+汽动狗供应
+汽动狗转让
+汽动狗购买
+汽动狗提供
+提供汽动狗
+黄樟素订购
+黄樟素供应
+黄樟素提供
+黄樟素销售
+购买pcp套件
+麦角胺专卖
+提供钻石冰
+高仿证供应
+礼花弹供应
+安钠咖供应
+礼花弹提供
+丛林刀销售
+提供听话水
+听话水订购
+迷晕药供应
+供应迷晕药
+百乐门网站
+夜来香社区
+提供学生证
+六级证办理
+转让仿真awp
+买卖仿真awp
+提供仿真awp
+直销仿真awp
+杜冷丁供应
+拍肩粉专卖
+买卖pcp新贵
+订购手拉awp
+少女之心
+青蓝双娇
+折翼天使
+涩女日记
+倾世皇妃
+六花禁爱
+剩女不淑
+月上重火
+桃花小姐
+樱花红破
+美艳人妻
+花侠浪魂
+香艳杀劫
+百毒神君
+极品弃妇
+老根嫩草
+暴露指令
+淡色满楼
+尿道刑法
+脂浪斗春
+春染绣塌
+浪史奇观
+浓情秘史
+僧尼孽海
+桃红香暖
+巫山蓝桥
+如意君传
+冤狐情史
+宜春香质
+春灯迷史
+春透海棠
+春闺秘史
+痴婆子传
+俺去也av
+邻居美妻
+月泊西眉
+狼友阁论坛
+娇艳都市
+粉臀红痕
+楼凤交流区
+开他敏直销
+六欲仙缘
+逐欲红尘
+浴火情潮
+同性相吸
+狮情化欲
+月皎花娇
+猎美艳录
+穿越大唐
+夕浥红尘
+梦落繁花
+我是王妃
+人生如粥
+多多益善
+懒凤来仪
+超级女警
+怜镜传说
+后宫学园
+真情无奈
+两个妈妈
+甜蜜家庭
+巧婢奇缘
+凤霸天下
+花容天下
+艳说大唐
+操破苍穹
+倾城美人
+青莲记事
+芙蓉颜色
+半路擒君
+办理警官证
+香国竞艳
+情迷都市
+惊天密典
+幻梦唯心
+神仙糖买卖
+买卖神仙糖
+可待因供应
+供应赭曲毒
+删除负面帖
+美肉商人
+艳兽都市
+娱乐棋牌城
+芳邻好土
+客栈老板
+岁月无声
+代理增值票
+流泪的狼
+在幽微处
+爱的灵感
+兽心沸腾
+北极之北
+醉人倾离
+好人难为
+活色生香
+亲爱的人
+卿心依旧
+三角关系
+轻落天下
+蓝颜有奕
+末裔之殇
+夜魅袭阳
+超级官迷
+超火司机
+飘飘欲仙
+村长后宫
+浪漫官途
+乡村教师
+乱村佳人
+销售听话水
+听话水专卖
+供应锡锋b51
+专卖pcp新贵
+大户家丑
+山野情债
+人面兽医
+小村糙事
+后宫男医
+邪魔上身
+剁饼子服务
+pcp货到付款
+大玩家娱乐
+娱乐城棋牌
+中握b50供应
+销售中握b50
+直销中握b50
+订购中握b50
+供应中握b50
+提供中握b50
+中握b50销售
+中握b50直销
+转让中握b50
+中握b50订购
+中握b50转让
+中握b50提供
+专卖古柯叶
+专卖可待因
+专卖喵喵药
+专卖安纳咖
+直销可待因
+直销麦角胺
+专卖ghb原液
+直销ghb原液
+直销安眠酮
+订购可待因
+订购安眠酮
+订购安纳咖
+订购古柯叶
+订购ghb原液
+供应碘化钠
+掌心雷销售
+掌心雷供应
+砖石冰提供
+麦角胺直销
+喵喵药直销
+喵喵药供应
+专卖赛洛新
+直销赛洛新
+订购赛洛新
+供应二恶英
+销售丛林刀
+三棱刀销售
+三棱刀订购
+订购三棱刀
+龙凤配网站
+乡野痞医
+美妙人妇
+肉体买家
+警花出更
+荒村野性
+媚骨销魂
+在线看黄片
+色影视导航
+金宝博188BET
+三棱刀转让
+销售长治筋
+直销长治筋
+订购长治筋
+提供长治筋
+长治筋销售
+长治筋供应
+长治筋直销
+长治筋订购
+长治筋提供
+丛林刀直销
+订购美沙酮
+美沙酮直销
+美沙酮订购
+美沙酮提供
+买卖钻石冰
+提供芬太尼
+提供芽子碱
+提供埃托啡
+订购阿桔片
+提供丙吡兰
+提供呋替啶
+提供氢可酮
+供应左啡诺
+三棱刀供应
+订购喵喵药
+喵喵药订购
+麦角胺订购
+订购麦角胺
+销售麦罗啡
+销售哌替啶
+销售赛洛新
+销售蒂巴因
+销售替力定
+销售丙吡兰
+销售阿桔片
+销售卡西酮
+销售已色胺
+销售古柯叶
+销售芽子碱
+销售埃托啡
+销售芬太尼
+销售呋替啶
+销售氢可酮
+销售左啡诺
+销售醋托啡
+销售ghb原液
+麦角胺提供
+李宗瑞种子
+办假学生证
+摇头糖供应
+同志电影网
+汽木仓供应
+气抢专卖网
+喵喵药提供
+直销安纳咖
+直销钻石冰
+直销液态冰
+直销朝鲜冰
+直销古柯碱
+直销户外刀
+在线摸奶秀
+转让三棱刀
+三夫妻开房
+庐江门种子
+乐博娱乐城
+宝马娱乐城
+买卖摇头糖
+冠军娱乐城
+真龙娱乐城
+至尊娱乐城
+膛线管专卖
+销售膛线管
+直销膛线管
+转让膛线管
+王民生艳照
+三夫妻下载
+三夫妻种子
+逍遥丸供应
+真钱棋牌室
+现金娱乐城
+警官证买卖
+麦角胺供应
+供应麦角胺
+藏刀专卖网
+销售安乐死
+慢性毒神药
+销售可待因
+销售安纳咖
+销售安眠酮
+销售鼻吸剂
+销售扒皮刀
+销售羊骨刀
+销售十字锁
+提供美沙酮
+金钱豹娱乐
+和记娱乐城
+百乐坊娱乐
+直销执勤装
+直销喵喵药
+直销听话水
+直销三棱刀
+办假警官証
+办理警官証
+棋牌娱乐城
+皇冠娱乐城
+提供蜘蛛刀
+蜘蛛刀提供
+色娱乐导航
+专卖麦角胺
+提供麦角胺
+直销警官证
+直销美沙酮
+销售麦角胺
+销售喵喵药
+色狐中文站
+麦角胺销售
+宾利娱乐城
+龙博娱乐城
+战神娱乐城
+豪博娱乐城
+日博娱乐城
+古柯碱供应
+军官证办理
+提供tnt教程
+杜冷丁买卖
+专卖蜘蛛刀
+美沙酮供应
+永利现金网
+警官证销售
+专卖警用棍
+专卖警官证
+买卖警官证
+购买警官证
+户外刀专卖
+开心色播网
+警官证专卖
+供应美沙酮
+专卖美沙酮
+自制tnt方法
+自制tnt教程
+蜘蛛刀专卖
+办假警官证
+第四色导航
+草榴导航网
+谷露影院网
+日日色影院
+提供喵喵药
+最新人妻斩
+自制烟雾弹
+提供古柯碱
+复仇一条龙
+卖业主信息
+拍肩粉销售
+大色逼电影
+未成年接客
+购买木邦刀
+供应斩马刀
+提供平头刀
+供应警官服
+专卖锡锋b51
+新款打死跌
+国产手拉长
+澤尻繪裡香
+诚 信 办 证
+提供液态冰
+各式警常服
+喵喵药合成
+三利达专卖
+电子干扰仪
+门锁干扰仪
+销售警官证
+色大哥影院
+色中阁影院
+哥要插影院
+植物化壆冰
+五四式专卖
+听话水电话
+小妹和帅哥
+供应三棱刀
+色百合导航
+冷兵器专卖
+我爱小姨子
+江南柔娘子
+供应警官证
+四房色播网
+色色播电影
+草榴社区网
+色酷色影院
+经营汽狙狗
+警官证供应
+大色咪影院
+素人俱乐部
+色色人体图
+美女色导航
+供应荷兰水
+仓井空电影
+空天使种子
+空天使全集
+欧美色漫图
+一个色导肮
+包你爽到射
+唐刀专卖网
+色悠悠成仁
+一品色导航
+色播电影网
+原装汽狙狗
+供应杜冷丁
+商丘单车网
+办理真凭文
+真人娱乐城
+插妹妹电影
+溴化铯供应
+学历证办理
+八旗娱乐网
+极品留学生
+眯眯俱乐部
+快活谷论坛
+广西桑拿网
+小姐电视台
+狼族娱乐网
+号码任意显
+365在线投注
+高消费名录
+真钱扎金花
+同性恋上门
+欢乐谷导航
+成娱色导航
+亚洲贴图区
+欧美转帖区
+欧美贴图区
+亚洲转帖区
+办假房产证
+办假结婚证
+办理户口本
+办理行驶证
+办理军官证
+供应黎城面
+第四色快播
+供应长治筋
+咪咪色色网
+任意显软件
+供应任意显
+寻找夜夜情
+办假导游证
+购买学历证
+办理学生证
+销售掌心雷
+供应掌心雷
+供應麥角酸
+銷售黃牙簽
+供應苯三酚
+獵槍制造图
+高价收腎脏
+供应高压狗
+銷售高压狗
+提供高压狗
+供應高压狗
+销售高压狗
+高价收腎源
+賣假人民幣
+找职業殺手
+手机变号机
+代购手機007
+找職業殺手
+帮人被欺负
+警官证办理
+律师证办理
+办理律师证
+办理国安证
+我爱狐狸精
+彈簧刀专卖
+卖假身份證
+卖真身份證
+幫人被欺負
+麥角酸配方
+摇头糖合成
+黃牙簽配方
+麻黃素配方
+神仙糖配方
+搖頭糖配方
+白牙簽配方
+摇头糖配方
+人妻俱乐部
+香港三中三
+平码三中三
+麥角酸出货
+卖仿真手槍
+鉆石冰出货
+黃牙簽出货
+搖頭糖订购
+白牙簽订购
+麻黃素订购
+神仙糖订购
+黃牙簽订购
+钻石冰订购
+摇头糖订购
+鉆石冰订购
+麥角酸订购
+QQ订购high粉
+神仙糖出货
+摇头糖出货
+搖頭糖出货
+白牙簽出货
+麻黃素出货
+仿真槍专卖
+仿真槍到货
+卖冰钻手机
+卖冰钻电话
+卖冰磚电话
+摇头糖到货
+麥角酸到货
+神仙糖到货
+搖頭糖到货
+白牙簽到货
+黃牙簽到货
+麻黃素到货
+QQ销售high粉
+供应麻黃素
+供应白牙簽
+供应黃牙簽
+供应鉆石冰
+供应麥角酸
+供应大冰磚
+搖頭糖销售
+鉆石冰销售
+黃體酮销售
+麥角酸销售
+白牙簽销售
+黃牙簽销售
+麻黃素销售
+供应神仙糖
+供应摇头糖
+神仙糖销售
+三利达直销
+三利达官网
+三利达地址
+手机qie听器
+ 99suncity.net.cn
+ fancylook.com.cn
+ muxingtianxia.cn
+2个倒数第一
+官话4级教材
+夺得8金以后
+dang在玩社会
+ wuhanwuchang2008
+kscm945紧缩版
+h1n1殃及股市
+离中国5公里
+3穘誸惑方式
+ simin0809hotmail
+ zydbzj168hotmail
+ redhotcollection
+ shoujijiantingqi
+ triazolamtablets
+代樯桃蛋l票
+ 81'*'095112416105
+ 7051589882818772
+ sunyong320722126
+ hvu7w7o2nk648o0w
+ bjyunqiwenhua163
+ lihaitaook163com
+ health588blogbus
+ 3'*'2011968060122
+ asf0022selfipnet
+ asf0023webhopnet
+ jiaoyukaoshiwcom
+ happy0535lifecom
+ chengrenjiqingcn
+ pragmaticenglish
+ xuesheng512gmail
+ wztj168ons365com
+全国2nai大赛
+牛b的萨达姆
+无权指挥8341
+四川1000万吨
+家人4次报警
+索尼VGN-TX57CN
+舍生取义 庭
+1992年5月13日
+9500多套图纸
+个性照片T恤
+硫酸3乙基锡
+2丁基氧化锡
+乙酸3乙基锡
+乙酸3甲基锡
+6亚甲基亚胺
+6二硝基苯酚
+2硝基重氮酚
+3苯基羟基锡
+氧化2丁基锡
+3乙基乙酸锡
+醋酸3甲基锡
+2甲基亚硝胺
+4氨基氮杂苯
+3亚乙基密胺
+3宫6院7十2妃
+色之戒4合院
+2甲基丁酸酯
+3硝酸纤维酯
+双赢百2对单
+红9真人娱乐
+办理医师证q
+g片免费下载
+日本g片下载
+免费g片下载
+cp99配件直销
+cp99配件销售
+提供654k配件
+654k配件专卖
+供应654k配件
+冷妹妹2影院
+cp99配件专供
+订购m4a1配件
+订购cp99配件
+提供cp99配件
+cp99配件专卖
+1000人斩下载
+官员群P艳照
+庐江群p种子
+亚洲g片下载
+制取petn方法
+官员群P照片
+庐江官员群P
+三对夫妻群P
+庐江群p照片
+PENT制作过程
+开心8娱乐城
+2012中考答案
+人美B嫩图文
+真实的世界2
+冰zhuan销售QQ
+最新1000人斩
+卖high粉手机
+卖high粉电话
+e夜情俱乐部
+ zh.wikipedia.org
+反对08奥运会
+4个2和一对王
+09mba考题作废
+流感80是甲流
+不會蒸發的89
+不会蒸发的89
+你好韩国16集
+ jinshirekaospaces
+ stytzk1939hotmail
+ laohujigaoshoucom
+ 3'*'29195210195126
+ zhoukai7590163com
+ asf0025isacheforg
+ baisui010foodqscn
+ baisui020foodqscn
+ baihuikejiwangcom
+ jiqingredian007cn
+ xintangrendianshi
+京v019至京v028
+57苦难的祭坛
+ witnessinghistory
+68名顶尖武林
+21日世界末日
+30日搬出华杰
+ SevenYearsinTibet
+《12个春秋》
+39种有毒食品
+南洋10大邪术
+ 135-4406-6974
+ Nine commentaries
+生成身份證qq
+巴力WILD CAT C5
+N亚硝基2甲胺
+41H3H嘧啶二酮
+4-氨基氮杂苯
+2-甲基丁酸酯
+2-环己烯-1-酮
+丙3醇3硝酸酯
+乙2醇2硝酸酯
+温彻斯特1000X
+34714151620庚醇
+NG与乙醇配成
+幸福蜜月30天
+qq賣虎頭雙管
+qq賣左輪手槍
+qq賣仿真槍模
+qq賣禿鷹汽槍
+供应k3精炼粉
+供应k2精炼粉
+真人现金21点
+龙虎万隆前'*'
+假本科学历qq
+苍井空av下载
+在线真钱21点
+3D打印CAD文件
+狙3d设计图纸
+qq供应芬太尼
+假工程师证qq
+度冷丁供应QQ
+QQ专卖迷晕药
+qq四级证制作
+qq四级证办理
+qq专卖四级证
+专卖四级证qq
+四级证办理qq
+qq销售甲喹酮
+qq气动狗转让
+qq专卖汽木仓
+购买拍肩粉qq
+供应黄樟素qq
+四级证专卖qq
+供应哌甲酯qq
+qq军官证制作
+中握pcp专卖qq
+qq专卖气动狗
+手拉狗买卖qq
+提供手拉狗qq
+手拉狗转让qq
+提供pcp新贵qq
+供应pcp新贵qq
+办理四级证qq
+买卖气动狗qq
+qq销售气动狗
+销售气动狗qq
+专卖气动狗qq
+qq可待因专卖
+qq可待因订购
+订购致癌药qq
+qq订购安钠咖
+qq供应可待因
+qq提供致癌药
+qq销售安钠咖
+qq销售折叠刀
+qq提供折叠刀
+qq直销折叠刀
+qq订购折叠刀
+qq供应折叠刀
+qq直销安钠咖
+qq供应安钠咖
+买卖礼花弹qq
+提供致癌药qq
+直销丛林刀qq
+qq办理四级证
+黄樟油销售qq
+黄樟油提供qq
+黄樟油供应qq
+黄樟油订购qq
+黄樟油直销qq
+qq购买喵喵药
+qq销售开他敏
+qq购买开他敏
+qq订购开他敏
+开他敏购买qq
+供应开他敏qq
+订购开他敏qq
+购买开他敏qq
+提供开他敏qq
+购买喵喵药qq
+qq订购迷晕药
+qq直销迷晕药
+qq购买迷晕药
+qq提供迷晕药
+qq销售迷晕药
+订购迷晕药qq
+直销迷晕药qq
+购买迷晕药qq
+提供迷晕药qq
+qq购买苍蝇粉
+qq直销苍蝇粉
+qq订购苍蝇粉
+qq提供苍蝇粉
+qq订购失忆粉
+qq直销失忆粉
+qq销售失忆粉
+qq购买失忆粉
+qq提供失忆粉
+购买失忆粉qq
+购买长治筋qq
+供应失忆粉qq
+订购失忆粉qq
+直销失忆粉qq
+销售失忆粉qq
+提供失忆粉qq
+订购苍蝇粉qq
+购买苍蝇粉qq
+qq直销锡锋b51
+qq提供户口本
+qq销售昏睡药
+qq供应安眠酮
+失意粉提供qq
+蜘蛛刀供应qq
+供应失意粉qq
+qq供应听话水
+销售朝鲜冰qq
+qq提供哌替啶
+qq提供拍肩粉
+销售军官证qq
+喵喵药销售qq
+钻石冰销售qq
+销售折叠刀qq
+销售迷晕药qq
+qq销售本科证
+销售成品冰qq
+qq提供开他敏
+qq供应开他敏
+提供哌替啶qq
+开他敏销售qq
+销售开他敏qq
+开他敏供应qq
+qq提供可待因
+提供古柯叶qq
+供应古柯叶qq
+qq供应古柯叶
+qq提供古柯叶
+供应拍肩粉qq
+qq供应拍肩粉
+qq提供膛线管
+qq销售杜冷丁
+qq订购杜冷丁
+qq提供杜冷丁
+提供汽木仓qq
+订购钻石冰qq
+提供苍蝇粉qq
+qq订购军官证
+办理学历证qq
+qq销售苍蝇粉
+qq供应苍蝇粉
+提供pcp套件qq
+安眠酮销售qq
+李宗瑞bt种子
+订购拍肩粉qq
+供应安眠酮qq
+拍肩粉提供qq
+拍肩粉供应qq
+销售拍肩粉qq
+提供可待因qq
+可待因专卖qq
+安眠酮直销qq
+销售杜冷丁qq
+销售苍蝇粉qq
+供应苍蝇粉qq
+杜冷丁销售qq
+订购杜冷丁qq
+k7娱乐城开户
+线上真钱21点
+杜冷丁购买qq
+杜冷丁直销qq
+qq直销杜冷丁
+qq购买杜冷丁
+开他敏提供qq
+开他敏订购qq
+杜冷丁提供qq
+李宗瑞全集bt
+专卖度冷丁qq
+二代证制作qq
+qq直销拍肩粉
+购买听话水qq
+qq制作本科证
+qq办理学历证
+买卖杜冷丁qq
+军官证制作qq
+qq订购拍肩粉
+qq销售拍肩粉
+提供军官证qq
+直销军官证qq
+qq销售军官证
+制作军官证qq
+办理等级证qq
+qq制作等级证
+qq办理等级证
+qq制作军官证
+供应可待因qq
+办理假学历qq
+qq警官证制作
+qq五氧化二钒
+庐江不雅照bt
+古桃色联系QQ
+塑料冰供应qq
+礼花弹qq供应
+提供折叠刀QQ
+提供折叠刀qq
+日本av之旅
+kk娱乐城网站
+线上kk娱乐城
+办假资格证qq
+高价收骨髓QQ
+美沙酮销售qq
+供应士兵证qq
+销售摇头糖QQ
+销售美沙酮qq
+QQ供应喵喵药
+供应喵喵药qq
+供应军官证qq
+王民生宾馆6p
+BB体育娱乐城
+删除负面贴qq
+网上真钱21点
+蜘蛛刀买卖qq
+供应蜘蛛刀qq
+销售蜘蛛刀qq
+供应喵喵药QQ
+qq制作警官证
+仿真手拉狗QQ
+老年人数据QQ
+网络专卖74式
+网络专销85式
+销售黃牙簽QQ
+qq卖仿真槍模
+qq卖虎頭獵槍
+QQ销售大冰磚
+QQ销售麥角酸
+QQ销售鉆石冰
+QQ销售黃牙簽
+QQ订购小冰磚
+QQ订购搖頭糖
+QQ订购摇头糖
+QQ销售麻黃素
+QQ销售白牙簽
+QQ销售搖頭糖
+QQ订购黃牙簽
+QQ订购麻黃素
+QQ订购神仙糖
+QQ订购钻石冰
+QQ订购麥角酸
+QQ订购鉆石冰
+QQ订购大冰磚
+QQ订购白牙簽
+卖间苯三酚QQ
+卖間苯三酚QQ
+QQ供应小冰磚
+QQ供应冰鉆石
+QQ供应搖頭糖
+QQ销售摇头糖
+QQ销售神仙糖
+QQ销售小冰磚
+第十六次代表
+践踏中国女性
+三坊七巷火灾
+瘟总再杆五年
+帐篷就会脱销
+希xi望wang之声
+现代英雄传奇
+手机截听器
+手机窃听器
+魔界活动转区
+腾讯幸运之星
+富人与农民工
+广州火车春运
+十大忽悠名言
+当今六大谎言
+国际足坛五大
+扶不起的阿斗
+想不到的黑幕
+这年头就这样
+公务员的工资
+科技精英遇难
+ campofyourself.com
+ shipinwangzhan.com
+网络推广软件
+网络营销工具
+语音广告群发
+乐众国际娱乐
+香港图源总汇
+说艳门男女爽
+桑拿房玩小姐
+淄博的性产业
+管理就是收费
+当今三大扯蛋
+地痞各霸一方
+歌星不能入党
+跟进村泪汪汪
+喝酒基本靠贡
+翻身改做小姐
+捍卫党的纯洁
+喜迎油价上涨
+奶所以被弃也
+中国弱智现象
+汉语谐音艺术
+丫就不会入党
+可要向党交心
+中学生售货员
+关于毛的故事
+政府忽悠百姓
+北方尽出祸害
+中国股市荒诞
+自比秦皇张献
+欢迎李朋同志
+政黨玩弄社會
+用英语问小平
+做為裆的幹部
+急裙中之所急
+奴颜婢膝之陡
+妈好象党中央
+干部上任请吃
+民工不得入内
+酒桌殷勤献献
+石油如此稀少
+钱不贪权不沾
+西方洪水泛滥
+叩头处处破费
+再不撤退破产
+震前鸦雀无声
+羞专家他先人
+地球调成震动
+挖掘基本靠手
+李宁跑出画卷
+ 512228
+土匪都剿灭了
+上级官位难保
+父母下岗儿下
+可以踢翻小贩
+神舟发射后面
+狗屁民族政策
+渔肉百姓为荣
+全都男盗女娼
+祖英照顾民哥
+长征路过这村
+毛澤栂律硪煌
+就算地球不转
+十大缺德行业
+公僿真是笨蛋
+检查就是接待
+割肚子要红包
+公务奢华程度
+费用就比军费
+地方政府衭幹
+结果人命万碎
+国民一直挨饿
+胡歌遭遇华仔
+剿匪勇士来电
+抽烟喝酒有益
+独唱回家吃饭
+钱换权能通天
+非食用冰醋酸
+售海樂神司
+香港二类ghb水
+美国菲力普窃
+高锰酸钾和糖
+提供彈道導彈
+羞辱中国足球
+骗子公司大全
+榦景緒絡公司
+见过人吃人肉
+下载代理软件
+自动代理软件
+震得耳赤舌甘
+旭日厨行抢劫
+过滤软件之争
+科技频道被关
+超级翻墙组合
+最肮脏的十种
+开平女中学生
+传球基本靠瞅
+三鹿经典广告
+奶源收购问题
+地沟油炒的菜
+感谢河北三鹿
+喂添加剂的猪
+奶农说是奶牛
+吮吸污染奶滴
+生成一瓶三鹿
+当残奥会冠军
+大米里有石蜡
+有话对三鹿说
+石粉掺进面粉
+肉瘤配做包子
+油桶改当烤炉
+广元蛆虫柑橘
+林场追踪疫情
+怕有孔雀石绿
+三鹿最新广告
+三鹿直奔黄泉
+招募山寨足球
+把玩中国足球
+农场辅助工具
+牛血兑洗衣粉
+劣质蜜饯加工
+肯德鸡的内幕
+养蟹人不吃蟹
+吃四川的橘子
+三鹿代言明星
+毒食品大曝光
+蔡家城的毁灭
+搜狐攻击腾讯
+肯德基又出事
+莫拉克扑闽浙
+甲流死亡事件
+不敢违背王鑫
+光环下的五粮
+375路公交车灵
+异象频现中国
+匿名代理软件
+股票软件代理
+巟大寃生禁食
+领大学生禁食
+见新疆人就打
+广场上的鲜血
+人民的求救信
+果敢人民泣拜
+果敢汉人开战
+难民涌入中国
+果敢战争起因
+川渝教师罢教
+新疆人在韶关
+弹落入中国境
+维护中缅边境
+维族学生狂殴
+教師羣課請願
+六月股灾出来
+股民不是人民
+股民的一封信
+石油套死出来
+人寿股权去向
+调查中国证监
+股民手中套钱
+股是越套越深
+资金已被牵引
+我站在中石油
+中石化说亏损
+股票倒数第一
+股民挨个换套
+中国平安讣告
+中国石油腰斩
+牛市一去不返
+万科给中石油
+中国石油悼文
+跌股中国石油
+给中石油的信
+石油放心不下
+被套渴望解套
+中石油给万科
+散户半年总结
+股民答会割肉
+今天不看大盘
+股民埋在弖墟
+股民埋在废墟
+股市如此多娇
+质问威视股份
+检阅套牢股民
+被套股民方阵
+买啥啥套方队
+天兵战争集团
+三三九乘元功
+无上师电视台
+佛教音乐下载
+格色拉的祈祷
+ dingxiangroomcomcn
+少媎噴血誸惑
+日本人妻网站
+朋友妻大家骑
+透明紧身白裤
+黑袜美女狂舞
+少媎亮絲誸惑
+换卫生巾过程
+全都插进去了
+欧美美女套图
+夫妻互换对搞
+绷带石膏爱好
+美女沙滩换衣
+极品美女秘书
+超爽午夜剧场
+抚上仁大腿间
+不能使劲捏奶
+我的放荡生活
+宇宙而章三光
+夜生活俱乐部
+重庆兼职妹妹
+身份譪生成器
+提供网络攻击
+胶水特殊处理
+网上快速诚信
+网上快速办理
+免试大学毕业
+让你远离罚单
+领导忽悠百姓
+武汉诚诺电子
+私家侦探用品
+富丽毕业设计
+ xinxiwangjiaoyucom
+包您通过考试
+ luotishipinzhancom
+考试咨询联盟
+一次性通呖荚
+考试一手答案
+ sy178261150hotmail
+专业老牌机构
+ 362'*'7196507100012
+网站推广软件
+北京办毕业譪
+快速办理执业
+华悦电子科技
+先考试再付款
+佳华安防设备
+ chouenlailafengnet
+ bloodisonthesquare
+ globalcompetitions
+运通投资信贷
+ asf0021webhopnet83
+ secretchinacomnews
+ lyrz9888blog163com
+ tianyakefubokeecom
+考前不收分文
+ jiguangdiaokejicom
+办理雅思托福
+权威一手答案
+ lijuhantiansinacom
+欺负民用车辆
+可悲的新千年
+坚持杀萨达姆
+删改侵华史实
+丢解放军的脸
+胡佳获诺贝尔
+恶性殴斗案件
+当街将人打死
+当街殴打致死
+人類滅亡年表
+抬蒋不必抑毛
+公务员李文娟
+陇南民变现场
+证监会不作为
+检察官张金祥
+谴责法国总统
+需要p3c来巡逻
+进京抓捕记者
+取消农业户口
+系列户改措施
+取消农村户口
+地方政府瞒报
+检察官进京抓
+取消户籍制度
+克里斯汀案件
+带编号的014733
+刘志军罢免掉
+十大丑陋人物
+温相该不该哭
+退伍军人堵路
+内地十大提案
+灵宝抗旱黑幕
+豪华出殡队伍
+预言人类灭亡
+王斌余杀人案
+民间监政组织
+中國應當復仇
+重庆哨兵被杀
+评毛大力催生
+狡猾的风水相
+驻渝部队门岗
+警官毁灭证据
+江苏民众事件
+市民疯抢口罩
+世界末日頰言
+医药代表李佳
+小平料事如神
+强行强拆为耻
+歪风在通知里
+好干部邓贵大
+独壮玉娇之行
+县长之女率众
+懒官们的一天
+北逃十字路口
+共工与耶和华
+藐视上级征府
+皇叔街转拐处
+永信出卖佛教
+焚烧161次京沪
+职工群体斗殴
+葛丽英被拘留
+五月瘟神下界
+纳米比亚行贿
+漢人持械出動
+趁火打劫央视
+纳税养了一群
+掏空中国资源
+京城特权车牌
+新国会纵火案
+黑煤窑包身工
+开着公车撞人
+泪水流在中国
+酷刑对待中国
+人民不敢说话
+给总理支一招
+总理才提协调
+转业干部工资
+世间难字当头
+封媒体阻散步
+未来八大劫难
+500万买的警务
+灌火油入酒瓶
+通天语的声母
+国家是一条狗
+要农民掏腰包
+声讨相关部门
+传递是该暂停
+幼儿活活被埋
+群体道德缺失
+京师万民送葬
+企业收奶流程
+一切都怪星矢
+村主任李东洋
+中南海保镖们
+中国已经亡了
+苦恼的中国人
+执法将被拘留
+无群众之呼声
+佳纵火于闸北
+田文华看守所
+广东揭阳惊爆
+占道拜访花圈
+同伙车某父亲
+殴打死大学生
+云集上海法庭
+金融派系倾轧
+学生砍死教授
+翌年不足万余
+猥亵女童事件
+报警者被击毙
+教师致县政府
+海南大学霍乱
+新中国三十年
+家人四次报警
+还是党的国家
+李东风的妻子
+统计水分最多
+公仆真是笨蛋
+圈套给周总理
+痛殴农用三轮
+汪洋不被追责
+藏着利益黑洞
+中国就快消亡
+坚持反修斗争
+救楼市是救百
+怒了国家的法
+国家公器蒙羞
+刘伟私建违章
+广州酒吧暗访
+丑陋的中国人
+百姓严重缺粪
+规范干部泡妞
+广东幕僚无数
+杨佳母亲现身
+神州传播协会
+嫌疑人李兴辉
+做人不要太cnn
+500人打砸警车
+冲击株洲市府
+粪青和老粪蛋
+团长是张耀祠
+开印钞机还债
+安局长崔春晖
+徐洁为其添丁
+林场开始戒严
+安徽姑娘李蕊
+派出所就猝死
+奴隶少女新娘
+隐瞒征召女兵
+送政府也不管
+挖心割蛋抖肠
+党是为了欺骗
+批评政府帖子
+护矿变成守灵
+指导员王松善
+局长被打致死
+群众包围政府
+背叛了陶斯咏
+总理全家福照
+李淑莲赤着脚
+李淑莲被惊醒
+怒香港女记者
+小姐也有人格
+女职工张美霞
+出动300余名警
+建堂筹备小组
+緎權人士胡佳
+预测了杨利伟
+政委马群自恃
+部队打砸酒店
+我再派兵去砸
+反围剿形势图
+中國緎權人士
+白领遇见黑领
+曹操是韩国人
+郭泉案辩护词
+可恶的任志强
+落网鼠会是谁
+帖谴责奥巴马
+爱滋村里的爱
+北京市委黑幕
+北京宣传部长
+大熊猫被猎杀
+大众真人真事
+蛋白合成激素
+党内内部资料
+德国进口宝马
+颠覆中国政权
+东土耳其斯坦
+东西南北论坛
+对外高层人事
+飞天舞蹈学校
+粉碎林陈材料
+告全体网民书
+国家政府档案
+国研新闻邮件
+后勤资料手册
+华语世界论坛
+话在肉身显现
+黃海暗殺事件
+监狱里的斗争
+旧金山总领馆
+觉醒了的中国
+军事训练大纲
+军需物质保管
+军需物资保管
+酷睿2双核T7200
+李伟信的笔供
+两岸三地论坛
+领导财产公示
+領導財產公示
+民间手工艺品
+奶粉里都有毒
+你说我说论坛
+钳制网络言论
+侵犯国外专利
+人民之声论坛
+瑞士金融大学
+删除通话记录
+沈昌人体科技
+生命树的分叉
+省委大门集合
+圣灵重建教会
+十七人事安排
+十七位老部长
+世界经济导报
+双腿间的禁地
+苏军情况汇编
+特价国际机票
+万维读者论坛
+维吾尔信息社
+卫星安装调试
+我的鳥羽兄弟
+下届总理人选
+香港惠泽社群
+新疆反恐纪实
+新闻总署粗暴
+血溅人民天堂
+央视内部晚会
+易趣在线购物
+真空度测试仪
+指点江山论坛
+中国复兴论坛
+中国社会论坛
+中国问题论坛
+中国真实内容
+中国政坛新星
+中华大地思考
+中华人民正邪
+中华真实报道
+钟山风雨论坛
+重庆婚纱摄影
+重庆物业公司
+自主择业军官
+最高绝密新闻
+中国劳工通讯
+阿里布达年代
+北京箱子包子
+地下的先烈们
+杭州地铁坍塌
+乱弹人物揭晓
+山西襄汾溃坝
+不扣钮的女孩
+挡不住的风情
+镜花风月春降
+镜花风月系列
+满清禁宫秘史
+满清十大酷刑
+南洋第一邪降
+南洋十大邪降
+裴斗娜的体验
+色降II-血玫瑰
+十大丑陋语录
+十大无耻发言
+唐朝禁宫风云
+我的演员女友
+现代白蛇艳谈
+友邦正通学历
+中国死刑揭秘
+中南海大决战
+自制固体火箭
+ anies-registry.org
+ chinacitywater.org
+ gentle-essence.com
+ movequickly.com.cn
+ starcollege.com.cn
+ zhongxin-china.com
+电话追杀系统
+社会主义灭亡
+私家侦探服务
+卫星广播器材
+无人性的政权
+氧化二丁基锡
+乙酸三甲基锡
+乙酸三乙基锡
+治疗红斑狼疮
+中国过渡政府
+中国网络审查
+中南海恩仇录
+红外线照相机
+辦教师资格證
+公司绝对保证
+光学变色油墨
+无弹窗小说网
+找俄罗斯妞服
+粉红大布娃娃
+颠覆国家政权
+代理各种执照
+注册香港公司
+珠海九龙医院
+强效FM2销魂水
+苗猪繁育基地
+烟囱脱硫防腐
+皮肤淀粉样变
+女性生殖内分
+立体技术培训
+精气神元气袋
+雀斑修复原液
+腰椎间盘突出
+男士养生会馆
+美容美发培训
+牙齿美容图片
+牙齿美容流程
+牙齿美容标准
+精密牙齿美容
+牙齿美容知识
+重新牙齿美容
+铸瓷牙齿美容
+无痛牙齿美容
+活髓牙齿美容
+瓷冠固定义齿
+精密附着义齿
+舌侧牙齿矫正
+耳鼓式通话器
+防爆罐牵引车
+厦门完美装饰
+手机通话记录
+悬赏兼职发帖
+网上发帖赚钱
+网络炒作培训
+删除负面贴子
+十大欠抽人物
+阿樱的悄悄话
+包括黑暗黎明
+不道德的秘密
+吃下一群妖男
+传奇之狂风传
+大公司的圣姑
+虎頭獵槍销售
+手機改號軟件
+卖三箭牌气槍
+小飞型号订购
+製造緬古合成
+雙管獵槍销售
+買賣鷹牌獵槍
+真钱棋牌游戏
+显示任意号码
+温彻斯特 1000X
+軍品銷售公司
+遥控卷帘车架
+GX2005共享终端
+三苯基羟基锡
+左旋溶肉瘤素
+烯丙基芥子油
+三乙基乙酸锡
+醋酸三甲基锡
+绿藜芦生物碱
+二甲基亚硝胺
+枸橼酸芬太尼
+三亚乙基密胺
+毛地黄叶毒苷
+可可粉苯丙胺
+甲基安非他命
+美女倒提金方
+考验最新答案
+卷帘型车牌架
+考试专用设备
+紫外灯验钞笔
+六级阅读答案
+门禁卡拷贝机
+六级真题答案
+六级英语答案
+交通安全报警
+交通安全导航
+非电导爆系统
+软件免费下载
+2'*'异酸甲苯酯
+2'*'硝基邻甲酚
+3'*'甲基氮杂苯
+各类考生信息
+纸币货到付款
+过机版人民币
+恶人成长日记
+翻手男覆手女
+功夫如此多娇
+寒江作品合集
+皇极生作品集
+皇家娱乐指南
+极品雅词文集
+极品异能宅男
+江山如此多娇
+姐姐马上红润
+金庸小说改编
+绝代艳修之旅
+浪荡皇帝秘史
+灭主异世销魂
+魔女天妖全集
+飘在北京续篇
+妻不如妾盛天
+三国极品军师
+色鬼师异界行
+山麓百货商店
+铁屋中的呐喊
+脱落的小背心
+往事未付红尘
+我的极品老婆
+我的教师生涯
+我的警花老婆
+我的美女大人
+我的美女情劫
+我的青年岁月
+我身边的美女
+乡村如此多娇
+销魂倚天神雕
+小邪女荡妖传
+小昭养成计划
+性海浪子系列
+一个人的圣经
+伊底帕斯之镜
+异世法师传奇
+越之极品色女
+紫狂作品合集
+总裁的小秘书
+不过藏历新年
+博客贴子删除
+上海皓康汽车
+腾讯最新漏洞
+高假仿人民币
+狡猾的风水师
+大鸟鹰作品集
+东莞洪升科技
+苏州同济医院
+正健纳米保健
+獵槍子彈供應
+手槍子彈供應
+步槍子彈提供
+獵槍子彈提供
+步槍子彈供應
+手槍子彈提供
+步槍子彈銷售
+獵槍子彈銷售
+手槍子彈銷售
+荷兰叶子供应
+有偿帮人复仇
+新注册送彩金
+皇冠国际足球
+战神国际娱乐
+长乐坊娱乐城
+如意坊娱乐城
+删除帖子服务
+删贴服务电话
+网络删贴服务
+号码显示软件
+办英语等级证
+英吉沙刀专卖
+打水软件足球
+多彩打水软件
+现金网络棋牌
+禁断介护快播
+美空模特路遥
+雅蠛蝶影视网
+一起干妹妹网
+人妻恥悦旅行
+金发白虎女模
+快播日本电影
+售真实二代证
+供应花纹钢刀
+色狗中文娱乐
+办理民办学历
+户外露胸舔鲍
+快播痴汉电车
+小姐楼凤信息
+我的美艳岳母
+贝特斯娱乐城
+现金娱乐投注
+色片在线直播
+销售一体直刀
+订购一体直刀
+供应组合棍刀
+宝格丽娱乐城
+高尔夫娱乐城
+大家玩娱乐城
+壹贰博娱乐城
+走地皇娱乐城
+金三角娱乐城
+新普京娱乐城
+替人帮忙复仇
+找人帮忙复仇
+哈瑞斯娱乐城
+十六蒲娱乐城
+黄金城娱乐城
+红财神娱乐城
+盈丰国际平台
+牡丹国际娱乐
+保健全套上门
+帮人办事复仇
+国产模特私拍
+负面删除公司
+免费美女luo聊
+替人解气了仇
+华侨人娱乐城
+供应莫达非尼
+利博国际娱乐
+口工游戏下载
+销售普斯普剂
+提供替马西泮
+销售替马西泮
+客户资料专卖
+业主数据专卖
+业主资料专卖
+凯斯网娱乐城
+提供高空烟花
+麦司卡林供应
+武士长刀专卖
+专卖慢性毒药
+在线赌钱投注
+淘宝阿普唑仑
+代人复仇了事
+楼凤免费信息
+老人资料提供
+老人资料买卖
+销售阿普唑仑
+供应高空烟花
+提供阿普唑仑
+专卖阿普唑仑
+买卖慢性毒药
+直销阿普唑仑
+车主资源供应
+安乐死药供应
+安乐死药提供
+色咪咪色导航
+楼凤信息大全
+订购阿普唑仑
+供应业主数据
+提供老人资料
+供应老人资料
+股民数据提供
+车主资源提供
+供应神奇蘑菇
+提供神奇蘑菇
+神奇蘑菇供应
+神奇蘑菇专卖
+线上现金娱乐
+真钱棋牌网站
+房主信息销售
+女性数据供应
+销售考生数据
+品色论坛网址
+供应安乐死药
+真钱网上棋牌
+提供半圆刮刀
+车主资料提供
+业主资料提供
+提供绿皮瓦管
+提供黄曲霉素
+警用电棒提供
+提供警用电棒
+提供等级证书
+车主信息提供
+业主信息提供
+删除负面评论
+供应半自动pcp
+三棱尖刺供应
+供应高仿证书
+销售业主资料
+销售车主资源
+业主信息销售
+销售业主信息
+销售警用电棒
+业主数据供应
+提供业主数据
+物流数据销售
+销售家长资料
+业主数据销售
+销售老人数据
+警用标志销售
+车主资源销售
+销售业主资源
+销售考生资源
+考生资源销售
+股民数据销售
+销售车主档案
+犯人数据销售
+销售云南情蛊
+顺丰数据销售
+打猎专用工具
+销售面单数据
+缅甸果子销售
+销售户主资料
+销售半自动pcp
+老人数据销售
+供应美秃套件
+供应专科学历
+提供甲硝西泮
+甲硝西泮供应
+尼美西泮销售
+尼美西泮提供
+云南情蛊销售
+甲硝西泮销售
+甲硝西泮提供
+日本幼幼合集
+老人数据供应
+皇冠在线代理
+制作假户口本
+转让三棱刮刀
+购买手工猎刀
+手工猎刀购买
+手工猎刀提供
+买卖手工猎刀
+转让手工猎刀
+订购三棱刮刀
+三棱刮刀订购
+购买三棱刮刀
+三棱刮刀购买
+提供三棱刮刀
+三棱刮刀提供
+三棱刮刀销售
+直销三棱刮刀
+买卖三棱刮刀
+罂子粟壳订购
+罂子粟壳送货
+删除网上新闻
+删除网上消息
+供应膛线狗管
+供应特警装备
+真钱牌九游戏
+业主资料销售
+销售老人资料
+警用装备供应
+提供云南情蛊
+慢性毒药直销
+专卖三棱尖刺
+供应三棱尖刺
+办理假学生证
+提供黎城辣面
+艳照种子全套
+提供波推服务
+皇冠代理网址
+皇冠备选网址
+提供ghb水配方
+ghb水配方供应
+ghb水配方提供
+删除负面博客
+处理负面消息
+爪刀手刺购买
+爪刀手刺订购
+爪刀手刺供应
+供应爪刀手刺
+购买爪刀手刺
+提供爪刀手刺
+爪刀手刺提供
+销售爪刀手刺
+爪刀手刺销售
+订购爪刀手刺
+转让爪刀手刺
+买卖爪刀手刺
+爪刀手刺代理
+代理爪刀手刺
+爪刀手刺直销
+删除不利信息
+提供高仿证书
+办理学士学位
+提供国考答案
+在线赌钱游戏
+提供专科学历
+删除负面消息
+直销美秃套件
+转让美秃套件
+买卖美秃套件
+提供美秃套件
+慕郎百花羞
+小女花不弃
+琉璃美人煞
+艳欲十二宫
+风月艳留香
+枕上春残本
+别有香残本
+皇冠线上开户
+提供帮人复仇
+提供负面处理
+提供负面删除
+美女多多影院
+娇美的舅妈
+都市品香录
+豪门浪荡史
+迷乱的村庄
+西北大通炕
+驱妖女仆队
+家庭欲火全
+武林红杏传
+说了不再爱
+抱你在身边
+弄儿的后宫
+虚拟与现实
+人妻送友骑
+被女人玩弄
+姑姑和妈妈
+猎爱的男人
+为情字煎熬
+替人了事办人
+替人办事复仇
+代人办事复仇
+碧玉鸳鸯扣
+婚前120小时
+删除负面影响
+百乐彩全讯网
+高价收养女孩
+高价抱养婴儿
+直销手工猎刀
+妻诱之情趣
+企业负面清理
+负面贴文清理
+诽谤信息清理
+造谣信息清理
+负面评价清理
+诽谤帖子清理
+负面评价清除
+诽谤帖子清除
+清除诽谤帖子
+黎城辣面供应
+供应黎城辣面
+订购黎城辣面
+直销黎城辣面
+销售黎城辣面
+黎城辣面销售
+黎城辣面提供
+王民生不雅照
+私售销售气槍
+cp99配件提供qq
+楼房奇遇夜
+专卖人造脸皮
+网上现金开户
+扬州棋牌热线
+订购慢性毒药
+从青春走过
+不吃草的牛
+天下父母心
+月真的瘦了
+微微的微笑
+荒村大觉醒
+神医的克星
+淡淡柠檬草
+你的二我懂
+看上去很直
+妻子的付出
+十八岁猛汉
+院长办公室
+乱情马窝村
+禁恋深陷迷
+狂野逃离富
+最佳抵债妻
+妇产科医院
+大院春意浓
+失贞的都市
+大叔我爱你
+攀上女领导
+供应印花税漂
+三棱刮刀供应
+半圆刮刀直销
+提供半自动pcp
+供应警用电棒
+警用电棒供应
+业主信息供应
+车主信息供应
+供应业主信息
+供应等级证书
+专卖甲硝西泮
+直销甲硝西泮
+直销间苯三酚
+直销尼美西泮
+订购间苯三酚
+订购甲硝西泮
+供应尼美西泮
+供应甲硝西泮
+有偿收养小孩
+真钱娱乐平台
+制作高仿证书
+办理高仿证书
+真钱电子游戏
+现金电子游戏
+足球真钱投注
+艳照种子下载
+奥克托今供应
+二乙基汞供应
+供应无水哌嗪
+间苯三酚销售
+销售间苯三酚
+供五氧化二钒
+庐江门不雅照
+订购云南情蛊
+网上真钱娱乐
+供应四乙基锡
+销售学生数据
+销售学生资料
+提供学生数据
+提供学生资料
+供应速递数据
+销售速递数据
+足球现金开户
+供应学生数据
+提供仿真面皮
+提供易容面皮
+供应儿童数据
+车主名单销售
+专卖业主名单
+专卖车主资料
+提供业主信息
+监狱数据供应
+供应小孩数据
+供应学生资料
+预订野营猎刀
+买卖三棱尖刺
+转让三棱尖刺
+提供三棱尖刺
+三棱尖刺提供
+订购三棱尖刺
+三棱尖刺订购
+三棱尖刺直销
+直销三棱尖刺
+三棱尖刺买卖
+供应三棱毒刺
+专卖三棱毒刺
+皇冠在线娱乐
+维加斯娱乐场
+皇冠备用网址
+人妻四部曲
+生命的奔流
+杨野的禁脔
+吸血三姐妹
+校长办公室
+泷泽罗拉种子
+虚假负面删除
+乐天堂现金网
+下载日韩色片
+888真人娱乐场
+负面消息清除
+负面消息清理
+提供储户信息
+提供考生信息
+高仿学位办理
+直销快开工具
+快开工具销售
+供应烟花爆竹
+删除诽谤帖子
+消除诽谤信息
+真钱娱乐游戏
+删除新闻评论
+删除帖子信息
+删除造谣信息
+清除诽谤信息
+供应丙二酸鉈
+丙二酸鉈供应
+地芬诺酯提供
+地匹哌酮提供
+提供已甲噻丁
+提供依托利定
+提供依托尼秦
+订购甲地索啡
+订购非诺啡烷
+非诺啡烷订购
+提供吗苯丁酯
+已环利定提供
+提供尼可待因
+左美沙芬提供
+美他佐辛提供
+提供地美沙朵
+提供二甲噻丁
+户主资料供应
+夜色撩人社区
+销售苯哌利定
+销售甲地索啡
+销售诺美沙朵
+销售诺匹哌酮
+销售非诺啡烷
+销售匹米诺定
+销售丙哌利定
+销售瑞芬太尼
+销售舒芬太尼
+销售醋氢可酮
+销售三甲利定
+销售右丙氧芬
+销售尼可待因
+销售福尔可定
+销售已环利定
+销售贝齐米特
+销售阿法罗定
+销售阿尼利定
+销售可多克辛
+销售右吗拉胺
+销售地恩丙胺
+销售二已噻丁
+销售地芬诺辛
+销售地美沙朵
+销售二甲噻丁
+销售吗苯丁酯
+销售地芬诺酯
+销售地匹哌酮
+销售已甲噻丁
+销售依托利定
+销售依托尼秦
+销售异美沙酮
+销售左美沙芬
+销售美他佐辛
+销售阿芬太尼
+销售醋美沙朵
+二乙基汞销售
+四氧化锇提供
+提供四氧化锇
+四氧化锇销售
+销售四氧化锇
+李宗瑞照片门
+四氧化锇直销
+直销四氧化锇
+供应野营猎刀
+直销安乐死药
+慢性毒药专卖
+李宗瑞完整版
+供应慢性毒药
+直销黄曲霉素
+供应黄曲霉素
+直销慢性毒药
+供应绿皮瓦管
+转让绿皮瓦管
+供应绿瓦瓦管
+销售绿皮瓦管
+日韩色片地址
+帮人解决纠纷
+蝴蝶谷色色网
+蝴蝶谷中文网
+幼幼之家论坛
+四氧化锇供应
+直销硝甲西泮
+直销警用肩章
+直销警用棍刀
+直销警用器材
+直销警用钢叉
+订购绿皮瓦管
+直销绿皮瓦管
+绿皮瓦管专卖
+转让二手猎刀
+庐江照片全集
+警衔专卖电话
+警衔销售电话
+办理认证证书
+办理认证学位
+大东方娱乐城
+战术直刀销售
+专卖战术直刀
+在线体育投注
+手机现金下注
+现金真人游戏
+官员宾馆艳照
+办理六级证书
+供应战术直刀
+尊尚会娱乐城
+大赢家娱乐城
+庐江高清艳照
+庐江不县雅照
+办理假残疾证
+供应四氧化锇
+车主名单供应
+真钱棋牌导航
+业主名单专卖
+业主名单销售
+供应警械装备
+业主名单供应
+网络皇家赌城
+帮人寻仇出气
+季戊四醇销售
+季戊四醇合成
+提供保险数据
+学历证书买卖
+买卖职称证书
+销售有机溶剂
+在线真人娱乐
+删除诽谤信息
+负面论坛删除
+真钱骰宝娱乐
+专业删除论坛
+速删负面消息
+在线赌钱网站
+最新天然素人
+股民名录销售
+供应股民名录
+股民名录供应
+专卖股民名录
+股民名录专卖
+股民名录提供
+提供股民名录
+供应警用器材
+提供女性数据
+高价收养小孩
+最新色站地址
+提供业主名单
+清扫负面消息
+高偿收养婴儿
+高偿收养儿童
+专卖雅思答案
+供应业主资料
+线上现金下注
+资格证书制作
+职称证书制作
+专卖警用装备
+办理职称证书
+论坛负面删除
+博客负面删除
+微博负面删除
+直销警用装备
+职业替人寻仇
+论坛负面清除
+提供讨债服务
+专卖顺风面单
+销售股民数据
+老人数据提供
+洪爷论坛地址
+性吧最新网址
+品色最新地址
+网购数据销售
+网购数据提供
+网购数据供应
+麦角新碱销售
+提供打鸟木仓
+同乐城娱乐城
+乐天堂娱乐城
+八大胜娱乐城
+房主数据买卖
+找人毁容电话
+找人消灾电话
+网络现金赌钱
+了仇了事电话
+自制爆竹电话
+车主资料销售
+警用肩章销售
+供应军警装备
+销售警用肩章
+销售甲硝西泮
+销售尼美西泮
+永利高投注网
+专业删除信息
+删除信息服务
+清除网上信息
+警用棍刀销售
+供应警用棍刀
+销售警用棍刀
+提供警用棍刀
+在线真钱平台
+车主资料供应
+提供顺丰面单
+提供中考答案
+提供吡咯戊酮
+槍支订购热线
+硝甲西泮提供
+硝甲西泮专卖
+硝甲西泮销售
+专卖硝甲西泮
+提供硝甲西泮
+手槍子彈专卖
+2012答案预售QQ
+手把手教做tnt
+2012考生资料QQ
+现金游戏平台
+鸡婆服务信息
+供应网购数据
+销售网购数据
+提供电购资料
+供应电购资料
+销售物流数据
+供应物流数据
+提供物流数据
+销售电购资料
+提供业主名录
+百乐门娱乐城
+网上现金游戏
+最新车主资料
+最新強檔合輯
+开心四房色播
+帮人复仇电话
+供应警用装备
+投注平台出租
+学生家长名单
+烟雾弹的配方
+银行客户数据
+拍拍用户数据
+军官档案数据
+帮人灭口电话
+淘宝卖家数据
+保险用户数据
+社保用户数据
+医保用户数据
+警务文职档案
+全国车主信息
+全国富豪资料
+外汇客户资料
+期货客户资料
+一手车主资料
+一手车主信息
+最纯的钻石冰
+提供大斩马刀
+打造单槽苗刀
+专业定制马刀
+转让中号棍刀
+国模私拍套图
+皇冠网址大全
+供应老人数据
+洋妞特服上门
+限量版打死跌
+销售高纯度冰
+业主资料供应
+提供老人数据
+提供制毒工具
+销售申通面单
+提供申通面单
+色站在线观看
+盘锦办理証件
+学位英语答案
+北京警灯专卖
+进口原装美秃
+转让进口MP-661
+供应犯人名录
+土冰制作方法
+办假军警官证
+提供开户信息
+销售信丰面单
+最新业主信息
+银行储户信息
+各式警用常服
+色片在线地址
+办理建造师证
+爱逼爱操影院
+提供幼儿信息
+小姐全套服务
+提供老板资料
+提供车主信息
+提供车主电话
+上门陪睡电话
+军工配件组装
+女子车内意外
+出卖业主资料
+供应女性数据
+销售女性数据
+供应户主资料
+提供婴儿数据
+警用电棒专卖
+烟花爆竹专营
+夫妻成长日记
+我和我的女人
+销售监狱数据
+供应监狱数据
+提供监狱数据
+提供犯人数据
+供应犯人数据
+销售犯人数据
+职业帮忙复仇
+专业帮忙复仇
+办理假资格证
+办理假等级证
+办理假军官证
+高纯度冰订购
+上门陪睡服务
+黄金城娱乐场
+二代锡纸工具
+代删负面贴子
+销售车主资料
+销售车主名单
+销售业主名单
+供应车主资源
+供应车主名单
+供应业主名单
+供应车主资料
+提供股民数据
+供應假人民幣
+网络公关删贴
+假人民幣銷售
+銷售假人民幣
+夜店兼职女郎
+真钱龙虎游戏
+供应股民数据
+提供收藏数据
+一手老人数据
+小姐全套信息
+办英语六级证
+办律师执业证
+手机变号平台
+供应三棱刮刀
+供应半圆刮刀
+办理假户口办
+烟花爆竹电话
+同性恋俱乐部
+性吧最新地址
+大母牛综合网
+金卡会员资料
+设定任意号码
+皇冠在线投注
+网上真钱骰宝
+迷失少女天堂
+最新业主名录
+全国车主资料
+金领白领数据
+真人二十一点
+犯罪替人说情
+同志拉拉服务
+财务代理公司
+财税有限公司
+办理统考证书
+小姐保健上门
+第四色男人网
+警用手电专卖
+辦理本科文憑
+制作假警官证
+专业删贴服务
+办理假户口本
+办理假结婚证
+办理假房产证
+精品直刀系列
+办理国外证书
+在线现金娱乐
+号码随意显示
+提供胸推服务
+仿真槍模专营
+买卖雙管獵槍
+专业帮人复仇
+供应仿真槍模
+供应虎頭獵槍
+供应禿鷹汽槍
+銷售虎頭獵槍
+銷售仿真槍模
+銷售禿鷹汽槍
+提供禿鷹汽槍
+提供虎頭獵槍
+供應虎頭獵槍
+提供仿真槍模
+供應禿鷹汽槍
+供應仿真槍模
+销售仿真槍模
+销售虎頭獵槍
+销售禿鷹汽槍
+定做人造脸皮
+销售硅胶面皮
+销售易容面皮
+销售易容脸皮
+销售仿真脸皮
+销售高仿脸皮
+销售人造脸皮
+定做人造面皮
+销售硅胶脸皮
+销售人造面皮
+专业幫人清债
+专业幫人杀人
+销售高仿面皮
+指定号码改号
+指定号码变号
+任意号码变号
+代购手機間諜
+手機監聽軟件
+潛伏者免費版
+007間諜改良版
+007間諜專業版
+手機竊聽軟件
+007间谍增强版
+007间谍改良版
+007间谍专业版
+销售溫切斯特
+供应溫切斯特
+提供溫切斯特
+溫切斯特到货
+溫切斯特出货
+溫切斯特订购
+溫切斯特电话
+找人辦事毀容
+专业地下警隊
+专业解決情敵
+专业解决小三
+专业解决情敌
+专业地下警队
+仿真气槍销售
+制造特殊死亡
+找人办事毁容
+手工刀奴专卖
+野營軍刀专卖
+手工獵刀专卖
+野營手斧专卖
+M9-D80軍刀专卖
+制式軍刀专卖
+三棱軍刺专卖
+办理假身份證
+办理真身份證
+代制假身份證
+卖假冒身份證
+卖真实身份證
+专卖进口气槍
+销售进口气槍
+进口气槍销售
+制造意外死亡
+制造意外消失
+帮人处理恩怨
+替人处理恩怨
+幫人處理恩怨
+替人處理恩怨
+专业找人辦事
+间苯三酚配方
+間苯三酚配方
+冰鉆石石配方
+冰磚送货上门
+間苯三酚出货
+間苯三酚订购
+间苯三酚订购
+间苯三酚出货
+卖摇头糖手机
+卖麻黃素手机
+卖神仙糖手机
+卖钻石冰手机
+卖小冰磚手机
+卖冰鉆石手机
+卖搖頭糖手机
+卖白牙簽手机
+卖黃體酮手机
+卖大冰磚手机
+卖钻石冰电话
+卖鉆石冰手机
+卖摇头糖电话
+卖神仙糖电话
+卖麥角酸手机
+卖黃牙簽手机
+卖搖頭糖电话
+卖冰鉆石电话
+卖小冰磚电话
+卖白牙簽电话
+卖黃牙簽电话
+卖麻黃素电话
+卖麥角酸电话
+卖鉆石冰电话
+間苯三酚到货
+间苯三酚到货
+手槍子彈電話
+訂購步槍子彈
+電話獵槍子彈
+訂購手槍子彈
+電話步槍子彈
+性吧春暖花开
+供应間苯三酚
+間苯三酚销售
+供应间苯三酚
+銷售间苯三酚
+2005语录排行榜
+大学生0604运动
+ chengrenliaotianshi
+招呸k理國外文
+1074套豪华住宅
+ PowertotheFalunGong
+奥运爱国t恤衫
+讲事实 要说法
+九·十·三运动
+动画-小羊肖恩
+ datasupermarket.com
+ green-furniture.com
+ hair-transpl.com.tw
+ selectthinktank.net
+ starstudying.com.cn
+ libertytimes.com.tw
+N乙烯基氮丙环
+2硝基邻甲酚钠
+E世博线上娱乐
+爱搞逼综合X网
+ewin娱乐城开户
+有卖慢性毒药q
+办理c1驾驶本qq
+fx季候风销售qq
+cp100配件订购qq
+李宗瑞275g下载
+李宗瑞275g全套
+俄罗斯654k提供
+蒋大彬群P种子
+庐江县艳照群P
+petn的制作过程
+提供美女luoliao
+銀行卡復制器
+溫切斯特1000Xqq
+卖假1代身份證
+卖1代假身份證
+卖2代假身份證
+卖假2代身份證
+卖真2代身份證
+卖真1代身份證
+high粉送货上门
+内地核试19万人
+中石油48元之颠
+ picnicatjarlungriver
+ tearsthatflowinchina
+04式第六代军牌
+10种肮脏的职业
+60周年策划袭击
+毛伟人主政41年
+中24刀后被炸飞
+ JucelinoNobregadaLuz
+qq幸運用戶抽獎
+加盖机密××××
+12项吉尼斯排名
+ powerleveling888.com
+ st1-fx.com
+ urban-planning.co.jp
+prada酷妃不好惹
+snowxefd作品合集
+24二异酸甲苯酯
+N-乙烯基氮丙环
+24二硝基邻甲酚
+2丙炔1醇炔丙醇
+34二甲基氮杂苯
+庚烯2双羟甲基5
+环3亚甲基4硝胺
+环4亚甲基4硝胺
+季戊4醇4硝酸酯
+3硝基间苯2酚铅
+GeekCook淘宝门市
+qq賣健衛小口徑
+制造车祸残废qq
+负面报道删除qq
+删除百度信息qq
+转让99式伞兵刀
+转让65式伞兵刀
+仁科百华bt种子
+有偿骨髓中介qq
+黄曲毒霉素售qq
+冲田杏梨bt种子
+删除帖吧负面QQ
+专业删除帖吧QQ
+假资格证办理qq
+qq假资格证制作
+qq假资格证办理
+供应高仿警帽QQ
+删除天涯论坛qq
+有偿收养男宝qq
+有偿收养女宝qq
+有偿收养男童QQ
+银行客户资料qq
+娱乐城注册送38
+高仿学历qq办理
+qq直销阻击步狗
+qq专卖假军官证
+专卖假军官证qq
+制作假军官证qq
+qq考生数据供应
+qq业主名录供应
+qq提供客户资料
+QQ供应购物数据
+QQ购物数据供应
+qq婴儿数据专卖
+负面贴吧清除qq
+删除贴吧帖子qq
+英语考级证书qq
+办假营业执照qq
+王梦溪108gb种子
+qq老人资料供应
+qq股民数据供应
+qq业主资源供应
+qq老人数据专卖
+qq女性数据专卖
+qq男性数据专卖
+客户数据专卖qq
+qq警用肩章供应
+qq假户口本专卖
+qq假户口本办理
+qq阿普唑仑销售
+老人数据专卖qq
+女性数据专卖qq
+男性数据专卖qq
+老人资料供应qq
+qq供应男性数据
+qq快递数据供应
+qq物流数据专卖
+qq学生数据供应
+供应考生数据qq
+qq提供业主资料
+qq供应考生资料
+qq提供车主资料
+办理留学学历qq
+假行驶证办理qq
+买卖阿普唑仑qq
+qq销售客户资料
+销售客户资料qq
+供应阿普唑仑qq
+女性数据提供qq
+qq提供安乐死药
+qq供应收藏数据
+qq供应阿普唑仑
+代人解决恩怨qq
+删除负面微博qq
+qq提供车主资源
+负面消息处理qq
+qq假行驶证办理
+业主资源供应qq
+QQ供应面单数据
+婴儿数据专卖qq
+考生数据供应qq
+提供客户资料qq
+业主名录供应qq
+购物数据供应QQ
+供应购物数据QQ
+提供购物数据QQ
+qq销售车主信息
+删除负面报道qq
+替人解决恩怨qq
+专业解决恩怨qq
+虚假信息快删qq
+供应收藏数据QQ
+办理学位学历qq
+云南情蛊供应qq
+云南情蛊直销qq
+有偿抱养男婴qq
+有偿抱养女婴qq
+有偿抱养婴儿qq
+qq订购警用电棒
+提供车主资源qq
+提供速递数据qq
+提供户主资料qq
+qq销售等级证书
+警用电棒销售qq
+提供面单数据qq
+提供考生数据qq
+物流数据供应qq
+供应礼品数据qq
+供应减肥数据qq
+车主信息销售qq
+销售房主数据qq
+老板资料销售qq
+qq销售快递面单
+销售假资格证qq
+销售购物数据qq
+qq销售股民名录
+销售警用标志qq
+销售客户数据qq
+半圆刮刀销售qq
+销售警用器材qq
+销售苯基甲酮qq
+qq车主信息销售
+销售进口迷烟qq
+销售等级证书qq
+qq提供尼美西泮
+提供尼美西泮qq
+qq提供快开工具
+清理诽谤帖子qq
+qq万能强开供应
+提供假健康证qq
+qq提供车主名单
+删除网上信息qq
+删除网上帖子qq
+买安乐死药物qq
+供应保险数据qq
+销售国考答案qq
+提供中握套件qq
+高价收养婴儿qq
+ghb水配方专卖qq
+专卖尼美西泮qq
+qq专卖尼美西泮
+qq提供正规真票
+提供正规真票qq
+提供博士学历qq
+警用电棒买卖qq
+删除博客帖子qq
+校园4p的记忆
+提供业主资料qq
+下载av影片地址
+qq提供慢性毒药
+qq销售慢性毒药
+销售车主信息qq
+半圆刮刀供应QQ
+论坛帖子清理qq
+供应麦司卡林qq
+qq制作假军官证
+有偿认养孤儿qq
+av电影种子下载
+解决私人恩怨QQ
+庐江6P打包下载
+日本最新av电影
+提供论坛删贴QQ
+三棱刮刀买卖QQ
+删除负面评价QQ
+销售麦司卡林qq
+制造意外收费qq
+安乐死药直销qq
+办理专八证书QQ
+提供安乐药物QQ
+提供考生资料QQ
+销售业主数据QQ
+昆明6p快播照片
+王民生6p门下载
+清除企业负面qq
+官员宾馆5P照片
+专业删除新闻QQ
+删除负面公司QQ
+清除企业负面QQ
+警用常服供应qq
+销售股民名录qq
+警用装备专卖qq
+购买真实学历QQ
+办理国外学位QQ
+办理国外学历QQ
+删除论坛帖子qq
+删除百度快照QQ
+制作假资格证qq
+订购警用钱包QQ
+小区业主信息QQ
+小妹24小时服务
+提供网购数据qq
+防身警用电棒QQ
+网络信息删除QQ
+提供网购数据QQ
+兼职白领上门QQ
+供应车主信息QQ
+销售少儿数据QQ
+供应少儿数据QQ
+提供少儿数据QQ
+烟花送货上门QQ
+爆竹送货上门QQ
+flexispy官方网站
+xwodi软件版下载
+xwodi软件官方网
+办理会计师证QQ
+日本援助小姐QQ
+金融客户资源QQ
+小姐包吹包做QQ
+提供硅胶面皮QQ
+提供高仿面皮QQ
+手槍子彈訂購qq
+步槍子彈訂購qq
+獵槍子彈訂購qq
+QQ销售間苯三酚
+QQ订购間苯三酚
+卖鹽酸羥亞胺QQ
+卖左旋麻黃素QQ
+养殖户的求救书
+学姐和我的故事
+从圣地寻求财富
+确保北京的水利
+金鳞岂是池中物
+卫星遭黑客攻击
+急聘兼职打字员
+千术赌术大揭秘
+欲与霆锋试比高
+阿娇不以陈卑鄙
+龚宇拿著银白色
+录像厅陪看小姐
+两腿一夹几百块
+宁波姑娘最放肆
+悟净的层次最低
+中山领导流浪汉
+法官把法律搞乱
+领导干部吃王八
+警车不再乱鸣笛
+抢劫警车是违法
+小蜜像中国移动
+不办案子只开会
+人民还当牛做马
+职务消费是个筐
+复议就是找上级
+电信我们是亏损
+官商警匪多勾结
+归牛花满俯卧撑
+拉出小姐干一干
+最绿的一届政府
+政府也能设赌局
+开会没有不隆重
+愚弄百姓的旧招
+工资好比眉毛短
+中国最令人恶心
+官员们加官进爵
+领导小姐你先摸
+辽东铁骑带笑意
+罚得刁民见阎王
+见到局长不收费
+血泪工厂工人苦
+政府签单给废了
+教师阳光工资版
+成语解释的纠正
+党的宗旨成空谈
+身边官员难见廉
+公仆工资涨得快
+自古未闻屎有税
+小姐代表发个言
+水晶棺里的遗容
+天下恶官应丧魂
+新衙只对百姓狂
+太祖高皇帝本纪
+废话议案排行榜
+我抓台谍好助选
+起步就能喝一斤
+两个高院挺清闲
+不讲真话身不明
+外星人来看奥运
+如此艰难的一年
+开幕式方案曝光
+没房没车谁嫁你
+横批就是不会射
+三千万人齐下岗
+孙悟空之混沌道
+美国是棵卷心菜
+三国首脑去打猎
+老胡说他不干了
+怎么面对魏键行
+中山頸導流浪漢
+澤民頸導貪污犯
+要不变成李莲英
+思鍃思權思小蜜
+思钱思权思小蜜
+党和人民对立了
+等不到翻译回来
+大人吃奶是零食
+喂奶群众都看见
+机关干部四大傻
+理直气壮正党风
+少奇为了包装毛
+白崇禧不仁不义
+布什向胡哥借钱
+领导的小蜜我们
+小秘书左右领导
+莫友比择更筒裤
+畏首畏尾保乌纱
+歌女也把将星扛
+满城争说宋小娘
+中国又卒于中国
+陕西绵羊吃老人
+牢头牢霸打死你
+才打赢官司遭报
+初级阶段过不完
+工作肯定在法院
+真主上帝试比高
+让领导秘密舒服
+三不反对执政党
+唯独中国急推广
+电珠丝发热引燃
+沟里提炼食用油
+在线代理服务器
+中国男足有多愁
+使猪的皮红毛亮
+十本最有害的书
+旗帜网已经被封
+为绿坝找的台阶
+黑客眼里的隐私
+惊现甲骨文作文
+不如三鹿结石好
+把责任推给奶农
+送礼就送三鹿奶
+冲袋奶粉给党喝
+男足指定专用奶
+三聚加强版奶粉
+帮毒奶事件解围
+放多了点蛋白精
+桔子出现寄生虫
+许晴和老公内幕
+河北书坛的怪相
+宇独霸河北书坛
+奶牛们产奶不当
+这些食品你吃过
+全聚德和中石油
+脸红的国人智慧
+敢吃中國大閘蟹
+不要买太仓肉松
+水果是人为造毒
+中国足球弊端重
+大清邮政局被拆
+邮政局未批先拆
+妛克勞核反應堆
+奥克劳核反应堆
+新疆天空现天眼
+维族与汉族冲突
+边痛斥假药危害
+招揽大批新疆人
+维族人两少一宽
+记者无疆界组织
+外交给缅甸压力
+华人正遭受战火
+罢教运动倡议书
+套牢让人心憔悴
+股民死绝都活该
+为解套拼命补仓
+股评惑众贾机灵
+被套总比祸国强
+到石化吃苦受累
+连连下跌至跌停
+向石化大哥问好
+五指山股份给套
+代问茅台老弟好
+股民的血色悲歌
+追涨买后变熊样
+股改成了穷光蛋
+深度套牢两年半
+破了太保破石油
+已是股市百丈冰
+设赌与沪深二市
+埋在证券大厅旁
+股票未见油已荒
+中石油家内豢养
+中国股市的悲哀
+踩在股民的头上
+沉迷与股海之中
+布达拉宫的回声
+致敬仁波切上师
+加伦河畔的野餐
+仁波切上师西行
+宇宙空间全黑暗
+寂莫网上寻聊友
+夫妻性教育电影
+美女大秀钢管舞
+舔屁沟我很激动
+春情泛滥办公室
+给成年人士观看
+吞下带血卫生巾
+地下金屬探測器
+推广小助手发送
+考试百分百通过
+成绩单网上可查
+一手操作带试卷
+ cuiaingyaoblogspotcom
+快速办理专本科
+包高分一次通过
+龙虎保单预测仪
+查看密码的软件
+遥控车牌遮挡器
+售胜利之日脚本
+院校点招带军籍
+ tk787680010blog163com
+那块石头上的字
+公务员十大丑陋
+周恩來清譽背後
+人类灭亡时间表
+国家道德的缺失
+年代大饥荒纪实
+吉首非法集资案
+祖英有一张红卡
+我国法律太软弱
+低素质国民进城
+谈特岗教师工资
+中国现状之问答
+法官黄松有被抓
+出租车停运事件
+党性污染者除外
+司法不公有冤案
+封堵省政府大门
+玩具厂冲突事件
+纸上国法靠不牢
+爱国版吉祥三宝
+解放军静得可怕
+上骟省委党中央
+收费只收燃油税
+教师仍囊中羞涩
+八佰伴劳资纠纷
+取消农村户籍让
+毛润之本是天上
+酒后开警车肇事
+别玩你的子民了
+知譺分子劉曉波
+中领馆前烧毛像
+医药代表万建国
+副大队长熊玉儿
+再富不能富教育
+钱造假新闻吓唬
+日本的惊人秘密
+燃油税如此开征
+剑桥演讲被扔鞋
+莫道穷乡出暴民
+获知毛家祖先坟
+在中国叫爱国者
+银行是弱势群体
+我引台资入国库
+赼得嚴城暫住身
+赢得严城暂住身
+耀邦保护免获咎
+贪出了科学依据
+左某持刀杀人后
+参观美军基地后
+日軍對中國媎女
+反恐演练的内幕
+跨省抓发帖网民
+中国是毛盾社会
+鲁德成和喻东岳
+遇难学生总名单
+让领导同志先走
+谴责无德海贝尔
+美伊战争小学版
+劫后天府泪纵横
+自己去舔掉辣椒
+八星级办公大楼
+爆发的真正内幕
+今年猪是疯狂的
+美帝有施毒嫌疑
+领头低俗是官衙
+中国洗脚妹之歌
+爱国文化衫运动
+贴能惊动党中央
+邓贵大最后的话
+毛是最大的凶神
+声明划清的化名
+质问衡水组织部
+石首某领导参股
+做人不能太高也
+七十年後的劫难
+抹去印记度劫难
+郑州当政非秦桧
+港女寃歷乲不低
+年收入赶超微软
+摇其夫语猥亵事
+绿坝子和谐天下
+被绿坝识破动机
+境外邑指挥煽动
+魏元志双腿粉碎
+同方子公司涉嫌
+汽油降价不和谐
+载人都是一二人
+血流成河尸骨山
+总理夫人做生意
+再穷也得过圣诞
+中央是谁的中央
+家宝听了很烦恼
+做中国人的孩子
+中国请为我哭泣
+金正日通电六方
+百姓怕的医疗费
+为了排名告网大
+商业殖民统治者
+背后的巨大丑闻
+教师的友邦人士
+汗颜的世界第一
+苏黎世力挺宝钢
+总参技术侦察部
+大涨的真正原因
+谴责中国红十字
+便于言说的纪念
+不见亚洲的门槛
+开幕式惊现祼体
+中国人太不争气
+昧着良心的中国
+为藏语打抱不平
+愚昧的藏族学生
+世人纷说杨家子
+无耻的十大企业
+买遗体顶包火化
+哈尔滨糖果酒吧
+特大搶劫殺人案
+民众将警车掀翻
+中国的奇怪现象
+肖德松立即下课
+车牌照为琼a10815
+出警时带走吴俊
+漂流者抛尸黄河
+游锡堃可以信赖
+把我当作了苹果
+另眼看蒙古元朝
+同僚会场被带走
+无耻的公共知识
+湾最不友善国家
+思想界混乱得很
+神话诠释的社会
+神話詮釋的社會
+神话会走向文学
+经济以毁灭教育
+衰败跟文化水准
+工程交给小日本
+我是九号来天国
+建设时期大汗流
+美国真正的可怕
+美国的朝气宽容
+学生是怎样被傻
+朱閒基答记者问
+联络不上圣胡安
+接警员工作中玩
+九州婴幼泪痕新
+钦州港宅地侵权
+最牛的村镇干部
+杨佳姨妈王静荣
+张锐因吸毒被捕
+杨佳的青春档案
+丘家厉一直上告
+偶有奇侠怒涨冠
+杨师群被学生告
+潘建钗涉嫌行贿
+落水者是公务员
+毛伟人奇在哪里
+所谓的政府部门
+都不想回归中国
+前谍报官李凤智
+十年不屈的历程
+北京车牌大检阅
+造中国人民的反
+中国第一女保镖
+过河卒抱成一团
+担忧的不是黑恶
+派出所所长被打
+明娟以车震生活
+主播家中好丈夫
+年月褃转化为力
+总理夫人张培莉
+彭启荣和蔡发春
+没有就参军去吧
+打工和尚是高薪
+守望教会告会众
+中美打响贸易战
+捣蛋的教育部长
+最好的职业公污
+南方周末开天窗
+教会是被政府查
+领袖杨荣丽祷告
+上告教委整死你
+摊贩名叫刘建平
+得意狂夫万虑抛
+碾压阻挡的百姓
+不知悔改的韩寒
+两年逍遥官不问
+兵最少交人民币
+生征女兵的经历
+打劫得到的政府
+冉工继续开启民
+外衣下被私有化
+中国式引咎辞职
+民刊在中国的意
+中国盲动的民族
+教学生如何爱国
+寄生虫似的小镇
+山是京城的厕所
+普洛米修士受难
+谷歌不能离开中
+“震撼中”文件
+北大三角地论坛
+促红细胞生成素
+蛋白合成类固醇
+芳香型智悟气功
+广东饶平钱东镇
+褐铁矿选矿设备
+后方想定的编写
+华硕双核笔记本
+跨世纪的良心犯
+领导层预备人选
+马来酸迷达唑仑
+乔波室内滑雪馆
+神州电影制片厂
+省政府大门集合
+寻找林昭的灵魂
+中国社会进步党
+中华养生益智功
+中南海浓云密布
+建立生活性补贴
+风情万种野玫瑰
+广源橘子长桔蛆
+国防部长:曹操
+教育部长:孔子
+卫生部长:华佗
+箱子包子做肉馅
+杨白劳来电话问
+杨子荣来电话问
+高清晰未删节版
+中国承认影视网
+《圣经启示录》
+奥运会徽车祸版
+慈禧的秘密生活
+滅門慘案之孽殺
+南通儿童福利院
+三反五反杀地主
+三剑侠与飞机妹
+生人勿近之邪花
+私下肮脏的交易
+我的女友是二嫂
+无线影音发射器
+性工作者十日谈
+中国古代性戏观
+中南海波澜起伏
+中南海权力斗争
+ shijixinxiu.bokee.com
+ wow-powerleveling.org
+第三次世界大战
+网络推广扩散器
+中华养生益智气
+手机开机密码破
+网络工程师答案
+ 1 3 7 3 6 0 3 9 9 3 9
+小说免费下载
+高档二手车销售
+七匹狼官方网站
+周大福官方网站
+周生生官方网站
+前列腺无痛人流
+深圳市格美空调
+深圳伊卡鲁斯微
+招聘兼职发帖员
+大面积心肌梗死
+热水器专业拆装
+爱上花心公子哥
+被缚的千面女王
+冰人幽灵神无心
+不要再来招惹我
+出牆王妃拐相公
+穿越之极品公主
+穿越之纨绔少爷
+大家东去狼涛尽
+氣動鋼珠槍購買
+買賣老虎頭獵槍
+鹽酸羟亞胺合成
+gps车辆监控系统
+甲基苄基亚硝胺
+462硝基邻甲苯酚
+二硝基邻甲酚钠
+甲基乙烯基甲酮
+羟基马桑毒内酯
+翻转汽车牌照架
+六级真题及答案
+智能车牌遮挡器
+汽车翻转牌照架
+邪掳极品小胖妞
+公务员考生信息
+天生我材必有用
+都市狂龙爱无边
+都市全异能大师
+感慨美国不一样
+广东亚运会事件
+何处金屋可藏娇
+狐王殿下别乱摸
+花香袭人春月塘
+坏坏老公别吃我
+混迹在嘉庆初年
+极品美女在身边
+家有妖男小小受
+艰难的接种经历
+江山美人逐鹿记
+姐姐嫁给我好吗
+惊恐天使档案簿
+克里斯蒂安战记
+酷总裁的妖娆妻
+怜花寻芳美人娇
+恋上董事长夫人
+凌家有女初为妾
+刘亦菲母女逢春
+美女妖怪别吃我
+美女主持赖上我
+梦想之天下女人
+魔女天娇美人志
+木里求丝称雄记
+溺宠爱妾好难缠
+女大学生宿舍506
+日本女学生图片
+倾城惑国女太监
+人生何处不多情
+三国牛人附身记
+色女的无情无爱
+色色母女闹古代
+射雕之杨康列传
+身侍六帝宠不衰
+神仙都在兜里揣
+谁看了她的屁屁
+谁占了她的身体
+桃花依旧笑春风
+替身王妃不承欢
+天煞孤星风云录
+天生我才必有用
+天使不眠的都市
+同学的可爱女友
+王者之佣兵天下
+网游之无限连击
+我的老婆是警花
+我的梦想在燃烧
+我和我妹妹雯雯
+我家相公是情兽
+仙人俗世生活录
+现代版三妻四妾
+现代情侠录泥男
+乡下的爱情故事
+小姐相公赖定你
+艳修之天地不容
+妖龙下蛋给你孵
+一个领主的养成
+一个太监闯内宫
+异界之三宫六院
+异世之封印人生
+英雄难过美人关
+月色下的上海滩
+这些年哋那些事
+至尊爱妃别太坏
+重生之极品妖孽
+重生之升官发财
+重生之仕途风云
+重生之逍遥至尊
+重生之妖孽人生
+总裁的二手新娘
+总裁爹地酷妈咪
+射进女儿的子宫
+放荡中的灵与肉
+修真之我是神偷
+我的姐姐是美女
+养个儿子做丈夫
+宠妃本王要定你
+恒亿佳免漆装饰
+三国美人一锅煮
+下岗工人长恨歌
+战国杂家吕不韦
+春暖花开电影网
+利高在线娱乐城
+皇冠备用投注网
+技术等级证办理
+办理假会计师证
+供应卡片折叠刀
+掘金者打水软件
+金皇国际娱乐城
+加勒比解禁中出
+尼姑庵的男保安
+麻仓优全集下载
+我的妈妈李彤彤
+魅惑波多野结衣
+万能变号王下载
+狠狠撸在线影院
+爱爱很爽很销魂
+女体拷问研究所
+帝宝娱乐城开户
+顶丰国际娱乐城
+鼎龙国际娱乐城
+澳门新世纪娱乐
+丰禾国际娱乐城
+永发国际娱乐城
+千亿国际娱乐城
+金界国际娱乐城
+金钻国际娱乐城
+铁杆国际娱乐城
+天猫国际娱乐城
+长江国际娱乐城
+宝马会线上娱乐
+华夏国际娱乐城
+假日国际娱乐城
+金牌娱乐城官网
+娱乐城注册送金
+澳门金沙娱乐城
+鸿博网络娱乐城
+麦角乙二胺订购
+皇室国际娱乐城
+麦角乙二胺供应
+万豪国际娱乐城
+金龙国际娱乐城
+新葡京娱乐在线
+皇冠线上娱乐场
+大富豪国际娱乐
+百乐门线上娱乐
+供应甲基本丙胺
+供应贝尔求生刀
+大发真钱娱乐城
+新时代娱乐城网
+888真人在线游戏
+豪门国际娱乐城
+二代证制作软件
+二代证生成软件
+老年人数据供应
+礼花弹厂家直销
+提供尼蒙尔克素
+直销尼蒙尔克素
+专卖尼蒙尔克素
+供应氨基氮杂苯
+销售听话喷雾水
+听话喷雾水销售
+买卖高仿等级证
+收藏品数据提供
+老年人资料提供
+专卖高仿四级证
+供应老年人数据
+保健品数据专卖
+易发国际现金网
+订购拍肩听话粉
+拍肩听话粉买卖
+拍肩听话粉专卖
+销售拍肩听话粉
+云南情蛊药供应
+云南情蛊药订购
+云南情蛊药直销
+云南情蛊药销售
+云南情蛊药购买
+云南情蛊药提供
+色站广告位销售
+保健品数据供应
+收藏品数据直销
+收藏品数据供应
+提供保健品数据
+销售收藏品数据
+销售老年人资料
+老年人资料销售
+销售从业资格证
+销售保险人数据
+销售pcp新贵配件
+pcp新贵配件销售
+供应研究生学历
+制作高仿户口本
+提供假体检证明
+买卖安乐死药物
+办理高仿户口本
+甲基笨丙胺销售
+提供安乐死毒药
+供应野外求生刀
+销售高仿警官证
+销售高仿军官证
+办理高仿军官证
+办理英语等级证
+制作高仿军官证
+有偿收养女宝宝
+高价收养男婴儿
+办理仿真户口本
+提供研究生学历
+楼凤上门剁饼子
+拍肩粉货到付款
+拍肩粉送货上门
+pcp新贵配件直销
+pcp新贵配件预定
+直销pcp新贵配件
+宋朝完美生活
+庶女攻略完结
+女总裁爱上我
+欢喜浪史在线
+都市风月奇谭
+办公室的沙发
+鹿鼎记性事传
+被遗忘的宝贝
+穿越没有理由
+清宫情空净空
+穿越与反穿越
+绣榻野史全集
+订购pcp新贵配件
+百乐门线上游戏
+办理职业资格证
+性吧地址发布器
+李宗瑞全集种子
+李宗瑞照片种子
+四氢吡喃酮提供
+女医生风情史
+像大树一样高
+越轨利欲熏心
+慈云寺男保安
+女领导男秘书
+闯荡火影世界
+意恋征服系列
+月荷这个女人
+女监狱男管教
+罪恶交易买妻
+极品乡村生活
+太子娱乐城网址
+太子娱乐城开户
+太子娱乐城官网
+姚记娱乐城官网
+姚记娱乐城网站
+金冠娱乐城网站
+金冠娱乐城官网
+空巢留守村妇
+优博在线娱乐城
+销售仿真金属狗
+直销仿真金属狗
+李宗瑞全集下载
+李宗瑞照片下载
+李宗瑞全套照片
+李宗瑞全套种子
+迪卡昏迷粉订购
+订购迪卡昏迷粉
+迪卡昏迷粉提供
+提供迪卡昏迷粉
+相思红娘剂直销
+直销迪卡昏迷粉
+直销相思红娘剂
+迪卡昏迷粉供应
+供应相思红娘剂
+供应迪卡昏迷粉
+相思红娘剂供应
+迪卡昏迷粉销售
+销售相思红娘剂
+销售迪卡昏迷粉
+相思红娘剂销售
+订购相思红娘剂
+提供相思红娘剂
+相思红娘剂提供
+相思红娘剂订购
+制作假学历证书
+供应四硝基甲烷
+四氢吡喃酮供应
+供应甲氧麻黄酮
+云鼎娱乐城网站
+无政府食谱资源
+无政府主义食谱
+皇冠官方投注网
+日本黄片电影网
+办理高仿资格证
+供应四氧化二氮
+订购二已基色胺
+提供倍他美罗定
+提供二氢埃托啡
+日本黄片大合集
+销售去甲左啡诺
+销售醋氢可待因
+销售双氢可待因
+销售去甲可待因
+销售二已基色胺
+销售阿法美沙朵
+销售倍醋美沙朵
+销售倍他美沙朵
+销售倍他美罗定
+销售二氢埃托啡
+供应居民户口本
+五氧化二钒提供
+五氧化二钒销售
+销售五氧化二钒
+李宗瑞不雅图片
+李宗瑞照片全集
+五氧化二钒直销
+直销五氧化二钒
+利盈在线娱乐城
+提供安乐死药物
+网上真钱炸金花
+李宗瑞迅雷种子
+五氧化二钒供应
+庐江县官不雅照
+昆明夫妻聚会照
+昆明三夫妻艳照
+庐江何婷婷艳照
+专卖俄罗斯MP654k
+供应俄罗斯MP654k
+销售俄罗斯MP654k
+俄罗斯MP654k专卖
+直销俄罗斯MP654k
+直销特警作战服
+特警作战服直销
+特警作战服预订
+特警作战服供应
+供应特警作战服
+特警作战服销售
+销售特警作战服
+特警作战服专卖
+专卖特警作战服
+188金宝博娱乐城
+夫妻不雅照种子
+至尊国际娱乐城
+钻石国际娱乐城
+金都国际娱乐城
+百胜百旺娱乐城
+乐透世界娱乐城
+五湖四海娱乐城
+云鼎国际娱乐城
+庐江官员不雅照
+三夫妻高清艳照
+供应五氧化二钒
+色站广告位出租
+娱乐城现金下注
+娱乐城线上下注
+从业资格证制作
+办理真学历证书
+联通vip数据名录
+移动vip数据名录
+办理职业职称证
+办理从业资格证
+简易汽油弹制作
+甲基乙基酮销售
+易发国际娱乐城
+环球国际娱乐城
+伟德亚洲娱乐城
+买卖仿真警官证
+皇冠国际娱乐城
+提供EMS快递数据
+性吧网址发布器
+皇冠最新投注网
+提供新生儿数据
+皇冠国际现金网
+供应EMS客户资料
+提供EMS客户资料
+销售EMS客户资料
+供应EMS客户数据
+提供EMS客户数据
+销售EMS客户数据
+销售宅急送数据
+供应宅急送数据
+提供宅急送数据
+真人网上娱乐城
+警用電棍電棒甩
+人人网用户数据
+提供收藏品数据
+妖娆魅惑抛美胸
+朋友网用户数据
+提供化学合成冰
+各款精美日本刀
+提供警用报警器
+洋妞上宾馆陪服
+邯郸办假身份証
+中级会计师答案
+研究生考生答案
+喵喵药送货上门
+提供收藏品面单
+供应收藏品面单
+销售收藏品面单
+仿真器模具销售
+飞蛾扑火爱上你
+风中飞舞的血滴
+屁屁熊和花花鸡
+大方的嫂子素玫
+穿越倚天建后宫
+金麟岂是池中物
+夜色下的上海滩
+高纯度钻石订购
+苍井空种子下载
+南京特洛伊科技
+销售全球通名单
+供应全球通名单
+销售老板通讯录
+销售法人通讯录
+供应法人通讯录
+供应老板通讯录
+专业警官证制作
+警用电击棒销售
+最新版假人民幣
+网上真人娱乐场
+皇城国际娱乐城
+显示任意手机号
+帝国幼幼集团军
+供应喵喵药电话
+专卖高压电击棒
+高压电棒专卖网
+办假英语六级证
+办假英语四级证
+办理各类资格证
+办理各类操作证
+麦角乙二胺销售
+俊龙百美缘下载
+供應手機變號機
+麻黃素合成方法
+提供冰鉆石教程
+供应健衛小口徑
+左旋麻黃素供应
+銷售健衛小口徑
+提供健衛小口徑
+供應健衛小口徑
+销售健衛小口徑
+帮任意号码改号
+手機碟中諜軟件
+手机007间谍软件
+手机碟中谍软件
+专业特種兵殺手
+专业地下保安隊
+专业地下保安队
+贝尔求生刀专卖
+海军突击刀专卖
+战术突击刀专卖
+軍用潛水刀专卖
+貝爾求生刀专卖
+鷹飛淩軍刀专卖
+美國SOG軍刀专卖
+蘭博求生刀专卖
+办理假冒身份證
+代制假冒身份證
+卖二代假身份證
+卖壹代假身份證
+卖假一代身份證
+卖假二代身份證
+卖一代假身份證
+卖假壹代身份證
+卖真一代身份證
+卖真壹代身份證
+卖真二代身份證
+专业退伍兵殺手
+麥角酸送货上门
+鹽酸羥亞胺配方
+摇头糖送货上门
+搖頭糖送货上门
+麻黃素送货上门
+鹽酸羥亞胺出货
+鹽酸羥亞胺订购
+卖间苯三酚手机
+卖間苯三酚手机
+卖间苯三酚电话
+卖間苯三酚电话
+黃牙簽送货上门
+白牙簽送货上门
+鹽酸羥亞胺到货
+神仙糖送货上门
+供应鹽酸羥亞胺
+供应左旋麻黃素
+鹽酸羥亞胺销售
+銷售黃綠牙籤毒
+供应四氢吡喃酮
+销售四氢吡喃酮
+買賣四氢吡喃酮
+销售一元人民币
+ jsfxzp88wy32idcwindnet
+ improvealexarankingcom
+ wangtongchuanqisifucom
+8341涉及天机运程
+最牛b的女预言家
+更加动荡的2009年
+注定动荡的2008年
+271人拿不动5'*'0万
+CIBS海外移民投资
+锘挎瘺娉戒笢1234
+2010诺贝尔和平奖
+硝基3氮杂环已烷
+ iRadioPOPInternetRadio
+修罗总裁a级恋人
+仿we51黑龙加长版
+E起发国纪娱乐城
+庐江何婷婷群p照
+王民生宾馆玩群P
+庐江县委群p照片
+2012最新股民数据
+手機X臥底改良版
+蘭博3號軍刀专卖
+办理2代假身份證
+办理1代假身份證
+办理假1代身份證
+办理假2代身份證
+办理真2代身份證
+代制假1代身份證
+代制假2代身份證
+办理真1代身份證
+卖假冒1代身份證
+卖假冒2代身份證
+卖2代精仿身份證
+卖真实1代身份證
+卖真实2代身份證
+卖2代個人身份證
+卖2代假冒身份證
+卖1代假冒身份證
+卖個人1代身份證
+卖個人2代身份證
+卖1代個人身份證
+卖1代高仿身份證
+卖2代高仿身份證
+卖个人1代身份證
+卖个人2代身份證
+卖1代精仿身份證
+退\\出\\党\\团\\队
+全球唯一綄Σ荒苋
+ d0970714757783e6cf17b26
+ mingtianhuigenghao123ss
+负责中南海的12层
+伤透了12亿人的心
+21世纪中国基金会
+ www.landmarklondon.mobi
+27军长砸洗浴中心
+ ⒖⒋⒉⒋⒉⒋⒊00
+7月4日0时40分去世
+pk小三后妈少女血
+H.M.X三硝酸纤维酯
+S2乙基磺酰基乙基
+qq訂購鹽酸羥亞胺
+办计算机二级证qq
+办理高仿硕士证qq
+高仿结婚证办理qq
+qq高仿结婚证办理
+88娱乐城天上人间
+qq高仿军官证制作
+行驶证专业制作qq
+办理保真学历证QQ
+qq专卖高仿军官证
+四级成绩单制作qq
+四级成绩单办理qq
+qq四级成绩单办理
+qq四级成绩单制作
+QQ提供收藏品资料
+QQ保健品数据销售
+假工程师资格证qq
+qq提供慢性致癌药
+qq供应安乐死毒药
+qq保健品资源提供
+qq提供收藏品资源
+qq供应保健品资源
+qq收藏品面单供应
+qq老年人数据提供
+qq提供高仿军官证
+qq供应高仿警官证
+qq提供删除论坛帖
+安乐死药物供应qq
+安乐死药物订购qq
+购买五氧化二钒qq
+订购安乐死药物qq
+提供删除论坛帖qq
+专卖安乐死药物qq
+订购老年人资料qq
+老年人数据提供qq
+qq供应老年人资料
+qq提供老年人资料
+qq订购老年人资料
+办理高仿四级证qq
+qq销售尼蒙尔克素
+qq供应尼蒙尔克素
+qq订购尼蒙尔克素
+qq提供老年人数据
+制作高仿等级证qq
+供应老年人资料qq
+高仿户口本制作qq
+保健品资源提供qq
+提供收藏品资源qq
+供应保健品资源qq
+收藏品面单供应QQ
+qq办理高仿四级证
+qq高仿户口本制作
+qq制作高仿四级证
+保健品资料提供QQ
+保健品资料供应QQ
+QQ供应收藏品数据
+QQ供应保健品数据
+供应保健品数据qq
+提供收藏品资料QQ
+保健品数据直销QQ
+保健品数据销售QQ
+供应收藏品数据qq
+qq购买云南情蛊药
+qq直销云南情蛊药
+qq供应云南情蛊药
+供应云南情蛊药qq
+直销云南情蛊药qq
+购买云南情蛊药qq
+有偿抱养男宝宝qq
+有偿抱养女宝宝qq
+宅急送数据供应qq
+销售男女性数据qq
+销售老年人数据qq
+qq销售老年人数据
+qq销售相思红娘粉
+销售毕业生简历qq
+qq专卖安乐死药物
+qq提供高仿资格证
+提供十字锁工具qq
+qq制作高仿资格证
+有偿收养男宝宝qq
+高价收养女婴儿qq
+安乐死药物购买qq
+qq提供假等级证书
+提供假等级证书qq
+职业资格证办理qq
+专卖职业资格证qq
+职业资格证专卖qq
+qq专卖职业资格证
+钻石冰货到付款qq
+k7娱乐城免费开户
+办理高仿本科证qq
+办理假学历证书qq
+qq销售假学历证书
+办理假学历证书QQ
+办理高仿等级证qq
+qq办理假学历证书
+安徽庐江官员6p照
+王民生6P高清套图
+庐江县委不雅照bt
+庐江官员6p事件照
+手机号码随意改QQ
+专业收藏品数据QQ
+网络指定销售88式
+网络销售毛瑟M1932
+溫切斯特1000X电话
+溫切斯特1000X出货
+QQ销售鹽酸羥亞胺
+QQ销售左旋麻黃素
+QQ订购左旋麻黃素
+QQ订购鹽酸羥亞胺
+历史上的真实故事
+背着父亲偷搞母亲
+被婶子当鸭子的我
+浩方对站平台活动
+中国十大悲情语句
+广安第二人民医院
+江西田园置业集团
+出国留学必备物品
+急聘兼职文字录入
+这一代到底惹谁了
+迎接检查让人崩溃
+宁可家破不可国亡
+黑不过中国证监会
+中国人彪悍的一天
+领导做蠢事叫轶事
+肉体岂能拿来慷慨
+毛太阳惊世豪言录
+瞎改委抢劫司司长
+拔擢儿戏自毁长城
+卖命的不如跳舞的
+小平真是一代伟人
+小姐说俺是第一次
+党政干部十大特征
+预报了余震而不震
+中国的十大不明白
+一年兩會又三代表
+一代伟人料事如神
+中国社会一切向钱
+引无数干部竞折腰
+总理快步走进会场
+容贵国男性的性器
+东看全国都是穷人
+条型管包装杀猪粉
+手把手教你做炸彈
+男足缩头乌龟为耻
+中国队要是能出线
+曼德尔森已经结石
+国有完全垄断企业
+非法集资血本无归
+西门帮老大郑玉龙
+油条里掺入洗衣粉
+讲师遭到诬陷造谣
+自動尋找海外代理
+强制预装监控软件
+加密代理上网软件
+自行车比汽车污染
+你哥在国家队踢球
+哥哥在国家队踢球
+奶业工人的实心话
+产品不得用于考场
+三鹿能造一川碎石
+用酱油和醋勾兑的
+注射糖精与色素水
+获取国外dns服务器
+封堵各种在线游戏
+美女小偷被抓现场
+用工业柠檬酸浸泡
+蟹產卵時餵避孕藥
+蟹产卵时喂避孕药
+蟹饲养的激素传闻
+收奶员的真情告白
+收购果农手里染病
+赌自己的球队输球
+取缔四大名著出版
+行唐县出租车罢运
+汉人反扑持械上街
+罢教运动规模扩大
+我是菜市我是菜市
+沉痛悼念中国石油
+泡沫化的股票发行
+套住大盘改变季节
+散户们绝望的歌唱
+追高被套牢的前辈
+发改委的内部谈话
+被曾经的谎言蒙蔽
+虔心忆念遥呼之歌
+功的第一个字是法
+野兽眷恋的百合香
+北美华人夜色导航
+红楼梦之绮梦仙缘
+猎鹰怀里的水芙蓉
+《爱上你的温柔》
+国家正规期刊征稿
+通话清单记录查询
+纽扣无线影音通讯
+执业药师一次通过
+专业办理英语四六
+保证高分通过考试
+考百分百一次通过
+专业制作国内外文
+帮你轻松通过考试
+高邦科技字样礼品
+一次高分通过考试
+专业辦理各类证书
+专业办理各类证书
+六八四一九九八三
+手机通话清单查询
+民办大学真实学历
+现代人的五大悲哀
+机关人员真没素质
+神舟是花瓶的洋奴
+六提辖打死林衙内
+教育投资不及非洲
+教师的工资不公平
+中国最神秘的部门
+农村的干部最能贪
+救房市的集体官员
+教师面临生存问题
+拿到一部车的工资
+摧毁日本陆海空军
+中国打日本是必须
+有关部门也是人妖
+进京抓央视女记者
+槍斃后屍體的處理
+张祖桦被短暂拘留
+江苏出现重大疫情
+功劳不亚于杨利伟
+派出所内蹊跷死亡
+美国的坦克参北斗
+十教授被妖精骗了
+江西邓毛谢古事件
+该刹的歪风在哪里
+宣告相关试题作废
+燃油税恐成高油价
+最牛的警官检讨书
+空nlz空軍直屬單位
+艾未未与读者闲扯
+对民工实行力士后
+赶不上领导的变化
+中学修建音乐喷泉
+郯城至仓山高速路
+苍山路段特大事故
+无人遇难纯属隐瞒
+从纪念堂中扔出来
+吴祖光的铁骨柔肠
+吃一亩奖励好几百
+警车开道暴打记者
+穷人是最大的危险
+北京暗中调兵遣将
+违背国家安置政策
+十七团部营房哨兵
+解答烈士们的疑惑
+情报部门调查蓝苹
+粉蝶手中的纸老虎
+当今中国震惊世界
+观音新降七岁孩童
+立碑人署名吴启华
+村官公布个人财产
+真消息国人看不见
+陕西发现人感染猪
+你不能不看的墓碑
+朱穗生被内部监控
+本来就是毛邓社会
+猪流感引发的感想
+多名医生感染艾滋
+女医药代表水淋淋
+您真是党的好同志
+县长之女施暴追踪
+坑了四万六千个儒
+纪录我们告诉未来
+論民族平等重要性
+退伍军人安置问题
+心目中的中国地图
+东海苏岩岛邹占魁
+中国的鸡站起来了
+宋徽宗作重要批示
+绵州感染瘟疫死亡
+预报专家欲哭无泪
+512的强震有人预报
+宝贝的体内养珍珠
+吉首爆发特大规模
+安徽人民甘败下风
+领导的意见不能提
+跟国人和世界辩解
+日经松江府上海县
+揭开中国涉外金融
+内脏移植来源不明
+田集镇的真实故事
+强迫各省交检测费
+舅子李平经营学校
+中南海还给老百姓
+爱国会救不了灵魂
+法光照耀快快回家
+派嫦娥一号送我来
+强抢占地之贾家庄
+丰茂林场发现鼠疫
+不满政府隐瞒疫情
+吃人民的吸血阶层
+地产就没有新中国
+强大利益的牺牲品
+土地出让领域贿赂
+回不去的进城农民
+执法四年集体解聘
+權力核心中的知青
+张学兵不如一条狗
+鸡蛋迎接美国总统
+中国十大黑心职业
+遇难学生名单统计
+毛着力于夺取政权
+世界都在笑中国傻
+叶锦寨这样的恶行
+高送转并内幕交易
+人民广场惊人一幕
+北京政坛清华名人
+参谋业务参考资料
+告全国股民同胞书
+国家粮油统计报表
+黑窑母亲群体募捐
+胡溫怒批政法系統
+军事训练评定标准
+领导班子名单外泄
+毛时代大饥荒揭秘
+批林整风参考材料
+企业汇总会计报表
+企业如何建立网站
+人民大众时事参考
+司马义铁力瓦尔地
+塑胶原料的流动性
+五个部长一个省长
+星亚网络影视公司
+一个人的奥林匹克
+宜昌当阳县级市长
+印尼抢劫华人资产
+中国高层权力斗争
+中华人民实话实说
+中南海的权利游戏
+ qq2009ds3.w223.bizcn.com
+ ok.paofangwuyuetian.info
+ online-media-archive.net
+ zdan84115.xx108.zgsj.net
+妇联主任:武则天
+广源桔子暴发柑蛆
+国家总理:诸葛亮
+後勤部長:李蓮英
+水利部部长:大禹
+政府不欠你们的钱
+国家英语六级试题
+国家英语四级试题
+浩宇高等教育学历
+环三亚甲基三硝氨
+快速办理深户咨询
+深圳红印户口咨询
+吸血贵利王血玫瑰
+霞姐-夜生活女王
+新疆克拉玛依火灾
+新三狼之欢场屠夫
+性事奇趣录之阉夫
+政府说为人民服务
+中南海的权力游戏
+中央警卫局大换血
+专业快速深户咨询
+北京先知设计公司
+中国消费者报大厦
+新闻总署态度蛮横
+乙酸甲氧基乙基汞
+中国实行血腥教育
+中组部前部长直言
+手机卡服务密码破
+天天高中药增高网
+深圳一博网络推广
+北京恒昌富达科技
+供应删除贴吧帖子
+网络炒作执行专家
+扬州籍的重要人物
+被美女围困的日子
+操魂师之美眉天下
+陈二狗的妖孽人生
+穿越之极品色公主
+簡易炸蛋製作方法
+《色之戒四合院》
+醋酸甲氧基乙基汞
+苦毒浆果木防己属
+四级考试试题答案
+2乙基S4硝基苯基酯
+飞机失事后的云雨
+我和僵尸有个约会
+奉子成婚羔羊皇后
+覆雨翻云之逐艳曲
+广州亚运会开幕式
+黑魔公主除灵异志
+坏蛋是怎样炼成的
+皇上借我沟引一下
+金庸群侠之驭奴者
+巨洞色钱权大博弈
+茂名高州水灾事件
+门房秦大爷的故事
+迷失在日本的天堂
+女大学生勇闯仕途
+诺贝尔和平奖得主
+三宫六院七十二妃
+色痞子巧诱娇娇女
+通缉总裁的出逃妻
+先穿射雕再穿大唐
+以下是违禁关键词
+与掠心老公说拜拜
+博康舒大冒险魔女
+蓝色快车车身广告
+男女婴幼儿童服装
+凭什么要被你侮辱
+装饰设计有限公司
+監聽無線通話軟件
+新葡京国际娱乐城
+皇冠正网平台出租
+提供中考学生信息
+快速办理学历证书
+足球金球跟飞软件
+第一跟单足球软件
+楼凤良家兼职信息
+兼职小妹服务电话
+美女全套服务电话
+进京户口指标转让
+找大学生全套服务
+隐密器变号娱乐版
+本科学历快速办理
+亚洲新时代娱乐城
+色女缠郎免费下载
+提供企业老板资料
+删除论坛反面帖子
+新东泰娱乐城开户
+提供了仇了事服务
+七胜国际娱乐平台
+同花顺国际娱乐城
+喜盈门国际娱乐城
+大三元娱乐城开户
+蝴蝶谷中文娱乐网
+皇冠现金网娱乐城
+新澳门娱乐城开户
+大富翁国际娱乐城
+尊龙国际在线娱乐
+兼职妹妹双飞服务
+清除贴吧负面报道
+乐百家国际娱乐城
+皇冠金公主娱乐城
+百家博国际娱乐城
+王梦溪108照片下载
+保险客户数据专卖
+提供车主详细资料
+删除负面网络信息
+华尔街娱乐城网址
+博天堂娱乐城网站
+美高梅娱乐城网站
+找小女姐全套服务
+真钱百利宫娱乐城
+负面消息网络删除
+负面消息网络清理
+负面消息网络消除
+供应西班牙苍蝇粉
+办理日语一级证书
+真钱网络棋牌游戏
+楼盘业主数据提供
+销售楼盘业主数据
+订购楼盘业主数据
+快递面单数据提供
+提供英语四级证书
+提供英语六级证书
+提供英语等级证书
+处理企业负面消息
+北京地区供应双响
+电视购物数据供应
+快递面单数据销售
+电视购物资料供应
+快递面单数据供应
+供应楼盘业主数据
+提供楼盘业主数据
+提供金融客户资源
+提供老板个人资料
+提供老人保健数据
+提供股民开户数据
+供应电视购物资料
+供应保险用户资料
+销售小区业主资料
+销售老板个人资料
+销售银行客户资料
+销售小区住户资料
+销售老板资料信息
+供应快递面单数据
+销售快递面单数据
+提供快递面单数据
+销售物流客户资料
+销售个人信息数据
+销售车主信息数据
+销售手机间谍软件
+销售股民开户数据
+电视购物名单销售
+销售高档业主数据
+销售保险客户资料
+销售物流客户数据
+销售快递综合数据
+销售期货客户资源
+销售股民个人信息
+销售锡纸快开工具
+销售十字快开工具
+销售股票客户资源
+销售保险用户资料
+销售快递客户资料
+销售老人保险资料
+销售小区业主名录
+电视购物数据销售
+提供银行客户信息
+供应企业名录资源
+快递单号交易平台
+销售监狱个人资料
+销售服刑人员资料
+删除企业负面消息
+删除网上负面消息
+手把手教你作原子
+现金赌钱游戏平台
+代人解决私人恩怨
+代人制造特殊意外
+色系漫画打包下载
+真人在线娱乐平台
+寂寞空庭春欲晚
+我是千斤大小姐
+我的邻居很腹黑
+一只小妖出墙来
+网游之纵意花丛
+地下室里的春风
+提供删除天涯帖子
+老婆陪我换配偶
+机舱之头等服务
+遍收天下美娇娘
+红尘都市完整版
+总裁女儿爱上我
+数见红尘应识我
+我爱由我不由天
+穿越只为遇见你
+有缘千年来相会
+我是弱受我怕谁
+穿越之兰柯一梦
+小小皇后成长记
+耻辱之教育实习
+美色当前儿心乱
+笔仙原来是小受
+穿越之万受无疆
+十里荒凉胭脂泪
+憐卿甘為身下奴
+删除网上负面影响
+清除网上负面影响
+哥哥的猫耳女仆
+后宫佳丽三千人
+电视购物数据下载
+下载电视购物数据
+买卖顺丰面单数据
+供应小区业主资料
+收获人妻的小贼
+秘密熟母俱乐部
+销售汽车快开工具
+轻狂一笑帝王受
+跳钢管舞的男人
+意难忘之续前缘
+九龙夺嫡之胤祹
+火影之美女如云
+提供真人线上娱乐
+姚记娱乐备用网站
+富家女的男保姆
+一路高升一路情
+狐家屯的孽事儿
+办理高仿学历证书
+天天乐娱乐城官网
+星期八娱乐城官网
+供应车主信息资料
+供应全国车主名单
+供应小区住户资料
+提供保险用户资料
+制作高仿学历证书
+金融客户资源销售
+金融客户资源供应
+庐江不雅照片全集
+供应二氧化丁二烯
+供应硫酸三乙基锡
+供应六亚甲基亚胺
+供应保险人员数据
+供应网络购物数据
+销售网络购物数据
+提供网络购物数据
+销售保险人员数据
+销售小区业主信息
+提供医保个人信息
+提供旅客个人信息
+混在后宫假太监
+禁区女领导大院
+人妻肛肉曲下载
+专业解决个人恩怨
+提供信息清除服务
+维也纳娱乐城网站
+圣淘沙娱乐城网站
+提供上门爱爱服务
+星期八娱乐城网站
+黄金天使降临下载
+直销汽车快开工具
+供应股民详细信息
+提供车主个人信息
+清除网络恶意言论
+删除网上恶意帖子
+提供尼二氢可待因
+销售美沙酮中间体
+销售尼二氢可待因
+有偿解决私人恩怨
+二丁基氧化锡提供
+提供二丁基氧化锡
+二丁基氧化锡销售
+销售二丁基氧化锡
+二丁基氧化锡直销
+直销二丁基氧化锡
+删除网络虚假信息
+网络真人现金游戏
+销售股民详细信息
+二丁基氧化锡供应
+三对夫妻种子下载
+昆明三对夫妇快播
+庐江三对夫妻种子
+庐江官员乌龙艳照
+昆明三对夫妻图片
+春暖花开性吧地址
+办理六级英语证书
+办理四级英语证书
+官员夫妻高清艳照
+供应物流客户资料
+昆明三夫妻不雅照
+供应二丁基氧化锡
+供应小区业主信息
+提供电视购物资料
+提供物流客户资料
+变瞎子的慢性毒药
+电视购物名录专卖
+提供电视购物名录
+电视购物名录提供
+专卖电视购物名录
+销售电视购物名录
+电视购物名录销售
+供应电视购物名录
+电视购物名录供应
+供应股民开户数据
+销售小区业主名单
+办理执业资格证书
+主叫号码显示修改
+删除博客帖子电话
+供应老板私人电话
+供应老人保健数据
+供应小区业主名单
+提供保险老人资料
+供应高端客户名单
+销售高端客户名单
+销售学生名单数据
+供应学生名单数据
+提供学生家长数据
+销售学生家长数据
+供应学生家长数据
+销售内部成单数据
+提供内部成单数据
+供应内部成单数据
+黄樟素黄樟油销售
+提供小区车主信息
+找人制造意外电话
+购买防身警用装备
+购买警用防身装备
+销售顺丰客户资料
+提供保险人员数据
+销售最新股民数据
+提供全新股民数据
+销售顺丰面单数据
+防身警用装备专卖
+提供中考考生数据
+提供最新股民数据
+供应汽车车主信息
+提供考生家长资料
+供应考生家长资料
+负面消息专业删除
+供应物流进线数据
+供应物流成单数据
+提供物流进线数据
+提供物流成单数据
+销售物流进线数据
+销售物流成单数据
+供应学生家长资料
+提供学生家长资料
+销售学生家长资料
+提供最新保险数据
+供应最新保险数据
+销售最新保险数据
+烟雾弹的制作方法
+高校学生信息档案
+銀行卡读卡器软件
+提供韵达面单数据
+提供各种制毒工具
+高档商场会员资料
+动漫美女触手禁图
+外国洋妞酒店特服
+国内模特各国洋妞
+提供天天面单数据
+销售专业顺丰面单
+提供电购面单数据
+销售电购面单数据
+供应电购面单数据
+供应电购综合面单
+任意手机号码变号
+制作溜冰壺子配方
+供应专业顺丰面单
+提供一手保险数据
+提供一手女性数据
+提供联通用户数据
+提供电信用户数据
+专业删除贴吧贴子
+公车上的女大学生
+恶夫最里的小樱桃
+冷狮爪下的小野猫
+在韩国留学的日子
+专业删除网上信息
+提供各地老板资料
+销售公司法人资料
+销售楼盘业主资料
+供应高档客户资料
+销售高档客户资料
+供应银行客户资料
+销售电话营销数据
+供应企业名录资料
+供应电话营销数据
+供应老板个人资料
+供应法人手机号码
+供应公司法人资料
+供应楼盘业主资料
+任意修改主叫号码
+手机号码修改软件
+供应电视购物数据
+办理英语四级证书
+网上真人现金游戏
+全国号码任意设置
+办理专业四级证书
+我爱你亚洲妹社区
+办理大学学历证书
+草榴社区最新网址
+草榴社区最新地址
+专业消除负面消息
+办理国外学历证书
+供应金融客户资源
+销售金融客户资源
+提供各种锁匠器材
+销售进口硅胶脸皮
+专业帮人處理恩怨
+专业定制人造面皮
+销售进口硅胶面皮
+专业定制易容面皮
+专业定制硅胶面皮
+专业定制人造脸皮
+专业定制硅胶脸皮
+专业定制美化面皮
+专业定制美化脸皮
+专业定制高仿脸皮
+专业定制仿真脸皮
+专业定制易容脸皮
+专业定制高仿面皮
+专业定制仿真面皮
+代购潛伏者改良版
+代购潛伏者增強版
+代购007間諜增強版
+代购007間諜免費版
+代购潛伏者專業版
+烟花爆竹送货上门
+大馬士革鋼刀专卖
+美國巴克軍刀专卖
+德國博克軍刀专卖
+美國卡巴軍刀专卖
+美國冷鋼軍刀专卖
+代理彩信改號业务
+代理手機改號业务
+办理二代假身份證
+办理壹代假身份證
+办理假壹代身份證
+办理假一代身份證
+办理假二代身份證
+办理一代假身份證
+办理真二代身份證
+办理真一代身份證
+代制假二代身份證
+代制假壹代身份證
+办理真壹代身份證
+卖假冒一代身份證
+卖假冒壹代身份證
+卖假冒二代身份證
+卖二代假冒身份證
+卖一代精仿身份證
+卖二代精仿身份證
+卖壹代個人身份證
+卖真实二代身份證
+卖真实壹代身份證
+卖真实一代身份證
+卖壹代假冒身份證
+卖个人壹代身份證
+卖個人一代身份證
+卖個人二代身份證
+卖個人壹代身份證
+卖一代個人身份證
+卖二代個人身份證
+卖一代高仿身份證
+卖二代高仿身份證
+卖壹代高仿身份證
+卖个人一代身份證
+卖个人二代身份證
+卖壹代精仿身份證
+卖一代假冒身份證
+間苯三酚送货上门
+间苯三酚送货上门
+卖左旋麻黃素手机
+卖鹽酸羥亞胺手机
+卖鹽酸羥亞胺电话
+印尼依斯兰祈祷团
+特俚碾姎饣撝殒j
+第三代F3加密通道
+怒影覆盖面积n公顷
+ 2x3x4x5x6x7x8.count.xj.cn
+预定2013年户口指标
+转让2013年户口指标
+ewin娱乐城官方下载
+金融皇帝十二妃H版
+昆明三对夫妻玩群P
+庐江县群p照片全集
+昆明群P聚会共181张
+昆明三对夫妻群p图
+庐江县官员群p照片
+办理2代精仿身份證
+办理1代精仿身份證
+办理1代假冒身份證
+办理2代假冒身份證
+办理个人1代身份證
+办理假冒1代身份證
+办理假冒2代身份證
+办理個人2代身份證
+办理個人1代身份證
+办理个人2代身份證
+办理1代高仿身份證
+办理2代高仿身份證
+办理2代個人身份證
+办理1代個人身份證
+18岁或以上人士观看
+ asf0021homeipnetpics052609
+取消13省市农业户口
+不看新闻的20条理由
+34个政府和部门祝贺
+ secure-cn.imrworldwide.com
+ shangshan.w990.vhostgo.com
+重庆秘密空间YZ会所
+汽油3分之1白糖混合
+5氨基甲基3异恶唑醇
+二乙基S4硝基苯基酯
+2463亚乙基氨基1353嗪
+契约99天总裁的前妻
+供应正宗天然k2香料
+供应正宗天然k3香料
+会计师从业资格证qq
+上门全套服务电话QQ
+小姐全套上门qq电话
+注册送20元真人棋牌
+金融客户资源提供qq
+qq提供保险客户数据
+qq供应小区业主数据
+qq供应保险客户数据
+qq学生家长数据专卖
+qq学生家长资料专卖
+网站论坛负面处理qq
+网站新闻负面处理qq
+qq供应期货客户数据
+qq电视购物数据提供
+qq提供小区业主名单
+提供锡纸快开工具qq
+qq快递面单数据专卖
+qq销售电视购物数据
+qq销售西班牙苍蝇粉
+qq直销西班牙苍蝇粉
+qq订购西班牙苍蝇粉
+qq购买西班牙苍蝇粉
+qq提供西班牙苍蝇粉
+提供小区业主资料qq
+qq提供电视购物数据
+电视购物数据提供qq
+qq提供小区业主名录
+供应期货客户数据QQ
+快递面单资料提供QQ
+学生家长数据专卖qq
+学生家长资料专卖qq
+提供快递面单资料qq
+提供保险客户数据qq
+供应保险客户数据qq
+供应小区业主数据qq
+物流客户信息提供qq
+qq清除网上负面报道
+清除网上负面报道qq
+提供小区住户资料qq
+销售联通客户资料qq
+供应个人信息数据QQ
+销售电视购物数据qq
+销售个人信息资料qq
+销售业主身份信息qq
+提供高仿四级证书qq
+提供高仿六级证书qq
+qq提供锡纸快开工具
+qq供应高仿学历证书
+qq替人解决私人恩怨
+销售高仿学历证书qq
+qq销售高仿学历证书
+提供电视购物数据qq
+供应顺丰面单数据qq
+销售学生信息资料QQ
+销售车主信息资料QQ
+庐江官员6p照片下载
+庐江官员6p全套照片
+庐江县不雅照下载bt
+安徽庐江官员6p原图
+qq提供小区业主信息
+专卖小区业主名单qq
+电话号码任意修改QQ
+提供别墅业主信息QQ
+任意显示主叫号码QQ
+供应最新女性数据QQ
+销售最新女性数据QQ
+提供最新女性数据QQ
+物流公司内部数据QQ
+供应顺丰面单数据QQ
+小姐保健服务信息QQ
+销售基金人员数据QQ
+保险公司客户资料QQ
+网游喷血美女左小娜
+关于堂明皇与杨贵姬
+围绕土地问题的攻防
+全球唯一绝对不能惹
+发不出工资买不起面
+不该把工农兵捧上天
+官府忽悠百姓之能事
+萨达姆和布什对情歌
+上太空都是三四个人
+长征时到过她们村子
+中国人的十大不明白
+双氧水攻击羰基脱水
+壹盒壹次性玞槍霰彈
+苍山段连环交通事故
+流感绝对没这么简单
+青年长拳图解全过程
+不为人知的行业内幕
+紧密团结在手机周围
+黄膳中认识了避孕药
+超越者联盟突破精英
+央视是纳税人的央视
+推销自己的炸鸡秘方
+翅膀的激素催生技术
+奶农把责任推给奶牛
+武汉地下肉类加工厂
+上犹客家的精神变迁
+取消中国国家足球队
+拖累白酒板块齐低迷
+行业步入换帅敏感期
+尸体在农家院被掏空
+沙粒中发现早期宇宙
+交易大厅一下子看到
+十年黄金股市第一年
+股民们骗光杀光抢光
+普降加持吉祥光耀曲
+外国人强悍的性要求
+多年的答案操作经验
+一次性高分通过考试
+可随意改变称重结果
+利威电子厂工会斗争
+不能耽误了党的工作
+中国被占领土一览表
+给閒基同志的一封信
+屁事都要认证的制度
+街道办工作人员赖某
+燃油税为何像个人妖
+女记者被山西检察官
+部队驻上了胶东半岛
+户口管制制度的弊端
+王启富教授深感痛心
+万学海文校长李忠泽
+政府和官员就是驴子
+中国教育宪章一百条
+拿着纳税人钱的骗子
+战争正在向我们走来
+博雅免疫球蛋白事件
+莆田市政府侵吞涉案
+韩企工会围堵我使馆
+打赢高磕技局部战争
+骇人听闻的进补潮流
+称能解决农民工就业
+被员警围困的北京家
+翻译还没来便回答说
+黑势力强行推倒房屋
+办案中依靠拉拢法官
+遇難寃生的詳細名單
+邓永固因涉嫌诽谤罪
+姜振华因涉嫌受贿罪
+珍贵的历史录音予您
+第一能治猪流感的人
+倒塌学校的质量问题
+坦克车装扮成大卡车
+政府信用的彻底丧失
+四把主刀手同时感染
+秘密录音回忆录出版
+干部制度的莫大讽刺
+狼鞋走遍了澳大利亚
+国安局上门的危险发
+某些部门的家长作风
+叶城特大恐怖凶杀案
+三峡大坝导致汶川地
+宋秀岩已获中央任命
+塔头的大量人口失踪
+杨佳是天下第一勇士
+套牢资金量创出奇迹
+国庆前唯一一次合练
+不认识你也要代表你
+肉体留不住男人的心
+曲解造成今天的乱象
+政府和地产商的合谋
+银都路2688弄20号301室
+锺绍军带进了中南海
+反赌不是一出肥皂剧
+唯我独尊的美国强盗
+外交部最常用口头禅
+奥巴马的townhallmeeting
+市长走访不事先通知
+没有经济头脑的毛泽
+当地村民被打成重伤
+奥巴马否认与夏雨荷
+放光明电视制作中心
+黑窑工母亲网上寻助
+红太阳是怎样升起的
+蒙古教育文化基金会
+农民真正贫困的根源
+是中国社会的爱滋病
+泰州文教局停售通知
+中南海高层权利斗争
+ 105qngkk.863computer.org.cn
+ se.woyaoxingjiaowang.net.cn
+不就死了几个孩子吗
+国家禁毒署:林则徐
+建设部部长:秦始皇
+商务部部长:胡雪岩
+输港鸡蛋被检出问题
+用的都应该是公家的
+最高法院院长:包公
+救灾专用帐篷引质疑
+孽欲追击档案之邪杀
+声明退出中国少先队
+中国国际战略研究网
+中南海高层权力斗争
+中石油国家电网倒数
+ 631008986
+网络执行工作室招人
+八八穿越还珠之乾隆
+宝贝今夜你是什么牌
+豹王别姬豹王你好坏
+穿越玩转之羞花妖娆
+3分之2的汽油与3分之
+462硝基邻甲基苯酚钠
+氢氧化吐巴寇拉令碱
+1甲基23吡啶基吡咯烷
+酰胺福林甲烷磺酸盐
+四级真题及答案下载
+英语六级试题及答案
+妃穿不可蛮妃要出墙
+坏叔叔总裁的灰姑娘
+混迹在美女如云公司
+加非猫现实世界历险
+金鳞外传之龙游浅水
+京城男女之食色性也
+绝色天下之极品弃妃
+狼情窃意桃花无意惹
+冷妻难惹总裁请下堂
+乱欲纯情小男人和美
+女文工团的最后下落
+俏黄蓉的洞房花烛夜
+情冷君恩之一朝为后
+石榴裙下的机关男人
+帅帅小子之千娇百媚
+我和一群女人的故事
+先吃后爱将军恶如狼
+幸孕弃妃把朕搞翻了
+妖艳花丛之百花迷乱
+遗忘国度之神秘徽章
+赵雅芝那胯下的温柔
+重生闻香之慈航静斋
+罪爱豪门腹黑总裁惹
+不得和你假正经重庆
+穿越谁吃了我的皇妃
+落魄女生酷总裁爱情
+强欢痞妃皇上不下崽
+供应飞行员专用叶子
+供应飞行员飞的叶子
+胜利者足球跟单软件
+九龙冰化工主产销售
+林雨欣有声小说下载
+俄罗斯美女学院快播
+色百度网址导航大全
+同志会所找帅哥服务
+上海情侣网吧门下载
+解决2013年户口指标qq
+叶倩彤有声小说下载
+叶倩彤有声读物下载
+金道搏彩网上娱乐城
+明珠国际在线娱乐城
+手机号任意更改软件
+明珠国际网上娱乐城
+淘金盈国际线上娱乐
+利来国际娱乐城代理
+代理威尼斯人娱乐城
+真钱二八杠网络平台
+广州小姐找上門服务
+皇冠国际在线娱乐城
+王梦溪照片网盘下载
+新澳博天上人间娱乐
+澳门十二生肖乐透彩
+二代证扫描件生成器
+立得二代证制作系统
+手机改串号软件下载
+销售保健品客户资料
+销售汽车干扰信号器
+无政府主义者的食谱
+天上掉下个打工妹
+重生之美女掠夺者
+大炕上的肉体联欢
+驱妖娘娘冒险奇谭
+侠客行之慈母闵柔
+我宁愿你虐我到底
+无政府主义者食谱pdf
+学仿七绝口占答戍
+丝丝心动步步惊心
+欧阳少恭的心上人
+合租屋里的女房客
+新上海人浮云之恋
+我在花丛中的日子
+情燃山乡支医仕途
+后湾村的那些事儿
+特洛伊监控软件下载
+特洛伊监控软件公司
+供应各小区电话名单
+庐江官员不照雅全部
+庐江不雅照图片种子
+销售全球通用户资料
+全球通用户资料提供
+庐江官员艳门照下载
+庐江不雅照全集种子
+庐江县官员艳照全套
+昆明三对夫妻群照片
+左旋麻黃素合成配方
+销售小区业主手机号
+供应小区业主手机号
+供应房地产客户资料
+销售房地产客户资料
+汽油弹简易制作教程
+乙酰邻氨基苯酸销售
+《娇艳校园》下载
+提供宅急送面单数据
+小泽玛利亚电影全集
+提供全球通用户资料
+大叔的幸福人妻生活
+我和我的爱人的故事
+在镜子里看我和老公
+专业提供国内外女郎
+金木棉蓝盾在线娱乐
+高档俱乐部会员资料
+警用电击器防身供应
+办理计算机等级证书
+雪野あいか电驴下载
+波多野结衣合集下载
+最新证券新资料供应
+二代身份證当面交易
+办理二代精仿身份證
+代购潛伏者免費試用
+代购007間諜免費試用
+西班牙奧托軍刀专卖
+解放軍現役軍刀专卖
+办理壹代假冒身份證
+办理一代精仿身份證
+办理二代假冒身份證
+办理一代假冒身份證
+办理一代高仿身份證
+办理壹代高仿身份證
+办理个人一代身份證
+办理假冒一代身份證
+办理假冒二代身份證
+办理假冒壹代身份證
+办理个人壹代身份證
+办理個人二代身份證
+办理一代個人身份證
+办理個人壹代身份證
+办理個人一代身份證
+办理个人二代身份證
+办理二代高仿身份證
+代制假冒壹代身份證
+代制假冒一代身份證
+代制假冒二代身份證
+办理壹代個人身份證
+办理二代個人身份證
+鹽酸羥亞胺送货上门
+2009第一号人肉搜索令
+2012年的流感爆发威胁
+向胡总借钱2000亿遭拒
+谁赢得了4170万元订单
+ liushizhounian.qqxuexiao.com
+ wylf5168.web013.boothost.com
+ qq949023.free2.iisiisiis.com
+qq充值中心充值qq号码
+基本添上1平勺碳酸钠
+眯基亚硝胺眯基4氮烯
+31甲基24氢吡咯基吡啶
+2013中考考生落榜信息
+2013中考考生落榜资料
+昆明三对夫妻群p聚会
+昆明群P聚会181张下载
+瑞典Fallkniven軍刀专卖
+幸运52发生的真实笑话
+幸运52老公比划老婆猜
+ r25281.nb.host192-168-1-2.com
+ securitytestinternetguide.com
+ woaini520.web003.boothost.com
+ sakamoto-solicitor-office.com
+16β瑟文34714151620-庚醇
+'*'甲胺基苯重氮磺酸钠
+3羟基5氨基甲基异恶唑
+重生之乱世种马YY传奇
+qq供应收藏品客户资料
+qq提供收藏品客户资料
+提供收藏品客户资料QQ
+供应收藏品客户资料QQ
+踏莎行·三军战震魔
+供应全球通用户资料QQ
+中国人都在上的四大当
+多胡子的应该是马克思
+彪长征时都去了什么人
+我就让组织部长关心他
+有效实现无痛苦的死亡
+陡崖所形成的半洞下面
+月球极可能是人造天体
+火星发现古代湖泊遗迹
+青葡萄放入乙烯利稀释
+公然伤害消费者的健康
+五粮液是当官的取款机
+两人中间还被架着一个
+告诉你真实的乌鲁木齐
+白岩松十问中国证监会
+中国股市必须推倒重来
+失落的孤独完美中文版
+网上可查真实高效办理
+包考生一次性通过考试
+救楼市别变成救地产商
+发射后面的惊天大秘密
+取代美国星球大战计划
+统一城乡户口登记制度
+检察官敲开央视女记者
+用权力垄断我们的希望
+城乡统一户口登记制度
+降油价不能等待燃油税
+记者查不法老闆踏地雷
+为黄牛党倒票维持秩序
+新浪的控股方竟是日本
+朱刘街办非法占地问题
+制度与文化的百年进化
+政府亲商护商还是在毁
+京沪高速特大交通事故
+办一个会繁荣一座城市
+穿国服可刺激经济增长
+继承毛独断专行家长制
+江都财政局一窝钱耗子
+矿难事故的形象代言人
+死亡数远超过官方说法
+被央视暴光的真正原因
+痛心的牡丹江防洪工程
+总参谋部的二部和三部
+堵哈铁公共安全专家局
+根据客户原样印刷制作
+中国最牛的加油站标语
+建设街交会处的广告牌
+将此刻田府中三人成诵
+主播李某某的糜烂过往
+市长亲自乘坐黑心出租
+打的光打不光另当别论
+这个党的领袖钦命开除
+颠覆中华人民共和国政
+干扰赈灾募捐事件回放
+高低温交变湿热试验箱
+联合起诉最高人民法院
+世界以利亚福音宣教会
+卫生计划财务参考资料
+希望之声国际广播电台
+中国高层人事变动解读
+中国政坛“明日之星”
+阻止中华人民共和国统
+ web99222840.web159.dikavan.net
+齐天大性之大破盘丝洞
+孙悟空与阿西娜的故事
+中国支配下的朝鲜经济
+东莞市创科电子科技有
+八元钱泡了个极品空姐
+大种马重生三部曲合集
+氨甲酰氧甲氧乙基甲基
+发动机燃料抗爆混合物
+3-羟基5氨基甲基异噁唑
+混迹在美女如云的公司
+混在美女如云的办公室
+魔王神官和勇者美少女
+小丫头我要你和充气妹
+熊猫哥哥和功夫美少女
+倚天屠龙记之我是张无
+中国是全球唯一不能惹
+中学校园秘闻录之追艳
+左手上天堂右手下地狱
+马家爵的一句话让在场
+山鸡孔雀绿壳蛋鸡梅花
+香港爱儿健国际医疗服
+快速删除负面网络消息
+天利足球打水扫货软件
+永利足球打水扫货软件
+专业删除网络方面信息
+手机号码任意更改软件
+圣淘沙娱乐城官方网站
+十六浦娱乐城在线娱乐
+华尔街娱乐城在线娱乐
+供应手机号码变换软件
+供应电视购物用户数据
+《诱色之野性医生》
+无政府主义者手册下载
+无政府主义者食谱翻译
+女皇陛下的笑话婚姻
+大胆总裁敢抢我妈咪
+家丁绿帽之杨凌乱入
+穿越火线之露水情缘
+我和六个男人的故事
+英雄无敌之美女军团
+阿莎丽小姐的旅行记
+翻译无政府主义者烹饪
+那场顺其自然的情事
+教授夫人的别样生活
+蓝天航空公司的空姐
+重生火影之漩涡鸣人
+爱上风情女老板熳姐
+永不落幕的爱恋完本
+禁忌情爱霸上留守村
+极品美女的超级保镖
+无政府主义者食谱下载
+中文无政府主义者食谱
+无政府主义者食谱资料
+翻译无政府主义者食谱
+下载无政府主义者食谱
+下载无政府主义者手册
+翻译无政府主义者手册
+供应顺丰面单购物数据
+庐江县委不雅照女主角
+庐江官员艳照图片下载
+安徽庐江全套艳照种子
+庐江县艳照事件的起因
+季戊四醇四硝酸酯研制
+直销手机号码模拟软件
+提供手机号码模拟软件
+供应电购进线面单数据
+提供电购进线面单数据
+销售电购进线面单数据
+销售快递公司面单数据
+提供快递公司面单数据
+供应快递公司面单数据
+提供物流公司内部数据
+销售物流公司内部数据
+供应物流公司内部数据
+零售专业手机间谍软件
+提供电视购物用户数据
+郊游时我干了女友同学
+我在公车上搞了小姨子
+销售个人商务数据资料
+供应个人商务数据资料
+专业定制进口硅胶面皮
+代理任意号码改号业务
+专业定制进口硅胶脸皮
+销售步槍手槍猎槍气槍
+2008年邮政工资调整套改
+空降的先头部队4人牺牲
+4二甲胺基苯重氮磺酸钠
+246三亚乙基氨基135-三嗪
+预定2013年北京户口指标
+解决2013年北京户口指标
+提供2012年中考学生信息
+2月5日大盘尾盘跳水内幕
+17日向省属媒体发出禁令
+ csoltiancity.105.80000web.com.cn
+ quu.wqiu.x.eki.ssk.os.972wyt.com
+温州一山村76人离奇死亡
+艺坛照妖镜之96应召名册
+浙江一古村76村民离奇死
+31-甲基2-四氢吡咯基吡啶
+下载手机号码变换软件qq
+供应手机任意显示软件qq
+qq制作高仿执业资格证书
+庐江官员6P高清套图下载
+供应全国移动用户资料QQ
+销售全国移动用户资料QQ
+销售全国联通用户资料QQ
+供应全国联通用户资料QQ
+加非猫:现实世界历险记
+姓是唐朝後面的那個朝代
+该药是无色无味透明液体
+自制射程200公里左右的gps
+正視全球中文熱中正體字
+正视全球中文热中正体字
+乌鲁木齐市打砸烧抢事件
+股市会成为百姓的屠宰场
+忘记药效期间发生的事情
+需要提供资金帮助的朋友
+ 13612801258
+ 13418539816
+ 13621174936
+ 13691663608
+ 13993468069
+教师工资要略高于公务员
+公務唗和教師的工賧差距
+取消第五次中欧经济峰会
+养车费用将是过去的两倍
+进口的是低质高含硫石油
+教授建议大幅提高燃油税
+联邦作为制度博弈的工具
+武汉爆发大规模牛传染病
+玫琳凯广州河南行贿清单
+干部办公室里的豪华家具
+把历史的知情权还给民众
+代表团以省长陈政高为首
+石桥铺去钟表厂那个方向
+小平同志为什么一直跑着
+取得许可证始得购买烟土
+南昌市的罗汉是杀不完的
+美化满清现象形成的原因
+拿到了奉贤建设银行报销
+第五代的xjp一番蛮横讲话
+成全了毛的终身领袖地位
+伦敦考虑放弃下届主办权
+元朝不是中华民族的王朝
+旗子在真空状态自己摆动
+为什么国内的油价还不降
+中国没有真正意义上的民
+ 13414628999
+尼总务石器吸其目哦轻易
+时期打了几次我再次哦唯
+是束告项瓷,害电突网解
+树亲民形象不如推动政改
+ 47ybnzo.o.o.il.vlfk.os.972wyt.com
+国土资源部部长:徐霞客
+姐妹们都翻身得解放了吧
+人死了以后再通知我们吧
+禁宫八大酷刑之极乐酷刑
+唐皇宫外情之三唐朝艳妃
+唐皇宫外情之太监与宫女
+香港新通豪科技有限公司
+新女性宝鉴邱玉茹邱莉婷
+橡胶溶解汽油中添加碱液
+真实教育部学历学位认证
+解决2013年公司户口指标qq
+预留2013年公司户口指标qq
+转让2013年公司户口指标qq
+来电显号码修改软件下载
+菲律宾圣安娜娱乐官方网
+在线真人赌钱娱乐城投注
+供应手机号码随意显软件
+供应手机号码任意改软件
+手机号任意显示软件下载
+英语老师的洞房花烛夜
+无政府主义者手册doc下载
+无政府主义者手册pdf下载
+无政府主义者食谱doc下载
+无政府主义者食谱英文版
+无政府主义者食谱双语版
+我和美女同事的那些事
+供应特洛伊智能偷听软件
+特洛伊智能偷听软件试用
+特洛伊监控软件开发公司
+无政府主义者食谱电子书
+无政府主义者食谱中文版
+无政府主义者食谱电子版
+中文版无政府主义者食谱
+供应智能特洛伊监控软件
+毛润之的佛缘与8341的来历
+京v牌照的使用权在四总部
+历代名妓-悲落叶之柳如是
+对2甲基氨基苯重氮磺酸钠
+中国靠什么守住18亿亩耕地
+迷魂药
+迷昏药
+三唑仑
+手机号码任意改软件下载qq
+供应手机号任意显示软件qq
+qq销售特洛伊智能偷听软件
+央视主持人涉嫌间谍案被捕
+将爆发世界最大规模猪流感
+烧不破的盛汽油塑料雪碧瓶
+专业提供各种大型统一考试
+鲜为人知又令人惊叹的历史
+工资中扣除教师养老保险金
+却鼓励百姓实行垃圾袋装化
+中国的新闻比小说还要精彩
+中国外交方略让人惨不忍睹
+工信部从每个纳税人的口袋
+澳门特首选举的困局与危机
+西安市劳卫路西荷小学对面
+上海市教委组织的统一培训
+不是易非毁责。志空服金生
+传说的胡曾联手是一种假象
+青岛石化项目引发市民恐慌
+我以为我是人民的公仆,吃
+反对日本介入中国铁路工业
+吉林长春哪裡有假幣賣假錢
+对二甲基氨基苯重氮磺酸钠
+季戊四醇四硝酸酯制作过程
+供应手机来电号码修改软件
+供应手机任意显示软件电话
+无政府主义者食谱内容翻译
+老公的精彩之有妻大家尝
+无政府主义者食谱中文下载
+无政府主义者食谱电子手册
+无政府主义者食谱英文下载
+无政府主义者烹饪手册下载
+下载无政府主义者烹饪手册
+庐江官员艳照全套打包下载
+《俏尼姑仪琳异传》下载
+供应电视购物客户信息资料
+ fsgsddk566585fdjhdu559594hfghjdgkdcom
+性劫兰桂芳大友梨奈,曾玉茹
+S5甲氧基4氧代4H吡喃2基甲基O
+2013年北京户口办理指标预定
+她的姓是唐朝后面的那个朝代
+蒙元和满清是中国的敌对政权
+媒体就是昧着良心的一个群体
+美国总统鲜为人知的十大特权
+警校在地道战遗址的不当行为
+关于国保工作与时俱进的思考
+美国大使代替网络上的网友问
+告中国人民解放军广大官兵书
+关于做好定案材料工作的意见
+卡辛纳大道和三福大道交界处
+中国在统一问题上的投降主义
+中國國家領導人子女任職名單
+ www.zqfpw.com
+中國人民銀行发行的人民纸币
+苯乙基哌啶基丙酰胺柠檬酸盐
+供应手机来电号码随意显软件
+无政府主义者手册翻译版下载
+宅女在古代后宫的幸福生活
+无政府主义者烹饪手册rar下载
+无政府主义者烹饪手册pdf下载
+无政府主义者烹饪手册doc下载
+无政府主义者烹饪手册电子版
+无政府主义者烹饪手册中文版
+中文版无政府主义者烹饪手册
+无政府主义者的烹饪食谱下载
+中国各地甲型h1n1流感疫情汇总
+N苯乙基4哌啶基丙酰胺柠檬酸盐
+S5甲氨基2氧代134噻2唑32H基甲基O
+随意违反国家规定提拔任用干部
+责令百姓向政府申报收入并缴税
+夫人和孩子到美国都干了些什么
+王良范西江开发规划会议旁听记
+四川永川人民教师罢教运动口诀
+唐皇宫外情之二唐朝后宫的秘密
+我希望中国能有这样一道测试题
+香港永和电子国际科技有限公司
+N苯乙基4-哌啶基丙酰胺柠檬酸盐
+小说偷日同事女友的太恋荡了
+无政府主义者的烹饪食谱中文版
+无政府主义者的烹饪食谱英文版
+S5甲氨基2氧代134噻二唑32H基甲基O
+ 786ts.qqsafe-qqservicesyydswfhuw8ysjftwf.org
+首度披露我军令敌胆寒的四大神兵
+列强打击中国现代化进程是其一贯
+市管领导干部家属座谈会上的讲话
+我所犯严重的方向线路错误的检查
+解放者CAD文件STL模型设计图纸下载
+ 12hxajx.zij.yaq.58ui.90cj.wcs.500caipiao.com.cn
+自愿想退出“少先队员 团员 党员”
+综合能力科目考试个别试题出现错误
+金利军和锡林郭我向你们的良知呼唤
+关于对敌斗争中有关政政策界限汇编
+蒋匪军陆军部队师以上主官情况调查
+82甲基氨基甲基7甲氧基氨基3甲基黄酮
+是否司法不公应该从最后纠正的结果看
+玫琳凯泄密资料之政府公关机密记录档案
+公务员录用考试报考者违纪违规处理办法
+王国昌给南昌市广播电视局全体干部职工
+周水同志在全省计划工交工作会议上的报告
+手术对她们有好处。考虑到是一项公益事业
+N31-羟基2甲氨基乙基苯基甲烷磺酰胺甲磺酸盐
+病死鸡已大量流向全国
\ No newline at end of file
diff --git a/keywords-filter/filter-server/interceptor/auth.go b/keywords-filter/filter-server/interceptor/auth.go
new file mode 100644
index 0000000..dd1c366
--- /dev/null
+++ b/keywords-filter/filter-server/interceptor/auth.go
@@ -0,0 +1,38 @@
+package interceptor
+
+import (
+ "context"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/metadata"
+ "keywords-filter/pkg/config"
+ "keywords-filter/pkg/zerror"
+ "strings"
+)
+
+func UnaryAuthInterceptor(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {
+ if info.FullMethod != "/grpc.health.v1.Health/Check" {
+ err = oauth2Valid(ctx)
+ if err != nil {
+ return nil, err
+ }
+ }
+ return handler(ctx, req)
+}
+func oauth2Valid(ctx context.Context) error {
+ md, ok := metadata.FromIncomingContext(ctx)
+ if !ok {
+ return zerror.NewByMsg("元数据获取失败")
+ }
+ authorization := md["authorization"]
+
+ if len(authorization) < 1 {
+ return zerror.NewByMsg("元数据获取失败")
+ }
+
+ token := strings.TrimPrefix(authorization[0], "Bearer ")
+ cnf := config.GetConfig()
+ if token != cnf.Server.AccessToken {
+ return zerror.NewByMsg("鉴权失败")
+ }
+ return nil
+}
diff --git a/keywords-filter/filter-server/main.go b/keywords-filter/filter-server/main.go
new file mode 100644
index 0000000..fb32e37
--- /dev/null
+++ b/keywords-filter/filter-server/main.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/health"
+ "google.golang.org/grpc/health/grpc_health_v1"
+ "keywords-filter/filter-server/interceptor"
+ "keywords-filter/filter-server/server"
+ "keywords-filter/pkg/config"
+ "keywords-filter/pkg/filter"
+ "keywords-filter/pkg/log"
+ "keywords-filter/proto"
+ "net"
+)
+
+var (
+ configFile = flag.String("config", "dev.config.yaml", "")
+ dictFile = flag.String("dict", "dict.txt", "")
+ formatDict = flag.Bool("format", false, "")
+)
+
+func main() {
+ flag.Parse()
+ if *formatDict {
+ filter.OverwriteDict(*dictFile)
+ return
+ }
+
+ //初始化配置文件
+ config.InitConfig(*configFile)
+ cnf := config.GetConfig()
+ //初始化日志
+ log.SetLevel(cnf.Log.Level)
+ log.SetOutput(log.GetRotateWriter(cnf.Log.LogPath))
+ log.SetPrintCaller(true)
+ //初始话filter
+ filter.InitFilter(*dictFile)
+
+ lis, err := net.Listen("tcp", fmt.Sprintf("%s:%d", cnf.Server.IP, cnf.Server.Port))
+ if err != nil {
+ log.Fatal(err)
+ }
+ s := grpc.NewServer(grpc.UnaryInterceptor(interceptor.UnaryAuthInterceptor))
+ service := server.NewFilterService(filter.GetFilter())
+ proto.RegisterFilterServer(s, service)
+
+ healthCheckSrv := health.NewServer()
+ grpc_health_v1.RegisterHealthServer(s, healthCheckSrv)
+
+ if err = s.Serve(lis); err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/keywords-filter/filter-server/server/server.go b/keywords-filter/filter-server/server/server.go
new file mode 100644
index 0000000..3493c04
--- /dev/null
+++ b/keywords-filter/filter-server/server/server.go
@@ -0,0 +1,32 @@
+package server
+
+import (
+ "context"
+ "keywords-filter/pkg/filter"
+ "keywords-filter/proto"
+)
+
+type filterService struct {
+ proto.UnimplementedFilterServer
+ filter filter.IFilter
+}
+
+func NewFilterService(filter filter.IFilter) proto.FilterServer {
+ return &filterService{
+ filter: filter,
+ }
+}
+
+func (s *filterService) Validate(_ context.Context, in *proto.FilterReq) (*proto.ValidateRes, error) {
+ ok, word := s.filter.Validate(in.Text)
+ return &proto.ValidateRes{
+ Ok: ok,
+ Keyword: word,
+ }, nil
+}
+func (s *filterService) FindAll(_ context.Context, in *proto.FilterReq) (*proto.FindAllRes, error) {
+ words := s.filter.FindAll(in.Text)
+ return &proto.FindAllRes{
+ Keywords: words,
+ }, nil
+}
diff --git a/keywords-filter/go.mod b/keywords-filter/go.mod
new file mode 100644
index 0000000..2490c12
--- /dev/null
+++ b/keywords-filter/go.mod
@@ -0,0 +1,37 @@
+module keywords-filter
+
+go 1.20
+
+require (
+ github.com/importcjj/sensitive v0.0.0-20200106142752-42d1c505be7b
+ github.com/sirupsen/logrus v1.9.3
+ github.com/spf13/viper v1.19.0
+ google.golang.org/grpc v1.62.1
+ google.golang.org/protobuf v1.34.2
+ gopkg.in/natefinch/lumberjack.v2 v2.2.1
+)
+
+require (
+ github.com/fsnotify/fsnotify v1.7.0 // indirect
+ github.com/golang/protobuf v1.5.3 // indirect
+ github.com/hashicorp/hcl v1.0.0 // indirect
+ github.com/magiconair/properties v1.8.7 // indirect
+ github.com/mitchellh/mapstructure v1.5.0 // indirect
+ github.com/pelletier/go-toml/v2 v2.2.2 // indirect
+ github.com/sagikazarmark/locafero v0.4.0 // indirect
+ github.com/sagikazarmark/slog-shim v0.1.0 // indirect
+ github.com/sourcegraph/conc v0.3.0 // indirect
+ github.com/spf13/afero v1.11.0 // indirect
+ github.com/spf13/cast v1.6.0 // indirect
+ github.com/spf13/pflag v1.0.5 // indirect
+ github.com/subosito/gotenv v1.6.0 // indirect
+ go.uber.org/atomic v1.9.0 // indirect
+ go.uber.org/multierr v1.9.0 // indirect
+ golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
+ golang.org/x/net v0.26.0 // indirect
+ golang.org/x/sys v0.21.0 // indirect
+ golang.org/x/text v0.16.0 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect
+ gopkg.in/ini.v1 v1.67.0 // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
+)
diff --git a/keywords-filter/go.sum b/keywords-filter/go.sum
new file mode 100644
index 0000000..39dbbc7
--- /dev/null
+++ b/keywords-filter/go.sum
@@ -0,0 +1,86 @@
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
+github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
+github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+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/importcjj/sensitive v0.0.0-20200106142752-42d1c505be7b h1:9hudrgWUhyfR4FRMOfL9KB1uYw48DUdHkkgr9ODOw7Y=
+github.com/importcjj/sensitive v0.0.0-20200106142752-42d1c505be7b/go.mod h1:zLVdX6Ed2SvCbEamKmve16U0E03UkdJo4ls1TBfmc8Q=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
+github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
+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/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
+github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
+github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
+github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
+github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
+github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
+github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
+github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
+github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
+github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
+github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
+github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
+github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
+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.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
+github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
+github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
+go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
+go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
+go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
+golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
+golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
+golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
+golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
+golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
+golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
+google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk=
+google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
+google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
+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/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/yaml.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=
diff --git a/keywords-filter/grpc_health_probe-linux-amd64 b/keywords-filter/grpc_health_probe-linux-amd64
new file mode 100644
index 0000000..3f0da73
Binary files /dev/null and b/keywords-filter/grpc_health_probe-linux-amd64 differ
diff --git a/keywords-filter/keyword-dict.txt b/keywords-filter/keyword-dict.txt
new file mode 100644
index 0000000..bbdaeef
--- /dev/null
+++ b/keywords-filter/keyword-dict.txt
@@ -0,0 +1,192 @@
+ golang
+ defer
+ recover
+ sync
+ Protobuf
+ gin
+ grpc-gateway
+ OpenTelemetry
+ OTel
+ otel
+ k8s
+ Kubernetes
+ kubernetes
+ Docker
+ docker
+ Istio
+ istio
+ Prometheus
+ prometheus
+ cadvisor
+ cAdvisor
+ Elastic
+ Kibana
+ Grafana
+ apiserver
+ CI/CD
+ ci/cd
+ ArgoCD
+ argo
+ Argo
+ kaniko
+ Mesh
+ Volume
+ volume
+ promQL
+ PromQL
+ kafka
+ ingress
+ StorageClass
+ VolumeClaim
+ gitlab
+ openflow
+ dpdk
+ vpp
+ ovs
+ spdk
+ virtio
+ vhost
+ qemu
+ vSwitch
+ bridge
+ hugepage
+ nvme
+ dpvs
+ iperf3
+ rfc2544
+ ioengine
+ PCI
+ vxlan
+ gre
+ kni
+ Kernel
+内核
+ KernelThread
+内核线程
+ Virtual
+ memory
+虚拟内存
+内存屏障
+内存管理
+ Scheduler
+调度器
+ File
+文件系统
+ Device
+ driver
+设备驱动程序
+ Syscall
+系统调用
+ Process
+ scheduling
+进程调度
+ Page
+页表
+ Swap
+交换空间
+ Mount
+ Inode
+挂载
+索引节点
+ Block
+块设备
+ Character
+字符设备
+ IRQ
+ Kconfig
+内核配置
+ Perf
+ Ftrace
+内核跟踪工具
+ Valgrind
+内存调试工具
+ System
+系统定时器
+ DMA
+伙伴系统
+信号与槽
+ Signals
+ Slots
+事件处理程序
+ Event
+ QML
+多线程编程
+ Multithreading
+ Programming
+ QThread
+ QtQuick
+模型
+视图架构
+ Model/View
+ QObject
+ QWidget
+ QRegularExpression
+ QDesktopWidget
+ QNetworkAccessManager
+ QTcpServer
+ QTcpSocket
+ QUdpSocket
+ QMutex
+ SQLite/MySQL
+MySQL编程
+SQLite编程
+ OpenCV
+ OpenGL
+Qt数据库编程
+Qt网络编程
+ Linux
+ tcp
+ redis
+ mysql
+网络
+ nginx
+协程
+ io_uring
+内存泄漏
+ bpf
+ ebpf
+ skynet
+ openresty
+ RocksDB
+ TiDB
+ ceph
+ etcd
+ fuse
+ p2p
+
+ http
+ mqtt
+ cuda
+ mutex
+ spinlock
+ hash
+ rbtree
+ btree
+ Makefile
+ git
+ wrk
+ Cuda
+ CUDA
+ D3D
+ d3d
+ ffmpeg
+ RTSP
+ WebRTC
+ PCM
+ RGB
+ YUv
+ MP4
+ FLV
+ TS
+ VLC
+ EasylCE
+ flvAnalyser
+ mp4box
+ audacity
+ Elecard
+ AAC
+ h264
+ SDL
+ AVFormat
+ AVCodec
+ AVPacket
\ No newline at end of file
diff --git a/keywords-filter/pkg/config/config.go b/keywords-filter/pkg/config/config.go
new file mode 100644
index 0000000..ea45744
--- /dev/null
+++ b/keywords-filter/pkg/config/config.go
@@ -0,0 +1,42 @@
+package config
+
+import (
+ "github.com/spf13/viper"
+ "log"
+)
+
+type Config struct {
+ Server struct {
+ IP string
+ Port int
+ AccessToken string
+ }
+ Log struct {
+ Level string
+ LogPath string `mapstructure:"logPath"`
+ } `mapstructure:"log"`
+}
+
+var conf *Config
+
+func InitConfig(filePath string, typ ...string) {
+ v := viper.New()
+ v.SetConfigFile(filePath)
+ if len(typ) > 0 {
+ v.SetConfigType(typ[0])
+ }
+ err := v.ReadInConfig()
+ if err != nil {
+ log.Fatal(err)
+ }
+ conf = &Config{}
+ err = v.Unmarshal(conf)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+}
+
+func GetConfig() *Config {
+ return conf
+}
diff --git a/keywords-filter/pkg/filter/filter.go b/keywords-filter/pkg/filter/filter.go
new file mode 100644
index 0000000..1f7c592
--- /dev/null
+++ b/keywords-filter/pkg/filter/filter.go
@@ -0,0 +1,98 @@
+package filter
+
+import (
+ "bufio"
+ "github.com/importcjj/sensitive"
+ "keywords-filter/pkg/log"
+ "os"
+ "regexp"
+ "strings"
+)
+
+type IFilter interface {
+ Validate(text string) (bool, string)
+ FindAll(text string) []string
+}
+
+type filter struct {
+ filter *sensitive.Filter
+}
+
+func (f *filter) Validate(text string) (bool, string) {
+ text = " " + strings.Trim(text, " ") + " "
+ ok, word := f.filter.Validate(text)
+ return ok, word
+}
+func (f *filter) FindAll(text string) []string {
+ text = " " + strings.Trim(text, " ") + " "
+ list := f.filter.FindAll(text)
+ for i := 0; i < len(list); i++ {
+ list[i] = strings.Trim(list[i], " ")
+ }
+ return list
+}
+
+var _filter *filter
+
+func GetFilter() IFilter {
+ return _filter
+}
+
+func InitFilter(dictFilePath string) {
+ if dictFilePath == "" {
+ log.Fatal("请指定词库文件")
+ }
+ _, err := os.Stat(dictFilePath)
+ if os.IsNotExist(err) {
+ log.Fatal("词库文件不存在,请指定正确的词库文件")
+ }
+ f := sensitive.New()
+ f.UpdateNoisePattern("")
+ f.LoadWordDict(dictFilePath)
+ _filter = &filter{
+ filter: f,
+ }
+}
+
+func OverwriteDict(dictFilePath string) error {
+ file, err := os.Open(dictFilePath)
+ if err != nil {
+ log.Fatal(err)
+ return err
+ }
+ re := regexp.MustCompile(`\p{Han}+`)
+ newContent := ""
+ kwMp := make(map[string]struct{}, 0)
+
+ scanner := bufio.NewScanner(file)
+ for scanner.Scan() {
+ line := scanner.Text()
+ line = strings.Trim(line, " ")
+ //去重
+ if _, ok := kwMp[line]; ok {
+ continue
+ }
+ kwMp[line] = struct{}{}
+ match := re.FindString(line)
+ if match == "" {
+ newContent += " " + line + " \n"
+ } else {
+ newContent += line + "\n"
+ }
+ }
+ newContent = strings.Trim(newContent, "\n")
+ file.Close()
+ file, err = os.OpenFile(dictFilePath, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644)
+ defer file.Close()
+ if err != nil {
+ log.Fatal(err)
+ return err
+ }
+ _, err = file.WriteString(newContent)
+ if err != nil {
+ log.Fatal(err)
+ return err
+ }
+ return err
+
+}
diff --git a/keywords-filter/pkg/log/README.md b/keywords-filter/pkg/log/README.md
new file mode 100644
index 0000000..3e02b17
--- /dev/null
+++ b/keywords-filter/pkg/log/README.md
@@ -0,0 +1,3 @@
+# 日志框架
+1. 可通过包调用日志打印,也可以通过对象调用日志打印
+2. 可以自动切分日志文件
diff --git a/keywords-filter/pkg/log/hook.go b/keywords-filter/pkg/log/hook.go
new file mode 100644
index 0000000..a7a1cbf
--- /dev/null
+++ b/keywords-filter/pkg/log/hook.go
@@ -0,0 +1,19 @@
+package log
+
+import "github.com/sirupsen/logrus"
+import nativeLog "log"
+
+type errorHook struct {
+}
+
+func (*errorHook) Levels() []logrus.Level {
+ return []logrus.Level{
+ logrus.PanicLevel,
+ logrus.FatalLevel,
+ logrus.ErrorLevel,
+ }
+}
+func (*errorHook) Fire(entry *logrus.Entry) error {
+ nativeLog.Println(entry.Message, entry.Data)
+ return nil
+}
diff --git a/keywords-filter/pkg/log/log.go b/keywords-filter/pkg/log/log.go
new file mode 100644
index 0000000..520d547
--- /dev/null
+++ b/keywords-filter/pkg/log/log.go
@@ -0,0 +1,233 @@
+package log
+
+import (
+ "errors"
+ "fmt"
+ "github.com/sirupsen/logrus"
+ "io"
+ "runtime"
+)
+
+type ILogger interface {
+ SetLevel(lvl string)
+ SetOutput(writer io.Writer)
+ SetPrintCaller(bool)
+ SetCaller(caller func() (file string, line int, funcName string, err error))
+ Trace(args ...interface{})
+ Debug(args ...interface{})
+ Info(args ...interface{})
+ Warning(args ...interface{})
+ Error(args ...interface{})
+ Fatal(args ...interface{})
+ Panic(args ...interface{})
+ TraceF(format string, args ...interface{})
+ DebugF(format string, args ...interface{})
+ InfoF(format string, args ...interface{})
+ WarningF(format string, args ...interface{})
+ ErrorF(format string, args ...interface{})
+ FatalF(format string, args ...interface{})
+ PanicF(format string, args ...interface{})
+ WithFields(fields map[string]interface{}) ILogger
+}
+type Logger struct {
+ entry *logrus.Entry
+ // panic,fatal,error,warn,warning,info,debug,trace
+ level string
+ printCaller bool
+ caller func() (file string, line int, funcName string, err error)
+}
+
+// 设置日志打印级别
+func (l *Logger) SetLevel(lvl string) {
+ if lvl == "" {
+ return
+ }
+ level, err := logrus.ParseLevel(lvl)
+ if err == nil {
+ l.level = lvl
+ l.entry.Logger.Level = level
+ }
+}
+
+// 设置日志输出位置
+func (l *Logger) SetOutput(writer io.Writer) {
+ l.entry.Logger.SetOutput(writer)
+}
+
+// 设置是否打印调用信息
+func (l *Logger) SetPrintCaller(printCaller bool) {
+ l.printCaller = printCaller
+}
+func (l *Logger) SetCaller(caller func() (file string, line int, funcName string, err error)) {
+ l.caller = caller
+}
+
+// 获取caller信息
+func (l *Logger) getCallerInfo(level logrus.Level) map[string]interface{} {
+ mp := make(map[string]interface{})
+ if l.printCaller == true || level != logrus.InfoLevel {
+ file, line, funcName, err := l.caller()
+ if err == nil {
+ mp["file"] = fmt.Sprintf("%s:%d", file, line)
+ mp["func"] = funcName
+ }
+ }
+ return mp
+}
+
+func (l *Logger) log(level logrus.Level, args ...interface{}) {
+ l.entry.WithFields(l.getCallerInfo(level)).Log(level, args...)
+}
+func (l *Logger) logf(level logrus.Level, format string, args ...interface{}) {
+ l.entry.WithFields(l.getCallerInfo(level)).Logf(level, format, args...)
+}
+func (l *Logger) Trace(args ...interface{}) {
+ l.log(logrus.TraceLevel, args...)
+}
+func (l *Logger) Debug(args ...interface{}) {
+ l.log(logrus.DebugLevel, args...)
+}
+func (l *Logger) Info(args ...interface{}) {
+ l.log(logrus.InfoLevel, args...)
+}
+func (l *Logger) Warning(args ...interface{}) {
+ l.log(logrus.WarnLevel, args...)
+}
+func (l *Logger) Error(args ...interface{}) {
+ l.log(logrus.ErrorLevel, args...)
+}
+func (l *Logger) Fatal(args ...interface{}) {
+ l.log(logrus.FatalLevel, args...)
+}
+func (l *Logger) Panic(args ...interface{}) {
+ l.log(logrus.PanicLevel, args...)
+}
+func (l *Logger) TraceF(format string, args ...interface{}) {
+ l.logf(logrus.TraceLevel, format, args...)
+}
+func (l *Logger) DebugF(format string, args ...interface{}) {
+ l.logf(logrus.DebugLevel, format, args...)
+}
+func (l *Logger) InfoF(format string, args ...interface{}) {
+ l.logf(logrus.InfoLevel, format, args...)
+}
+func (l *Logger) WarningF(format string, args ...interface{}) {
+ l.logf(logrus.WarnLevel, format, args...)
+}
+func (l *Logger) ErrorF(format string, args ...interface{}) {
+ l.logf(logrus.ErrorLevel, format, args...)
+}
+func (l *Logger) FatalF(format string, args ...interface{}) {
+ l.logf(logrus.FatalLevel, format, args...)
+}
+func (l *Logger) PanicF(format string, args ...interface{}) {
+ l.logf(logrus.PanicLevel, format, args...)
+}
+func (l *Logger) WithFields(fields map[string]interface{}) ILogger {
+ entry := l.entry.WithFields(fields)
+ return &Logger{entry: entry, level: l.level, printCaller: l.printCaller, caller: l.caller}
+}
+
+var log *Logger
+
+func NewLogger() ILogger {
+ return newLogger()
+}
+func newLogger() *Logger {
+ log := logrus.New()
+ log.SetLevel(logrus.InfoLevel)
+ log.AddHook(&errorHook{})
+ logger := &Logger{
+ entry: logrus.NewEntry(log),
+ caller: defaultCaller,
+ }
+ return logger
+}
+
+func init() {
+ log = newLogger()
+}
+
+// 设置日志打印级别
+func SetLevel(lvl string) {
+ if lvl == "" {
+ return
+ }
+ level, err := logrus.ParseLevel(lvl)
+ if err == nil {
+ log.level = lvl
+ log.entry.Logger.Level = level
+ }
+}
+
+// 设置日志的输出位置
+func SetOutput(writer io.Writer) {
+ log.entry.Logger.SetOutput(writer)
+}
+
+// 设置是否打印调用信息
+func SetPrintCaller(printCaller bool) {
+ log.printCaller = printCaller
+}
+
+func SetCaller(caller func() (file string, line int, funcName string, err error)) {
+ log.caller = caller
+}
+
+func defaultCaller() (file string, line int, funcName string, err error) {
+ pc, f, l, ok := runtime.Caller(4)
+ if !ok {
+ err = errors.New("caller failure")
+ return
+ }
+ funcName = runtime.FuncForPC(pc).Name()
+ file, line = f, l
+ return
+}
+
+func Trace(args ...interface{}) {
+ log.log(logrus.TraceLevel, args...)
+}
+func Debug(args ...interface{}) {
+ log.log(logrus.DebugLevel, args...)
+}
+func Info(args ...interface{}) {
+ log.log(logrus.InfoLevel, args...)
+}
+func Warning(args ...interface{}) {
+ log.log(logrus.WarnLevel, args...)
+}
+func Error(args ...interface{}) {
+ log.log(logrus.ErrorLevel, args...)
+}
+func Fatal(args ...interface{}) {
+ log.log(logrus.FatalLevel, args...)
+}
+func Panic(args ...interface{}) {
+ log.log(logrus.PanicLevel, args...)
+}
+func TraceF(format string, args ...interface{}) {
+ log.logf(logrus.TraceLevel, format, args...)
+}
+func DebugF(format string, args ...interface{}) {
+ log.logf(logrus.DebugLevel, format, args...)
+}
+func InfoF(format string, args ...interface{}) {
+ log.logf(logrus.InfoLevel, format, args...)
+}
+func WarningF(format string, args ...interface{}) {
+ log.logf(logrus.WarnLevel, format, args...)
+}
+func ErrorF(format string, args ...interface{}) {
+ log.logf(logrus.ErrorLevel, format, args...)
+}
+func FatalF(format string, args ...interface{}) {
+ log.logf(logrus.FatalLevel, format, args...)
+}
+func PanicF(format string, args ...interface{}) {
+ log.logf(logrus.PanicLevel, format, args...)
+}
+func WithFields(fields map[string]interface{}) *Logger {
+ entry := log.entry.WithFields(fields)
+ return &Logger{entry: entry, level: log.level, printCaller: log.printCaller, caller: log.caller}
+}
diff --git a/keywords-filter/pkg/log/rotate_writer.go b/keywords-filter/pkg/log/rotate_writer.go
new file mode 100644
index 0000000..7bec60b
--- /dev/null
+++ b/keywords-filter/pkg/log/rotate_writer.go
@@ -0,0 +1,58 @@
+package log
+
+import (
+ "gopkg.in/natefinch/lumberjack.v2"
+ "io"
+ "sync"
+)
+
+type fileRotateWriter struct {
+ data map[string]io.Writer
+ sync.RWMutex
+}
+
+func (frw *fileRotateWriter) getWriter(logPath string) io.Writer {
+ frw.RLock()
+ defer frw.RUnlock()
+ w, ok := frw.data[logPath]
+ if !ok {
+ return nil
+ }
+ return w
+}
+func (frw *fileRotateWriter) setWriter(logPath string, w io.Writer) io.Writer {
+ frw.Lock()
+ defer frw.Unlock()
+ frw.data[logPath] = w
+ return w
+}
+
+var _fileRotateWriter *fileRotateWriter
+
+func init() {
+ _fileRotateWriter = &fileRotateWriter{
+ data: map[string]io.Writer{},
+ }
+}
+
+func GetRotateWriter(logPath string) io.Writer {
+ if logPath == "" {
+ panic("日志文件路径不能为空")
+ }
+ writer := _fileRotateWriter.getWriter(logPath)
+ if writer != nil {
+ return writer
+ }
+ writer = &lumberjack.Logger{
+ //文件名
+ Filename: logPath,
+ //单个文件大小单位MB
+ MaxSize: 1,
+ //最多保留文件数
+ MaxBackups: 15,
+ //最长保留时间(天)
+ MaxAge: 7,
+ LocalTime: true,
+ }
+ return _fileRotateWriter.setWriter(logPath, writer)
+}
diff --git a/keywords-filter/pkg/zerror/error_code.go b/keywords-filter/pkg/zerror/error_code.go
new file mode 100644
index 0000000..0aacd5c
--- /dev/null
+++ b/keywords-filter/pkg/zerror/error_code.go
@@ -0,0 +1,14 @@
+package zerror
+
+type ZErrorCode string
+
+func getErrMsg(errCode ZErrorCode) string {
+ msg, ok := errorMsgs[errCode]
+ if ok {
+ return msg
+ }
+ return ""
+}
+
+// 错误码与之对应的错误消息
+var errorMsgs = map[ZErrorCode]string{}
diff --git a/keywords-filter/pkg/zerror/zerror.go b/keywords-filter/pkg/zerror/zerror.go
new file mode 100644
index 0000000..bf1a76b
--- /dev/null
+++ b/keywords-filter/pkg/zerror/zerror.go
@@ -0,0 +1,101 @@
+package zerror
+
+import (
+ "errors"
+ "fmt"
+)
+
+type ZError struct {
+ ErrCode ZErrorCode `json:"err_code,omitempty"`
+ ErrMsg string `json:"err_msg,omitempty"`
+ errs []error
+}
+
+func (e *ZError) Error() string {
+ if e == nil {
+ return ""
+ }
+ if e.ErrMsg != "" {
+ return fmt.Sprintf("ErrCode:%s; ErrMsg:%s;", e.ErrCode, e.ErrMsg)
+ }
+ res := ""
+ if e.errs == nil || len(e.errs) == 0 {
+ return res
+ }
+ var first = true
+ for _, err := range e.errs {
+ if first {
+ res = err.Error()
+ first = false
+ } else {
+ res += ";" + err.Error()
+ }
+ }
+ return res
+}
+func (e *ZError) Errors() []error {
+ if e == nil {
+ return nil
+ }
+ return e.errs
+}
+func (e *ZError) Append(err error) {
+ if e == nil || err == nil {
+ return
+ }
+ ze, ok := err.(*ZError)
+ if ok {
+ e.errs = append(e.errs, ze.errs...)
+ } else {
+ e.errs = append(e.errs, err)
+ }
+}
+
+func NewByErr(err ...error) error {
+ res := &ZError{
+ errs: make([]error, 0),
+ }
+ for i, e := range err {
+ if e == nil {
+ continue
+ }
+ ze, ok := err[i].(*ZError)
+ if ok {
+ res.errs = append(res.errs, ze.errs...)
+ } else {
+ res.errs = append(res.errs, err[i])
+ }
+ }
+ if len(res.errs) > 0 {
+ return res
+ }
+ return nil
+}
+func NewByCode(errCode ZErrorCode, errMsg ...string) error {
+ msg := ""
+ if len(errMsg) > 0 {
+ msg = errMsg[0]
+ } else {
+ msg = getErrMsg(errCode)
+ }
+ return &ZError{
+ ErrCode: errCode,
+ ErrMsg: msg,
+ }
+}
+func NewByMsg(msg string) error {
+ err := errors.New(msg)
+ return NewByErr(err)
+}
+func Errors(err error) []error {
+ if err == nil {
+ return nil
+ }
+ ze, ok := err.(*ZError)
+ if !ok {
+ return []error{err}
+ }
+ //将一个空的[]error切片与ze.Errors()返回的错误切片合并在一起
+ //返回一个新切片
+ return append(([]error)(nil), ze.Errors()...)
+}
diff --git a/keywords-filter/proto/filter.pb.go b/keywords-filter/proto/filter.pb.go
new file mode 100644
index 0000000..31da090
--- /dev/null
+++ b/keywords-filter/proto/filter.pb.go
@@ -0,0 +1,294 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.28.1
+// protoc v4.22.0
+// source: proto/filter.proto
+
+package proto
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type FilterReq struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+}
+
+func (x *FilterReq) Reset() {
+ *x = FilterReq{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_filter_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *FilterReq) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FilterReq) ProtoMessage() {}
+
+func (x *FilterReq) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_filter_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use FilterReq.ProtoReflect.Descriptor instead.
+func (*FilterReq) Descriptor() ([]byte, []int) {
+ return file_proto_filter_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *FilterReq) GetText() string {
+ if x != nil {
+ return x.Text
+ }
+ return ""
+}
+
+type ValidateRes struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"`
+ Keyword string `protobuf:"bytes,2,opt,name=keyword,proto3" json:"keyword,omitempty"`
+}
+
+func (x *ValidateRes) Reset() {
+ *x = ValidateRes{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_filter_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ValidateRes) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ValidateRes) ProtoMessage() {}
+
+func (x *ValidateRes) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_filter_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ValidateRes.ProtoReflect.Descriptor instead.
+func (*ValidateRes) Descriptor() ([]byte, []int) {
+ return file_proto_filter_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *ValidateRes) GetOk() bool {
+ if x != nil {
+ return x.Ok
+ }
+ return false
+}
+
+func (x *ValidateRes) GetKeyword() string {
+ if x != nil {
+ return x.Keyword
+ }
+ return ""
+}
+
+type FindAllRes struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Keywords []string `protobuf:"bytes,1,rep,name=keywords,proto3" json:"keywords,omitempty"`
+}
+
+func (x *FindAllRes) Reset() {
+ *x = FindAllRes{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_proto_filter_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *FindAllRes) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FindAllRes) ProtoMessage() {}
+
+func (x *FindAllRes) ProtoReflect() protoreflect.Message {
+ mi := &file_proto_filter_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use FindAllRes.ProtoReflect.Descriptor instead.
+func (*FindAllRes) Descriptor() ([]byte, []int) {
+ return file_proto_filter_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *FindAllRes) GetKeywords() []string {
+ if x != nil {
+ return x.Keywords
+ }
+ return nil
+}
+
+var File_proto_filter_proto protoreflect.FileDescriptor
+
+var file_proto_filter_proto_rawDesc = []byte{
+ 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5f, 0x66,
+ 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d,
+ 0x22, 0x1f, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a,
+ 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78,
+ 0x74, 0x22, 0x37, 0x0a, 0x0b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73,
+ 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b,
+ 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x28, 0x0a, 0x0a, 0x46, 0x69,
+ 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x77,
+ 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x77,
+ 0x6f, 0x72, 0x64, 0x73, 0x32, 0xbe, 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12,
+ 0x5a, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x6b, 0x65,
+ 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x7a, 0x76,
+ 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52,
+ 0x65, 0x71, 0x1a, 0x27, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5f, 0x66, 0x69,
+ 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2e,
+ 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x07, 0x46,
+ 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x12, 0x25, 0x2e, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64,
+ 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e,
+ 0x63, 0x6f, 0x6d, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x26, 0x2e,
+ 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e,
+ 0x7a, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41,
+ 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x42, 0x17, 0x5a, 0x15, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64,
+ 0x73, 0x2d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_proto_filter_proto_rawDescOnce sync.Once
+ file_proto_filter_proto_rawDescData = file_proto_filter_proto_rawDesc
+)
+
+func file_proto_filter_proto_rawDescGZIP() []byte {
+ file_proto_filter_proto_rawDescOnce.Do(func() {
+ file_proto_filter_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_filter_proto_rawDescData)
+ })
+ return file_proto_filter_proto_rawDescData
+}
+
+var file_proto_filter_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_proto_filter_proto_goTypes = []interface{}{
+ (*FilterReq)(nil), // 0: keywords_filter.zvoice.com.FilterReq
+ (*ValidateRes)(nil), // 1: keywords_filter.zvoice.com.ValidateRes
+ (*FindAllRes)(nil), // 2: keywords_filter.zvoice.com.FindAllRes
+}
+var file_proto_filter_proto_depIdxs = []int32{
+ 0, // 0: keywords_filter.zvoice.com.Filter.Validate:input_type -> keywords_filter.zvoice.com.FilterReq
+ 0, // 1: keywords_filter.zvoice.com.Filter.FindAll:input_type -> keywords_filter.zvoice.com.FilterReq
+ 1, // 2: keywords_filter.zvoice.com.Filter.Validate:output_type -> keywords_filter.zvoice.com.ValidateRes
+ 2, // 3: keywords_filter.zvoice.com.Filter.FindAll:output_type -> keywords_filter.zvoice.com.FindAllRes
+ 2, // [2:4] is the sub-list for method output_type
+ 0, // [0:2] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_proto_filter_proto_init() }
+func file_proto_filter_proto_init() {
+ if File_proto_filter_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_proto_filter_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*FilterReq); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_filter_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ValidateRes); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_proto_filter_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*FindAllRes); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_proto_filter_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 3,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_proto_filter_proto_goTypes,
+ DependencyIndexes: file_proto_filter_proto_depIdxs,
+ MessageInfos: file_proto_filter_proto_msgTypes,
+ }.Build()
+ File_proto_filter_proto = out.File
+ file_proto_filter_proto_rawDesc = nil
+ file_proto_filter_proto_goTypes = nil
+ file_proto_filter_proto_depIdxs = nil
+}
diff --git a/keywords-filter/proto/filter.proto b/keywords-filter/proto/filter.proto
new file mode 100644
index 0000000..1f93144
--- /dev/null
+++ b/keywords-filter/proto/filter.proto
@@ -0,0 +1,20 @@
+syntax = "proto3";
+option go_package = "keywords-filter/proto";
+package keywords_filter.zvoice.com;
+
+message FilterReq {
+ string text = 1;
+}
+
+message ValidateRes {
+ bool ok = 1;
+ string keyword = 2;
+}
+
+message FindAllRes {
+ repeated string keywords = 1;
+}
+service Filter {
+ rpc Validate(FilterReq) returns (ValidateRes);
+ rpc FindAll(FilterReq) returns (FindAllRes);
+}
\ No newline at end of file
diff --git a/keywords-filter/proto/filter_grpc.pb.go b/keywords-filter/proto/filter_grpc.pb.go
new file mode 100644
index 0000000..ff07e75
--- /dev/null
+++ b/keywords-filter/proto/filter_grpc.pb.go
@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.2.0
+// - protoc v4.22.0
+// source: proto/filter.proto
+
+package proto
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// FilterClient is the client API for Filter service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type FilterClient interface {
+ Validate(ctx context.Context, in *FilterReq, opts ...grpc.CallOption) (*ValidateRes, error)
+ FindAll(ctx context.Context, in *FilterReq, opts ...grpc.CallOption) (*FindAllRes, error)
+}
+
+type filterClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewFilterClient(cc grpc.ClientConnInterface) FilterClient {
+ return &filterClient{cc}
+}
+
+func (c *filterClient) Validate(ctx context.Context, in *FilterReq, opts ...grpc.CallOption) (*ValidateRes, error) {
+ out := new(ValidateRes)
+ err := c.cc.Invoke(ctx, "/keywords_filter.zvoice.com.Filter/Validate", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *filterClient) FindAll(ctx context.Context, in *FilterReq, opts ...grpc.CallOption) (*FindAllRes, error) {
+ out := new(FindAllRes)
+ err := c.cc.Invoke(ctx, "/keywords_filter.zvoice.com.Filter/FindAll", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// FilterServer is the server API for Filter service.
+// All implementations must embed UnimplementedFilterServer
+// for forward compatibility
+type FilterServer interface {
+ Validate(context.Context, *FilterReq) (*ValidateRes, error)
+ FindAll(context.Context, *FilterReq) (*FindAllRes, error)
+ mustEmbedUnimplementedFilterServer()
+}
+
+// UnimplementedFilterServer must be embedded to have forward compatible implementations.
+type UnimplementedFilterServer struct {
+}
+
+func (UnimplementedFilterServer) Validate(context.Context, *FilterReq) (*ValidateRes, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method Validate not implemented")
+}
+func (UnimplementedFilterServer) FindAll(context.Context, *FilterReq) (*FindAllRes, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method FindAll not implemented")
+}
+func (UnimplementedFilterServer) mustEmbedUnimplementedFilterServer() {}
+
+// UnsafeFilterServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to FilterServer will
+// result in compilation errors.
+type UnsafeFilterServer interface {
+ mustEmbedUnimplementedFilterServer()
+}
+
+func RegisterFilterServer(s grpc.ServiceRegistrar, srv FilterServer) {
+ s.RegisterService(&Filter_ServiceDesc, srv)
+}
+
+func _Filter_Validate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(FilterReq)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(FilterServer).Validate(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/keywords_filter.zvoice.com.Filter/Validate",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(FilterServer).Validate(ctx, req.(*FilterReq))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Filter_FindAll_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(FilterReq)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(FilterServer).FindAll(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/keywords_filter.zvoice.com.Filter/FindAll",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(FilterServer).FindAll(ctx, req.(*FilterReq))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// Filter_ServiceDesc is the grpc.ServiceDesc for Filter service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var Filter_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "keywords_filter.zvoice.com.Filter",
+ HandlerType: (*FilterServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "Validate",
+ Handler: _Filter_Validate_Handler,
+ },
+ {
+ MethodName: "FindAll",
+ Handler: _Filter_FindAll_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "proto/filter.proto",
+}
diff --git a/tokenizer/Dockerfile b/tokenizer/Dockerfile
new file mode 100644
index 0000000..d319e95
--- /dev/null
+++ b/tokenizer/Dockerfile
@@ -0,0 +1,11 @@
+FROM quay.io/0voice/python:3.10-alpine
+WORKDIR /app
+ENV PORT 3002
+
+ADD ./tokenizer.py /app
+ADD ./requirements.txt /app
+
+RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn --upgrade pip
+RUN pip install --root-user-action=ignore -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn -r requirements.txt
+
+CMD ["sh","-c","nuxt --port ${PORT} --module tokenizer.py --workers 2"]
\ No newline at end of file
diff --git a/tokenizer/README.md b/tokenizer/README.md
new file mode 100644
index 0000000..e7a42df
--- /dev/null
+++ b/tokenizer/README.md
@@ -0,0 +1,6 @@
+# tokenizer
+
+## 镜像构建
+```
+docker build -t tokenizer:1.0.0 .
+```
\ No newline at end of file
diff --git a/tokenizer/requirements.txt b/tokenizer/requirements.txt
new file mode 100644
index 0000000..98563a6
--- /dev/null
+++ b/tokenizer/requirements.txt
@@ -0,0 +1,2 @@
+nuxt>=0.2.0
+tiktoken>=0.3.3
\ No newline at end of file
diff --git a/tokenizer/tokenizer.py b/tokenizer/tokenizer.py
new file mode 100644
index 0000000..9440287
--- /dev/null
+++ b/tokenizer/tokenizer.py
@@ -0,0 +1,65 @@
+from nuxt import route, logger, Request
+from nuxt.repositorys.validation import fields, use_args
+import traceback
+import tiktoken
+
+encoding_cache = {}
+
+support_models = set(["kimi-k2.5",
+ "gpt-3.5-turbo",
+ "gpt-3.5-turbo-16k",
+ "gpt-4",
+ "gpt-4-32k"])
+
+support_model_prefixes = (
+ "gpt-3.5-turbo-",
+ "gpt-4-",
+ "moonshot-",
+ "kimi-",
+)
+
+
+@route("/tokenizer/", methods=["POST"])
+@use_args({
+ "role": fields.Str(required=True),
+ "content": fields.Str(required=True),
+ "name": fields.Str(required=False)
+}, location="json")
+def get_num_tokens(req: Request, message: dict, model_name: str):
+ try:
+ return {
+ "code": 200,
+ "num_tokens": num_tokens_from_messages([message], model=model_name)
+ }
+ except Exception as e:
+ logger.error(traceback.format_exc())
+ return {
+ "code": 500,
+ "msg": "{}".format(e)
+ }
+
+
+def num_tokens_from_messages(messages, model="gpt-3.5-turbo"):
+ """Returns the number of tokens used by a list of messages."""
+ encoding = None
+ if model in encoding_cache:
+ encoding = encoding_cache.get(model)
+ else:
+ try:
+ encoding = tiktoken.encoding_for_model(model)
+ except KeyError:
+ encoding = tiktoken.get_encoding("cl100k_base")
+ encoding_cache[model] = encoding
+ if model in support_models or model.startswith(support_model_prefixes):
+ num_tokens = 0
+ for message in messages:
+ num_tokens += 4 # every message follows {role/name}\n{content}\n
+ for key, value in message.items():
+ num_tokens += len(encoding.encode(value))
+ if key == "name": # if there's a name, the role is omitted
+ num_tokens += -1 # role is always required and always 1 token
+ num_tokens += 3 # every reply is primed with assistant
+ return num_tokens
+ else:
+ raise NotImplementedError(f"""num_tokens_from_messages() is not presently implemented for model {model}.
+See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.""")