jason 1 ano atrás
commit
edf58f4848
84 arquivos alterados com 17936 adições e 0 exclusões
  1. 0 0
      CHANGELOG.md
  2. 5 0
      Dockerfile.in
  3. 27 0
      Makefile
  4. 11 0
      README.md
  5. 1 0
      VERSION
  6. 43 0
      app.spec.in
  7. 4 0
      conf/app.conf
  8. 4 0
      conf/app.conf.in
  9. 17 0
      conf/app.service.in
  10. 15 0
      conf/app.yaml
  11. 15 0
      conf/app.yaml.in
  12. 64 0
      conf/common.yaml
  13. 112 0
      config/config.go
  14. 8 0
      consts/common.go
  15. 12 0
      consts/maintainance.go
  16. 22 0
      errors/error.go
  17. 132 0
      etcd/etcd.go
  18. 21 0
      go.mod
  19. 566 0
      go.sum
  20. 45 0
      imagebuild.sh
  21. 345 0
      impl/rcvr.go
  22. 120 0
      impl/v1/brand/list.go
  23. 106 0
      impl/v1/brand/maker.go
  24. 140 0
      impl/v1/brand/search.go
  25. 92 0
      impl/v1/brand/update.go
  26. 72 0
      impl/v1/maintainance/c2.go
  27. 111 0
      impl/v1/maintainance/choose.go
  28. 41 0
      impl/v1/maintainance/delete.go
  29. 244 0
      impl/v1/maintainance/get.go
  30. 129 0
      impl/v1/maintainance/item.go
  31. 150 0
      impl/v1/maintainance/style_item.go
  32. 495 0
      impl/v1/maintainance/template.go
  33. 213 0
      impl/v1/maintainance/update.go
  34. 74 0
      impl/v1/query/brand.go
  35. 22 0
      impl/v1/query/center.go
  36. 103 0
      impl/v1/query/series.go
  37. 109 0
      impl/v1/query/style.go
  38. 128 0
      impl/v1/series/list.go
  39. 77 0
      impl/v1/series/update.go
  40. 233 0
      impl/v1/style/export.go
  41. 338 0
      impl/v1/style/info.go
  42. 141 0
      impl/v1/style/list.go
  43. 142 0
      impl/v1/style/update.go
  44. 1 0
      init
  45. 1 0
      logs/adm-vehicle-style.log
  46. 135 0
      main.go
  47. 143 0
      model/ads14.go
  48. 37 0
      model/c2_item.go
  49. 73 0
      model/export_style_task.go
  50. 101 0
      model/maintain_detail.go
  51. 96 0
      model/maintain_detail_template.go
  52. 53 0
      model/maintain_item.go
  53. 62 0
      model/maintain_template.go
  54. 67 0
      model/maintain_title.go
  55. 81 0
      model/maintain_title_template.go
  56. 120 0
      model/pagination.go
  57. 74 0
      model/style_item.go
  58. 71 0
      model/sy_brand.go
  59. 127 0
      model/sy_series.go
  60. 380 0
      model/sy_style.go
  61. 2 0
      nohup.out
  62. 96 0
      parser/config.go
  63. 61 0
      parser/database.go
  64. 30 0
      parser/init.go
  65. 57 0
      parser/logger.go
  66. 61 0
      parser/redis.go
  67. 24 0
      pb/ReadMe.md
  68. 127 0
      pb/adm_data.pb.go
  69. 13 0
      pb/adm_data.proto
  70. 1296 0
      pb/adm_vehicle_style.pb.go
  71. 74 0
      pb/adm_vehicle_style.proto
  72. 56 0
      pb/setup.go
  73. 131 0
      pb/v1/data.pb.go
  74. 16 0
      pb/v1/data.proto
  75. 7302 0
      pb/v1/vehicle_style.pb.go
  76. 801 0
      pb/v1/vehicle_style.proto
  77. 76 0
      protogen.sh
  78. 125 0
      rpmbuild.sh
  79. 92 0
      sh/app.in
  80. 152 0
      sh/init-multi-mode
  81. 682 0
      sh/start-stop-functions
  82. 25 0
      tests/client.go
  83. 246 0
      tests/v1_test.go
  84. 20 0
      utils/log.go

+ 0 - 0
CHANGELOG.md


+ 5 - 0
Dockerfile.in

@@ -0,0 +1,5 @@
+FROM hb.autocareai.cn/library/busybox:v1
+
+WORKDIR /demo
+COPY %APP_NAME% .
+CMD ["./%APP_NAME%"]

+ 27 - 0
Makefile

@@ -0,0 +1,27 @@
+# Go parameters
+GOCMD=go
+GOBUILD=$(GOCMD) build
+GOCLEAN=$(GOCMD) clean
+GOTEST=$(GOCMD) test
+GOGET=$(GOCMD) get
+
+SERVICE_NAME = $(shell pwd |sed 's/^\(.*\)[/]//' )
+PROJECT_NAME=${SERVICE_NAME}
+BIN_DIR=/usr/sbin
+CP_CMD=/usr/bin/cp
+COMMAND=${SERVICE_NAME}
+
+all: build-go
+
+build-go:
+	go build -o $(PROJECT_NAME) -v  -ldflags "-X main.Version=$(version) -X main.GitCommit=`git rev-parse HEAD`"
+test:
+	$(GOTEST) -v ./...
+install:build
+	$(CP_CMD) $(COMMAND) $(DESTDIR)$(BIN_DIR)
+clean:
+	$(GOCLEAN)
+	rm -f $(PROJECT_NAME)
+
+
+

+ 11 - 0
README.md

@@ -0,0 +1,11 @@
+# adm-vehicle-style
+
+### 一、概括说明
+本工程为基于 [gRPC](https://grpc.io/) 框架的微服务demo。
+
+### 二、环境搭建
+开发搭建流程请前往 [TAPD说明文档](https://www.tapd.cn/52529947/markdown_wikis/?#1152529947001000876) 查阅
+
+### 三、软件要求
+1. go版本 >= 1.13,[链接下载](https://golang.org/dl/)
+2. 操作系统:`Windows`/`Linux`/`Darwin(MacOS)`

+ 1 - 0
VERSION

@@ -0,0 +1 @@
+0.1

+ 43 - 0
app.spec.in

@@ -0,0 +1,43 @@
+Summary:  %APP_NAME% microservice
+Name: %APP_NAME%
+Version: stable
+Release: l
+License: user EULA
+Source: %APP_NAME%-%VERSION%.tgz
+Group: autocareai/gateway
+BuildRoot: /tmp
+
+%define __debug_install_post   \
+   %{_rpmconfigdir}/find-debuginfo.sh %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"\
+%{nil}
+
+%description
+%prep
+%setup -c
+
+%install
+echo %VERSION%
+mkdir -p ${RPM_BUILD_ROOT}/opt/%APP_NAME%/bin
+install ./%APP_NAME% ${RPM_BUILD_ROOT}/opt/%APP_NAME%/bin
+
+
+mkdir -p ${RPM_BUILD_ROOT}/etc/init.d/
+install ./sh/app ${RPM_BUILD_ROOT}/etc/init.d/%APP_NAME%
+
+mkdir -p ${RPM_BUILD_ROOT}/etc/%APP_NAME%/lib/
+install ./sh/init-multi-mode ${RPM_BUILD_ROOT}/etc/%APP_NAME%/lib/
+install ./sh/start-stop-functions ${RPM_BUILD_ROOT}/etc/%APP_NAME%/lib/
+
+mkdir -p ${RPM_BUILD_ROOT}/usr/lib/systemd/system/
+install ./conf/%APP_NAME%.service ${RPM_BUILD_ROOT}/usr/lib/systemd/system/
+
+%files
+/opt/%APP_NAME%/bin/%APP_NAME%
+/etc/init.d/%APP_NAME%
+/etc/%APP_NAME%/lib/start-stop-functions
+/etc/%APP_NAME%/lib/init-multi-mode
+/usr/lib/systemd/system/%APP_NAME%.service
+
+%post 
+#systemctl start %APP_NAME%
+#systemctl enable %APP_NAME%

+ 4 - 0
conf/app.conf

@@ -0,0 +1,4 @@
+serviceIp = "0.0.0.0"
+servicePort = "40053"
+etcdAddr = "47.108.30.231:22379"
+discoveryType = "etcd"

+ 4 - 0
conf/app.conf.in

@@ -0,0 +1,4 @@
+serviceIp = "%SERVE_ADDR%"
+servicePort = "%SERVE_PORT%"
+etcdAddr = "%ETCD_ADDR%:%ETCD_PORT%"
+discoveryType = "%DISCOVERY_TYPE%"

+ 17 - 0
conf/app.service.in

@@ -0,0 +1,17 @@
+[Unit]
+Description=Start %APP_NAME% Server
+Requires=network-online.target
+# We disable the wants service, because it spams the log files
+
+[Service]
+ExecStart=/etc/init.d/%APP_NAME% start
+ExecStop=/etc/init.d/%APP_NAME% stop
+Type=forking
+# We disable PIDFile= because it doesn't work with multi-mode configurations
+#PIDFile=/var/run/camera.pid
+
+TimeoutStopSec=300
+
+[Install]
+WantedBy=multi-user.target
+

+ 15 - 0
conf/app.yaml

@@ -0,0 +1,15 @@
+runMode: dev
+rpc:
+  prefix: adm 
+  ADMVehicleStyle:
+    serviceName: adm-vehicle-style
+    serviceIp: 0.0.0.0
+    servicePort: 50001
+etcd:
+  addrs:
+  - "127.0.0.1:2379"
+encryptKey: abcdef123456
+log:
+  path: logs/
+projectName: adm
+discoveryType: etcd

+ 15 - 0
conf/app.yaml.in

@@ -0,0 +1,15 @@
+runMode: %RUNMODE%
+rpc:
+  prefix: adm 
+  ADMVehicleStyle:
+    serviceName: %APP_NAME%
+    serviceIp: %SERVE_ADDR%
+    servicePort: %SERVE_PORT%
+etcd:
+  addrs:
+  - "%ETCD_ADDR%:%ETCD_PORT%"
+encryptKey: %ENCRYPT_KEY%
+log:
+  path: %LOG_DIR%
+projectName: adm
+discoveryType: %DISCOVERY_TYPE%

+ 64 - 0
conf/common.yaml

@@ -0,0 +1,64 @@
+runMode: dev
+k8s: 'false'
+log:
+  path: logs
+  maxBackups: '7'
+  maxSize: '100'
+  maxAge: '30'
+  level: debug
+  stacktrace: 'false'
+mysql:
+  user: root
+  password: 1353406
+  addr: 47.103.201.156:3306
+  db: db_adm_management
+  charset: utf8
+  maxIdle: '10'
+  maxConn: '100'
+  logMode: 'true'
+redis:
+  addrs:
+  - 127.0.0.1:6379
+  password: ''
+  db: '0'
+  poolSize: '100'
+  minIdleConns: '10'
+  maxRetries: '1'
+  cluster: 'false'
+elastic:
+  addrs:
+  - http://127.0.0.1:9200
+  sniff: 'false'
+mongo:
+  addr: 127.0.0.1:27017
+  user: root
+  password: root
+rpc:
+  prefix: adm
+  keepalive:
+    clientTime: '10'
+    clientTimeout: '1'
+    serverTime: '5'
+    serverMinitime: '5'
+    serverTimeout: '1'
+  ADMVehicleStyle:
+    serviceName: adm-vehicle-style
+    servicePort: '10001'
+    serviceIp: 127.0.0.1
+    mysqlDb: 'db_adm_ads'
+    redisDb: '0'
+    logLevel: debug
+    logStacktrace: 'false'
+etcd:
+  addrs:
+  - 127.0.0.1:2379
+oss:
+  accessKey: LTAI5tMXuRXxUbNuD69ryfUh
+  accessSecret: Pujpylo7AJ57pUCJR0NJR6HROLhVYb
+  bucket: gd-dev-test
+  downLoadBucket: gd-dev-test
+  endPoint: oss-cn-shanghai.aliyuncs.com
+  defaultBrandImage: https://gd-image.oss-cn-shanghai.aliyuncs.com/brand-img/default.png
+  brandImage: https://gd-image.oss-cn-shanghai.aliyuncs.com/brand-img/
+  defaultSeriesImage: https://gd-image.oss-cn-shanghai.aliyuncs.com/series-m/default.png
+  seriesImage: https://gd-image.oss-cn-shanghai.aliyuncs.com/series-m/

+ 112 - 0
config/config.go

@@ -0,0 +1,112 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package config
+
+type LogConfig struct {
+	Path       string
+	Level      string
+	MaxSize    int
+	MaxBackups int
+	MaxAge     int
+	Stacktrace bool
+}
+
+type MysqlConfig struct {
+	User     string
+	Password string
+	Addr     string
+	DB       string
+	Charset  string
+	MaxIdle  int
+	MaxConn  int
+	LogMode  bool
+}
+
+type RedisConfig struct {
+	Addrs        []string
+	Password     string
+	DB           int
+	PoolSize     int
+	MinIdleConns int
+	MaxRetries   int
+	Cluster      bool
+}
+
+type ElasticConfig struct {
+	Addrs []string
+	Sniff bool
+}
+
+type ThirdPartNode struct {
+	Host      string
+	AppKey    string
+	AppSecret string
+}
+
+type ThirdPartConfig struct {
+	PartName ThirdPartNode
+}
+
+type RPCNode struct {
+	ServiceName   string
+	ServicePort   int
+	ServiceIp     string
+	MysqlDb       string
+	RedisDb       int
+	LogLevel      string
+	LogStacktrace bool
+}
+
+type KeepaliveConfig struct {
+	ClientTime    int
+	ClientTimeout int
+
+	ServerTime     int
+	ServerTimeout  int
+	ServerMiniTime int
+}
+
+type RPCConfig struct {
+	Prefix          string
+	Keepalive       KeepaliveConfig
+	ADMVehicleStyle RPCNode
+	ADMData         RPCNode
+}
+
+type EtcdConfig struct {
+	Addrs []string
+}
+
+type OssConfig struct {
+	AccessKey          string
+	AccessSecret       string
+	Bucket             string
+	EndPoint           string
+	DefaultBrandImage  string
+	BrandImage         string
+	DefaultSeriesImage string
+	SeriesImage        string
+	DownLoadBucket     string
+}
+
+type Configure struct {
+	// 基础配置
+	K8s     bool
+	RunMode string
+	Log     LogConfig
+
+	// 按需配置
+	Mysql     MysqlConfig
+	Redis     RedisConfig
+	Elastic   ElasticConfig
+	ThirdPart ThirdPartConfig
+
+	// 所要启用的服务
+	Rpc RPCConfig
+
+	// etcd
+	Etcd EtcdConfig
+
+	Oss OssConfig
+}

+ 8 - 0
consts/common.go

@@ -0,0 +1,8 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package consts
+
+const (
+	PageSize = 10
+)

+ 12 - 0
consts/maintainance.go

@@ -0,0 +1,12 @@
+package consts
+
+const (
+	_ = iota
+	Maintainance
+	Wash
+	Repair
+)
+
+const (
+	Oil = 1001
+)

+ 22 - 0
errors/error.go

@@ -0,0 +1,22 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package errors
+
+import (
+	"google.golang.org/grpc/status"
+)
+
+var (
+	// 通用错误
+	SystemError  = status.Error(10001, "系统错误")
+	ServiceError = status.Error(10002, "内部服务错误")
+	ParamsError  = status.Error(10003, "参数错误")
+
+	BrandNotExistError = status.Error(11001, "品牌不存在")
+	CycleError         = status.Error(11002, "新增数据里程间隔周期无法匹配")
+
+	FieldNotExistError = status.Error(11003, "字段不存在")
+	DataNotExistError  = status.Error(11004, "数据不存在")
+	InterfaceNoExistError = status.Error(11005, "接口不存在")
+)

+ 132 - 0
etcd/etcd.go

@@ -0,0 +1,132 @@
+package etcd
+
+import (
+	"context"
+	"fmt"
+	"log"
+	"strings"
+	"time"
+
+	"adm-vehicle-style/parser"
+
+	uuid "github.com/satori/go.uuid"
+	clientv3 "go.etcd.io/etcd/client/v3"
+	"go.etcd.io/etcd/client/v3/naming/endpoints"
+)
+
+var cli *clientv3.Client
+
+func Get() *clientv3.Client {
+	return cli
+}
+
+func Init(addr, serviceIp, servicePort string) {
+	var (
+		err error
+	)
+
+	cli, err = clientv3.New(clientv3.Config{
+		Endpoints:   strings.Split(addr, ","),
+		DialTimeout: 5 * time.Second,
+	})
+	if err != nil {
+		panic(err)
+	}
+
+	// 注册续租
+	_ = relet(parser.Conf.Rpc.ADMVehicleStyle.ServiceName,
+		serviceIp+":"+servicePort,
+		parser.Conf.Rpc.Prefix,
+	)
+	if err != nil {
+		panic(err)
+	}
+}
+
+func getValue(addr string) string {
+	return `{"Addr:":"http://` + addr + `"}`
+}
+
+// 续租
+func relet(serviceName, serviceAddr, prefix string) error {
+	var ctx = context.Background()
+	// 创建一个租约
+	lease := clientv3.NewLease(cli)
+	cancelCtx, cancel := context.WithTimeout(ctx, time.Second*3)
+	defer cancel()
+
+	leaseResp, err := lease.Grant(cancelCtx, 3)
+	if err != nil {
+		return err
+	}
+
+	// 长链接
+	leaseChannel, err := lease.KeepAlive(ctx, leaseResp.ID)
+	if err != nil {
+		return err
+	}
+
+	em, err := endpoints.NewManager(cli, prefix)
+	if err != nil {
+		return err
+	}
+
+	cancelCtx, cancel = context.WithTimeout(ctx, time.Second*3)
+	defer cancel()
+
+	if err := em.AddEndpoint(cancelCtx, fmt.Sprintf("%s/%s/%s", prefix, serviceName, uuid.NewV4().String()), endpoints.Endpoint{
+		Addr: serviceAddr,
+	}, clientv3.WithLease(leaseResp.ID)); err != nil {
+		return err
+	}
+
+	log.Println("Register etcd success")
+
+	del := func() {
+        log.Println("Register close")
+
+        cancelCtx, cancel = context.WithTimeout(ctx, time.Second*3)
+        defer cancel()
+        em.DeleteEndpoint(cancelCtx, serviceName)
+
+        lease.Close()
+    }
+
+	// 保持注册状态(连接断开重连)
+    keepRegister(ctx, leaseChannel, del, serviceName,serviceAddr, prefix)
+
+    return nil
+}
+
+func keepRegister(ctx context.Context, leaseChannel <-chan *clientv3.LeaseKeepAliveResponse, cleanFunc func(), serviceName, serviceAddr ,prefix string) {
+    go func() {
+        failedCount := 0
+        for {
+            select {
+            case resp := <-leaseChannel:
+                if resp != nil {
+                    //log.Println("keep alive success.")
+                } else {
+                    log.Println("keep alive failed.")
+                    failedCount++
+                    for failedCount > 3 {
+                        cleanFunc()
+                        if err := relet(serviceName, serviceAddr, prefix); err != nil {
+                            time.Sleep(time.Second)
+                            continue
+                        }
+                        return
+                    }
+                    continue
+                }
+            case <-ctx.Done():
+                cleanFunc()
+                cli.Close()
+                return
+            }
+        }
+    }()
+}
+
+func UnRegisterEtcd(serviceName, serviceAddr string) {
+}

+ 21 - 0
go.mod

@@ -0,0 +1,21 @@
+module adm-vehicle-style
+
+go 1.13
+
+require (
+	git.getensh.com/common/gopkgsv2 v0.0.0-20230131080928-800ae85469c5
+	github.com/aliyun/aliyun-oss-go-sdk v2.0.7+incompatible
+	github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
+	github.com/fsnotify/fsnotify v1.4.9
+	github.com/golang/protobuf v1.5.2
+	github.com/json-iterator/go v1.1.11
+	github.com/satori/go.uuid v1.2.0
+	github.com/spf13/viper v1.6.2
+	go.etcd.io/etcd/client/v3 v3.5.3
+	go.uber.org/zap v1.17.0
+	google.golang.org/grpc v1.39.0
+	gopkg.in/ini.v1 v1.51.0
+	gorm.io/gorm v1.21.12
+)
+
+replace google.golang.org/grpc => google.golang.org/grpc v1.29.0

+ 566 - 0
go.sum

@@ -0,0 +1,566 @@
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+git.getensh.com/common/gopkgsv2 v0.0.0-20230131080928-800ae85469c5 h1:r30U3RK+DmKPTEcXew5q6bBdq/LpkYPwukh4xPxcy2M=
+git.getensh.com/common/gopkgsv2 v0.0.0-20230131080928-800ae85469c5/go.mod h1:UUV0+J8Z4ciF8NelKsEj6gXkGe68KP0iyw2stJyogfo=
+github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/RoaringBitmap/roaring v0.4.7/go.mod h1:8khRDP4HmeXns4xIj9oGrKSz7XTQiJx2zgh7AcNke4w=
+github.com/abronan/valkeyrie v0.0.0-20190822142731-f2e1850dc905/go.mod h1:hTreU6x9m2IP2h8e0TGrSzAXSCI3lxic8/JT5CMknjY=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/aliyun/aliyun-oss-go-sdk v2.0.7+incompatible h1:HXvOJsZw8JT/ldxjX74Aq4H2IY4ojV/mXMDPWFitpv8=
+github.com/aliyun/aliyun-oss-go-sdk v2.0.7+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
+github.com/anacrolix/envpprof v0.0.0-20180404065416-323002cec2fa/go.mod h1:KgHhUaQMc8cC0+cEflSgCFNFbKwi5h54gqtVn8yhP7c=
+github.com/anacrolix/envpprof v1.0.0/go.mod h1:KgHhUaQMc8cC0+cEflSgCFNFbKwi5h54gqtVn8yhP7c=
+github.com/anacrolix/envpprof v1.0.1/go.mod h1:My7T5oSqVfEn4MD4Meczkw/f5lSIndGAKu/0SM/rkf4=
+github.com/anacrolix/log v0.3.0/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU=
+github.com/anacrolix/missinggo v0.0.0-20180725070939-60ef2fbf63df/go.mod h1:kwGiTUTZ0+p4vAz3VbAI5a30t2YbvemcmspjKwrAz5s=
+github.com/anacrolix/missinggo v1.1.2-0.20190815015349-b888af804467/go.mod h1:MBJu3Sk/k3ZfGYcS7z18gwfu72Ey/xopPFJJbTi5yIo=
+github.com/anacrolix/missinggo v1.2.1/go.mod h1:J5cMhif8jPmFoC3+Uvob3OXXNIhOUikzMt+uUjeM21Y=
+github.com/anacrolix/missinggo/perf v1.0.0/go.mod h1:ljAFWkBuzkO12MQclXzZrosP5urunoLS0Cbvb4V0uMQ=
+github.com/anacrolix/sync v0.0.0-20180808010631-44578de4e778/go.mod h1:s735Etp3joe/voe2sdaXLcqDdJSay1O0OPnM0ystjqk=
+github.com/anacrolix/tagflag v0.0.0-20180109131632-2146c8d41bf0/go.mod h1:1m2U/K6ZT+JZG0+bdMK6qauP49QT4wE5pmhJXOKKCHw=
+github.com/anacrolix/utp v0.0.0-20180219060659-9e0e1d1d0572/go.mod h1:MDwc+vsGEq7RMw6lr2GKOEqjWny5hO5OZXRVNaBJ2Dk=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
+github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
+github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg=
+github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/aws/aws-sdk-go v1.16.23/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA=
+github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/bradfitz/iter v0.0.0-20140124041915-454541ec3da2/go.mod h1:PyRFw1Lt2wKX4ZVSQ2mk+PeDa1rxyObEDlApuIsUKuo=
+github.com/bradfitz/iter v0.0.0-20190303215204-33e6a9893b0c/go.mod h1:PyRFw1Lt2wKX4ZVSQ2mk+PeDa1rxyObEDlApuIsUKuo=
+github.com/cenk/backoff v2.2.1+incompatible/go.mod h1:7FtoeaSnHoZnmZzz47cM35Y9nSW7tNyaidugnHTaFDE=
+github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+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/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
+github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
+github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
+github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
+github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c=
+github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
+github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ=
+github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dgryski/go-jump v0.0.0-20170409065014-e1f439676b57/go.mod h1:4hKCXuwrJoYvHZxJ86+bRVTOMyJ0Ej+RqfSm8mHi6KA=
+github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/docker/libkv v0.2.1/go.mod h1:r5hEwHwW8dr0TFBYGCarMNbrQOiwL1xoqDYZ/JqoTK0=
+github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/dustin/go-humanize v0.0.0-20180421182945-02af3965c54e/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/edwingeng/doublejump v0.0.0-20190102103700-461a0155c7be/go.mod h1:sqbHCF7b7eMiCtiwNY5+2bqhT+Zx6Duj2VU5WigITOQ=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do=
+github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
+github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM=
+github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY=
+github.com/go-redis/redis v6.15.7+incompatible h1:3skhDh95XQMpnqeqNftPkQD9jL9e5e36z/1SUm6dy1U=
+github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
+github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/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/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.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.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg=
+github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+github.com/grandcat/zeroconf v0.0.0-20190424104450-85eadb44205c/go.mod h1:YjKB0WsLXlMkO9p+wGTCoPIDGRJH0mz7E526PxkQVxI=
+github.com/grokify/html-strip-tags-go v0.0.0-20200322061010-ea0c1cf2f119/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
+github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
+github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
+github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
+github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+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/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
+github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo=
+github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI=
+github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
+github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kavu/go_reuseport v1.4.0/go.mod h1:CG8Ee7ceMFSMnx/xr25Vm0qXaj2Z4i5PWoUx+JZ5/CU=
+github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/reedsolomon v1.9.2/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
+github.com/lucas-clemente/quic-go v0.11.0/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw=
+github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
+github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk=
+github.com/marten-seemann/quic-conn v0.0.0-20190827120552-a06e62da55b7/go.mod h1:BTUDloYEkSYt9Yf98rSVDnIFrSJc04H3/6FfE+lsjNg=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
+github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
+github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
+github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.10.0 h1:XaTQmdKecIbwNHpzOIy0XMoEG5bmv/n0OVyaF1NKUdo=
+github.com/onsi/ginkgo v1.10.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo=
+github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/peterbourgon/g2s v0.0.0-20170223122336-d4e7ad98afea/go.mod h1:1VcHEd3ro4QMoHfiNl/j7Jkln9+KQuorp0PItHMJYNg=
+github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
+github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/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/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+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/rpcx-ecosystem/quic-conn v0.0.0-20190830034555-28ef71d38a15/go.mod h1:jk/xizLAYKg5ft2h5IAqThQuxtMRUE6dL93liAh4WEk=
+github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
+github.com/rubyist/circuitbreaker v2.2.1+incompatible/go.mod h1:Ycs3JgJADPuzJDwffe12k6BZT8hxVi6lFK+gWYJLN4A=
+github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46/go.mod h1:uAQ5PCi+MFsC7HjREoAz1BU+Mq60+05gifQSsHSDG/8=
+github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
+github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
+github.com/serialx/hashring v0.0.0-20180504054112-49a4782e9908/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/smallnest/libkv-etcdv3-store v0.0.0-20190827025031-6b33215321f0/go.mod h1:SYR75Tf6jJoZ8wZca3fqyzXorUyOwnorUYIKv4T+u9Q=
+github.com/smallnest/rpcx v0.0.0-20190830042331-e50181fc75b4/go.mod h1:mMw5Jh8gV9ongiVM90AGxXLUa+x4lPwHPjG/N//OsFE=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
+github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
+github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/sony/sonyflake v1.0.0 h1:MpU6Ro7tfXwgn2l5eluf9xQvQJDROTBImNCfRXn/YeM=
+github.com/sony/sonyflake v1.0.0/go.mod h1:Jv3cfhf/UFtolOTTRd3q4Nl6ENqM+KfyZ5PseKfZGF4=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E=
+github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+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.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
+github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
+github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3e/go.mod h1:B4+Kq1u5FlULTjFSM707Q6e/cOHFv0z/6QRoxubDIQ8=
+github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU=
+github.com/templexxx/xor v0.0.0-20181023030647-4e92f724b73b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4=
+github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls=
+github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
+github.com/tjfoc/gmsm v1.0.1/go.mod h1:XxO4hdhhrzAd+G4CjDqaOkd0hUzmtPR/d3EiBBMn/wc=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
+github.com/uber/jaeger-client-go v2.22.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
+github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
+github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
+github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
+github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
+github.com/valyala/fastrand v1.0.0/go.mod h1:HWqCzkrkg6QXT8V2EXWvXCoow7vLwOFN002oeRzjapQ=
+github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
+github.com/willf/bitset v1.1.9/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
+github.com/xtaci/kcp-go v5.4.4+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE=
+github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE=
+github.com/yuin/goldmark v1.1.27/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=
+go.etcd.io/bbolt v1.3.1-etcd.8/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/etcd v3.3.13+incompatible h1:jCejD5EMnlGxFvcGRyEV4VGlENZc7oPQX6o0t7n3xbw=
+go.etcd.io/etcd v3.3.13+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI=
+go.etcd.io/etcd/api/v3 v3.5.3 h1:QmhsZfmMpCT6M7EwRVSPJFfKOOGgo+MeUDfSZngfeso=
+go.etcd.io/etcd/api/v3 v3.5.3/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
+go.etcd.io/etcd/client/pkg/v3 v3.5.3 h1:QvFISaDSofVNt2sWwM1lJLHNZNjkuJjYOU+cIYBQcoQ=
+go.etcd.io/etcd/client/pkg/v3 v3.5.3/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/v3 v3.5.3 h1:2Yli1O50DkVHrEvli5CbrRJJCdqymxNAgY67D5r3WwI=
+go.etcd.io/etcd/client/v3 v3.5.3/go.mod h1:S9LzGLV7Kh1Rg85nMVMjloLdUSMu+wvZZXPcUXDQ2Ds=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
+go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U=
+go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+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-20190701094942-4def268fd1a4/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/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/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-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/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.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210716203947-853a461950ff h1:j2EK/QoxYNBsXI4R7fQkkRUk8y6wnOBI+6hgPdP/6Ds=
+golang.org/x/net v0.0.0-20210716203947-853a461950ff/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+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-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/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-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-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/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.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/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-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-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f h1:YORWxaStkWBnWgELOHTmDrqNlFXuVGEbhwbB5iK94bQ=
+google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
+google.golang.org/grpc v1.29.0 h1:2pJjwYOdkZ9HlN4sWRYBg9ttH5bCOlsueaM+b/oYjwo=
+google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+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.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+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 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
+gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
+gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
+gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
+gopkg.in/olivere/elastic.v5 v5.0.84/go.mod h1:LXF6q9XNBxpMqrcgax95C6xyARXWbbCXUrtTxrNrxJI=
+gopkg.in/redis.v5 v5.2.9/go.mod h1:6gtv0/+A4iM08kdRfocWYB3bLX2tebpNtfKlFT6H4mY=
+gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.1.1 h1:yr1bpyqiwuSPJ4aGGUX9nu46RHXlF8RASQVb1QQNcvo=
+gorm.io/driver/mysql v1.1.1/go.mod h1:KdrTanmfLPPyAOeYGyG+UpDys7/7eeWT1zCq+oekYnU=
+gorm.io/gorm v1.21.9/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0=
+gorm.io/gorm v1.21.12 h1:3fQM0Eiz7jcJEhPggHEpoYnsGZqynMzverL77DV40RM=
+gorm.io/gorm v1.21.12/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/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=
+sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=

+ 45 - 0
imagebuild.sh

@@ -0,0 +1,45 @@
+#!/bin/bash
+
+set -e
+
+show_usage="args: [--image-name=]"
+
+#-o或--options选项后面是可接受的短选项,如ab:c::,表示可接受的短选项为-a -b -c,
+#其中-a选项不接参数,-b选项后必须接参数,-c选项的参数为可选的
+#-l或--long选项后面是可接受的长选项,用逗号分开,冒号的意义同短选项。
+#-n选项后接选项解析错误时提示的脚本名字
+ARGS=`getopt -o -h --long help,image-name: -n "$0" -- "$@"`
+
+if [ $? != 0 ]; then
+    exit 1
+fi
+
+#将规范化后的命令行参数分配至位置参数($1,$2,...)
+eval set -- "${ARGS}"
+
+while [ -n "$1" ]
+do
+    case "$1" in
+        -h|--help)
+            echo "$show_usage"; exit 1 ;;
+        --image-name)
+            IMAGE_NAME=$2; shift ;;
+        *) shift ;;
+    esac
+done
+
+PROJECT_PATH=$(cd `dirname $0`; pwd)
+APP_NAME="${PROJECT_PATH##*/}"
+VERSION=`cat VERSION`
+make version=$VERSION
+
+DOCKERFILE=Dockerfile
+
+
+if [ -z $IMAGE_NAME ];then
+    IMAGE_NAME=$APP_NAME
+fi
+
+sed -e "s/%APP_NAME%/$APP_NAME/g" ${DOCKERFILE}.in > ${DOCKERFILE}
+docker build . -t $IMAGE_NAME
+

+ 345 - 0
impl/rcvr.go

@@ -0,0 +1,345 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package impl
+
+import (
+	"context"
+
+	"adm-vehicle-style/pb"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"adm-vehicle-style/impl/v1/brand"
+	"adm-vehicle-style/impl/v1/maintainance"
+	"adm-vehicle-style/impl/v1/query"
+	"adm-vehicle-style/impl/v1/series"
+	"adm-vehicle-style/impl/v1/style"
+
+	"git.getensh.com/common/gopkgsv2/tasker/rpctasker"
+	"google.golang.org/grpc"
+)
+
+// 具体实现
+type Rcvr struct{}
+
+func Register(s *grpc.Server) {
+	pb.RegisterVehicleStyleServer(s, &Rcvr{})
+}
+
+func (c *Rcvr) BrandList(ctx context.Context, req *v1.BrandListRequest) (reply *v1.BrandListReply, err error) {
+	t1 := func() error {
+		reply, err = brand.List(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) Search(ctx context.Context, req *v1.SearchRequest) (reply *v1.SearchReply, err error) {
+	t1 := func() error {
+		reply, err = brand.Search(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) UpdateSYBrand(ctx context.Context, req *v1.UpdateSYBrandRequest) (reply *v1.EmptyReply, err error) {
+	t1 := func() error {
+		reply, err = brand.Update(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) GetMaker(ctx context.Context, req *v1.GetMakerRequest) (reply *v1.GetMakerReply, err error) {
+	t1 := func() error {
+		reply, err = brand.MakerList(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) UpdateMaker(ctx context.Context, req *v1.UpdateMakerRequest) (reply *v1.EmptyReply, err error) {
+	t1 := func() error {
+		reply, err = brand.UpdateMaker(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) SeriesList(ctx context.Context, req *v1.SeriesListRequest) (reply *v1.SeriesListReply, err error) {
+	t1 := func() error {
+		reply, err = series.List(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) UpdateSeries(ctx context.Context, req *v1.UpdateSeriesRequest) (reply *v1.EmptyReply, err error) {
+	t1 := func() error {
+		reply, err = series.Update(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) StyleList(ctx context.Context, req *v1.StyleListRequest) (reply *v1.StyleListReply, err error) {
+	t1 := func() error {
+		reply, err = style.List(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) UpdateStyle(ctx context.Context, req *v1.UpdateStyleRequest) (reply *v1.EmptyReply, err error) {
+	t1 := func() error {
+		reply, err = style.Update(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) StyleInfo(ctx context.Context, req *v1.StyleInfoRequest) (reply *v1.StyleInfoReply, err error) {
+	t1 := func() error {
+		reply, err = style.Info(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) UpdateStyleInfo(ctx context.Context, req *v1.UpdateStyleInfoRequest) (reply *v1.EmptyReply, err error) {
+	t1 := func() error {
+		reply, err = style.UpdateStyleInfo(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) MaintainManual(
+	ctx context.Context,
+	req *v1.MaintainManualRequest,
+) (reply *v1.MaintainManualReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.Manual(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) ItemList(ctx context.Context, req *v1.ItemListRequest) (reply *v1.ItemListReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.ItemList(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) UpdateMaintainManual(
+	ctx context.Context,
+	req *v1.UpdateMaintainManualRequest,
+) (reply *v1.EmptyReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.Update(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) MaintainManualInfo(
+	ctx context.Context,
+	req *v1.MaintainManualInfoRequest,
+) (reply *v1.MaintainManualInfoReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.Info(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) StyleItem(
+	ctx context.Context,
+	req *v1.MaintainManualRequest,
+) (reply *v1.StyleItemReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.StyleItem(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) C2List(ctx context.Context, req *v1.C2ListRequest) (reply *v1.C2ListReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.C2List(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) UpdateStyleItem(ctx context.Context, req *v1.UpdateStyleItemRequest) (reply *v1.EmptyReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.UpdateStyleItem(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) DeleteMaintainace(
+	ctx context.Context,
+	req *v1.DeleteMaintainaceRequest,
+) (reply *v1.EmptyReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.Delete(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) ExportStyle(ctx context.Context, req *v1.ExportStyleRequest) (reply *v1.ExportStyleReply, err error) {
+	t1 := func() error {
+		reply, err = style.Export(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) ExportStyleTaskList(
+	ctx context.Context,
+	req *v1.EmptyReply,
+) (reply *v1.ExportStyleTaskListReply, err error) {
+	t1 := func() error {
+		reply, err = style.ExportTaskList(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) DeleteExportStyleTask(
+	ctx context.Context,
+	req *v1.DeleteExportStyleTaskRequest,
+) (reply *v1.EmptyReply, err error) {
+	t1 := func() error {
+		reply, err = style.DeleteExportTask(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) Query(ctx context.Context, req *v1.QueryRequest) (reply *v1.QueryResponse, err error) {
+	t1 := func() error {
+		reply, err = query.Query(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) DeleteStyleItem(
+	ctx context.Context,
+	req *v1.DeleteStyleItemRequest,
+) (reply *v1.EmptyReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.DeleteStyleItem(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) TemplateList(ctx context.Context, req *v1.TemplateListRequest) (reply *v1.TemplateListReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.TemplateList(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) TemplateDetailList(
+	ctx context.Context,
+	req *v1.TemplateDetailListRequest,
+) (reply *v1.TemplateDetailListReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.TemplateDetailList(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) TemplateDetail(
+	ctx context.Context,
+	req *v1.TemplateDetailRequest,
+) (reply *v1.TemplateDetailReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.TemplateDetail(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) AddTemplateDetail(
+	ctx context.Context,
+	req *v1.AddTemplateDetailRequest,
+) (reply *v1.AddTemplateDetailReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.AddTemplateDetail(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) UpdateTemplateDetail(
+	ctx context.Context,
+	req *v1.UpdateMaintainManualRequest,
+) (reply *v1.EmptyReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.UpdateTemplateDetail(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) ChooseTemplateDetail(
+	ctx context.Context,
+	req *v1.ChooseTemplateDetailRequest,
+) (reply *v1.EmptyReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.ChooseTemplateDetail(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}
+
+func (c *Rcvr) TemplateItemList(ctx context.Context, req *v1.TemplateItemListRequest) (reply *v1.ItemListReply, err error) {
+	t1 := func() error {
+		reply, err = maintainance.TemplateItemList(ctx, req)
+		return err
+	}
+
+	return reply, rpctasker.Exec(ctx, t1)
+}

+ 120 - 0
impl/v1/brand/list.go

@@ -0,0 +1,120 @@
+package brand
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	"adm-vehicle-style/consts"
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+	"adm-vehicle-style/utils"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func List(ctx context.Context, req *v1.BrandListRequest) (reply *v1.BrandListReply, err error) {
+	reply = &v1.BrandListReply{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	db := database.DB()
+	if req.BrandName != "" {
+		db = db.Where("brand_name = ?", req.BrandName)
+	}
+
+	if req.BrandId != "" {
+		db = db.Where("brand_id = ?", req.BrandId)
+	}
+
+	if req.Initial != "" {
+		db = db.Where("initial = ?", req.Initial)
+	}
+
+	if req.OldBrandName != ""{
+		db = db.Where("old_brand_name like ?", "%"+req.OldBrandName+"%")
+		//db = db.Where("old_brand_name = ?", req.OldBrandName)
+	}
+
+	if req.HasImg == -1 {
+		db = db.Where("has_img = 0")
+	} else if req.HasImg == 1 {
+		db = db.Where("has_img = 1")
+	}
+
+	if req.Status == -1 {
+		db = db.Where("status = 0")
+	} else if req.Status == 1 {
+		db = db.Where("status = 1")
+	}
+
+	pageSize := consts.PageSize
+	if req.PageSize != 0 {
+		pageSize = int(req.PageSize)
+	}
+
+	// 构造分页类
+	pagination := model.NewPagination(int(req.Page), pageSize, 0).GetLimitOffset()
+
+	count, err := model.NewSyBrand().Count(db)
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound || count == 0 {
+		return reply, nil
+	}
+
+	list, err := model.NewSyBrand().List(db, pagination)
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	reply.List = make([]*v1.BrandList, 0, len(list))
+	for _, v := range list {
+		reply.List = append(reply.List, &v1.BrandList{
+			Id:        v.ID,
+			Initial:   v.Initial,
+			BrandName: v.BrandName,
+			BrandId:   v.BrandId,
+			Weight:    v.Weight,
+			HasImg:    v.HasImg,
+			Status:    v.Status,
+			Image:     utils.GetBrandLogoById(v.BrandId, int32(v.HasImg)),
+			OldBrandName:v.OldBrandName,
+		})
+	}
+
+	// 计算分页结果
+	pagination.CalPage(int(count))
+
+	reply.CurrentPage = int64(pagination.CurrentPage)
+	reply.PerPage = int64(pagination.PerPage)
+	reply.Total = int64(pagination.Total)
+	reply.FirstPage = int64(pagination.FirstPage)
+	reply.LastPage = int64(pagination.LastPage)
+	reply.PrevPage = int64(pagination.PrevPage)
+	reply.NextPage = int64(pagination.NextPage)
+
+	return reply, err
+}

+ 106 - 0
impl/v1/brand/maker.go

@@ -0,0 +1,106 @@
+package brand
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func MakerList(ctx context.Context, req *v1.GetMakerRequest) (reply *v1.GetMakerReply, err error) {
+	reply = &v1.GetMakerReply{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.BrandId == "" {
+		return reply, errors.ParamsError
+	}
+
+	list, err := model.NewSySerieModel().MakerList(database.DB().Where("brand_id = ?", req.BrandId))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	reply.List = make([]*v1.MakerList, 0, len(list))
+	for _, v := range list {
+		reply.List = append(reply.List, &v1.MakerList{
+			BrandId: v.BrandId,
+			MakerId: v.MakerId,
+			Maker:   v.Maker,
+		})
+	}
+
+	return reply, nil
+}
+
+func UpdateMaker(ctx context.Context, req *v1.UpdateMakerRequest) (reply *v1.EmptyReply, err error) {
+	reply = &v1.EmptyReply{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.Maker == "" || req.MakerId == "" {
+		return reply, errors.ParamsError
+	}
+
+	tx := database.DB().Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+			return
+		}
+
+		tx.Commit()
+	}()
+
+	tx = tx.Where("maker_id = ?", req.MakerId)
+	values := map[string]interface{}{
+		"maker": req.Maker,
+	}
+
+	err = model.NewSySerieModel().Update(tx, values)
+	if err != nil {
+		return reply, err
+	}
+
+	err = model.NewSyStyleModel().Update(tx, values)
+	if err != nil {
+		return reply, err
+	}
+
+	return reply, nil
+}

+ 140 - 0
impl/v1/brand/search.go

@@ -0,0 +1,140 @@
+package brand
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func Search(ctx context.Context, req *v1.SearchRequest) (reply *v1.SearchReply, err error) {
+	reply = &v1.SearchReply{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	db := database.DB()
+	if req.MakerId != "" {
+		db = db.Where("maker_id = ?", req.MakerId)
+	}
+	if req.SeriesId != "" {
+		db = db.Where("series_id = ?", req.SeriesId)
+	}
+
+	pagination := model.NewPagination(0, 100000, 0).GetLimitOffset()
+	switch req.Type {
+	case 1:
+		// 品牌搜索
+		// 构造分页类
+		if req.Search != "" {
+			db = db.Where("brand_name like ?", "%"+req.Search+"%")
+		}
+		list, err := model.NewSyBrand().List(db, pagination)
+		if err != nil && err != gorm.ErrRecordNotFound {
+			return reply, errors.SystemError
+		}
+
+		if err == gorm.ErrRecordNotFound {
+			return reply, nil
+		}
+
+		reply.List = make([]*v1.SearchList, 0, len(list))
+		for _, v := range list {
+			reply.List = append(reply.List, &v1.SearchList{
+				Id:   v.BrandId,
+				Name: v.BrandName,
+			})
+		}
+	case 2:
+		// 厂商搜索
+		if req.Search != "" {
+			db = db.Where("maker like ?", "%"+req.Search+"%")
+		}
+		if req.BrandId != "" {
+			db = db.Where("brand_id = ?", req.BrandId)
+		}
+		list, err := model.NewSySerieModel().MakerList(db)
+		if err != nil && err != gorm.ErrRecordNotFound {
+			return reply, errors.SystemError
+		}
+
+		if err == gorm.ErrRecordNotFound {
+			return reply, nil
+		}
+
+		reply.List = make([]*v1.SearchList, 0, len(list))
+		for _, v := range list {
+			reply.List = append(reply.List, &v1.SearchList{
+				Id:   v.MakerId,
+				Name: v.Maker,
+			})
+		}
+	case 3:
+		// 车系搜索
+		if req.BrandId != "" {
+			db = db.Where("t1.brand_id = ?", req.BrandId)
+		}
+		if req.Search != "" {
+			db = db.Where("series_name like ?", "%"+req.Search+"%")
+		}
+		list, err := model.NewSySerieModel().List(db, pagination, false)
+		if err != nil && err != gorm.ErrRecordNotFound {
+			return reply, errors.SystemError
+		}
+
+		if err == gorm.ErrRecordNotFound {
+			return reply, nil
+		}
+
+		reply.List = make([]*v1.SearchList, 0, len(list))
+		for _, v := range list {
+			reply.List = append(reply.List, &v1.SearchList{
+				Id:   v.SeriesId,
+				Name: v.SeriesName,
+			})
+		}
+	case 4:
+		// 车型搜索
+		if req.Search != "" {
+			db = db.Where("style_name like ?", "%"+req.Search+"%")
+		}
+
+		list, err := model.NewSyStyleModel().List(db, pagination, false)
+		if err != nil && err != gorm.ErrRecordNotFound {
+			return reply, errors.SystemError
+		}
+
+		if err == gorm.ErrRecordNotFound {
+			return reply, nil
+		}
+
+		reply.List = make([]*v1.SearchList, 0, len(list))
+		for _, v := range list {
+			reply.List = append(reply.List, &v1.SearchList{
+				Id:   v.StyleId,
+				Name: v.StyleName,
+			})
+		}
+	}
+
+	return reply, nil
+}

+ 92 - 0
impl/v1/brand/update.go

@@ -0,0 +1,92 @@
+package brand
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"strings"
+	"time"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func Update(ctx context.Context, req *v1.UpdateSYBrandRequest) (reply *v1.EmptyReply, err error) {
+	reply = &v1.EmptyReply{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.Id <= 0 || req.BrandName == "" || req.Initial == "" || req.Weight < 0 {
+		return reply, errors.ParamsError
+	}
+
+	res, err := model.NewSyBrand().Get(database.DB().Where("id = ?", req.Id))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, errors.BrandNotExistError
+	}
+
+	tx := database.DB().Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+			return
+		}
+
+		tx.Commit()
+	}()
+
+	values := map[string]interface{}{
+		"initial":     strings.ToUpper(req.Initial),
+		"brand_name":  req.BrandName,
+		"weight":      req.Weight,
+		"status":      req.Status,
+		"update_time": time.Now().Format("200601"),
+		"old_brand_name":req.OldBrandName,
+	}
+
+
+	if req.HasImg == 1 {
+		values["has_img"] = 1
+	}
+
+	if err = model.NewSyBrand().Update(tx.Where("id = ?", req.Id), values); err != nil {
+		return reply, errors.SystemError
+	}
+
+	if err = model.NewSySerieModel().Update(tx.Where("brand_id = ?", res.BrandId), map[string]interface{}{
+		"status": req.Status,
+	}); err != nil {
+		return reply, errors.SystemError
+	}
+
+	if err = model.NewSyStyleModel().Update(tx.Where("brand_id = ?", res.BrandId), map[string]interface{}{
+		"brand_name": req.BrandName,
+		"is_on":      req.Status,
+	}); err != nil {
+		return reply, errors.SystemError
+	}
+
+	return reply, nil
+}

+ 72 - 0
impl/v1/maintainance/c2.go

@@ -0,0 +1,72 @@
+package maintainance
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func C2List(ctx context.Context, req *v1.C2ListRequest) (reply *v1.C2ListReply, err error) {
+	reply = &v1.C2ListReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	list, err := model.NewStyleItemModel().List(database.DB().Where("style_id = ?", req.StyleId))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	c2List, err := model.NewC2ItemModel().List(database.DB())
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	exist := func(c2Id int64, list []model.StyleItem) bool {
+		if len(list) == 0 {
+			return false
+		}
+
+		for _, v := range list {
+			if c2Id == v.C2Id {
+				return true
+			}
+		}
+
+		return false
+	}
+
+	reply.List = make([]*v1.C2ListReply_Info, 0, len(c2List))
+	for _, v := range c2List {
+		if !exist(v.ID, list) {
+			reply.List = append(reply.List, &v1.C2ListReply_Info{
+				Id:   v.ID,
+				Name: v.Name,
+			})
+		}
+	}
+
+	return reply, nil
+}

+ 111 - 0
impl/v1/maintainance/choose.go

@@ -0,0 +1,111 @@
+package maintainance
+
+import (
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+	"context"
+	"encoding/json"
+	"fmt"
+	"time"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func ChooseTemplateDetail(ctx context.Context, req *v1.ChooseTemplateDetailRequest) (reply *v1.EmptyReply, err error) {
+	reply = &v1.EmptyReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	var (
+		tx = database.DB().Begin()
+	)
+
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+			return
+		}
+
+		tx.Commit()
+	}()
+
+	// 删除原有维保手册
+	if err := model.NewMaintainDetailModel().Delete(tx.Where("style_id = ?", req.StyleId)); err != nil {
+		return reply, errors.SystemError
+	}
+
+	if err := model.NewMaintainTitleModel().Delete(tx.Where("style_id = ?", req.StyleId)); err != nil {
+		return reply, errors.SystemError
+	}
+
+	// 查询模板详情
+	list, err := model.NewMaintainDetailTemplateModel().List(database.DB().Where("tid = ?", req.Tid))
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			return reply, errors.DataNotExistError
+		}
+
+		return reply, errors.SystemError
+	}
+
+	inserts := make([]model.GdMaintainDetail, 0, len(list))
+	for _, v := range list {
+		inserts = append(inserts, model.GdMaintainDetail{
+			StyleId:   req.StyleId,
+			ItemId:    v.ItemId,
+			StartMile: v.StartMile,
+			MileCycle: v.MileCycle,
+			StartDate: v.StartDate,
+			DateCycle: v.DateCycle,
+			CreatedAt: time.Now(),
+			UpdatedAt: time.Now(),
+		})
+	}
+
+	if err := model.NewMaintainDetailModel().Insert(tx, inserts); err != nil {
+		return reply, errors.SystemError
+	}
+
+	// 查询模板标题
+	title, err := model.NewMaintenanceTitleTemplateModel().Get(database.DB().Where("tid = ?", req.Tid))
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			return reply, errors.DataNotExistError
+		}
+
+		return reply, errors.SystemError
+	}
+
+	// 没有title
+	insert := &model.GdMaintainTitle{
+		StartMile:            title.StartMile,
+		StartDate:            title.StartDate,
+		StyleId:              req.StyleId,
+		MaintainMileMinCycle: title.MaintainMileMinCycle,
+		MaintainDateMinCycle: title.MaintainDateMinCycle,
+		RepairCycle:          title.RepairCycle,
+		WashCycle:            title.WashCycle,
+		CreatedAt:            time.Now(),
+		UpdatedAt:            time.Now(),
+	}
+
+	if err := model.NewMaintainTitleModel().Insert(tx, insert); err != nil {
+		return reply, errors.SystemError
+	}
+
+	return reply, nil
+}

+ 41 - 0
impl/v1/maintainance/delete.go

@@ -0,0 +1,41 @@
+package maintainance
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+)
+
+func Delete(ctx context.Context, req *v1.DeleteMaintainaceRequest) (reply *v1.EmptyReply, err error) {
+	reply = &v1.EmptyReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.Id == 0 {
+		return reply, errors.ParamsError
+	}
+
+	if err := model.NewMaintainDetailModel().Delete(database.DB().Where("id = ?", req.Id)); err != nil {
+		return reply, errors.SystemError
+	}
+
+	return reply, nil
+}

+ 244 - 0
impl/v1/maintainance/get.go

@@ -0,0 +1,244 @@
+package maintainance
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	"adm-vehicle-style/consts"
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func Manual(ctx context.Context, req *v1.MaintainManualRequest) (reply *v1.MaintainManualReply, err error) {
+	reply = &v1.MaintainManualReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.StyleId == "" {
+		return reply, errors.ParamsError
+	}
+
+	list, err := model.NewMaintainDetailModel().MaintainDetailList(database.DB().Where("t1.style_id = ?", req.StyleId))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	for _, v := range list {
+		i := v1.MaintainItem{
+			Id:        v.ID,
+			Item:      v.ItemName,
+			StartMile: v.StartMile,
+			StartDate: v.StartDate,
+			MileCycle: v.MileCycle,
+			DateCycle: v.DateCycle,
+			StyleId:   req.StyleId,
+			ItemId:    v.ItemId,
+		}
+		switch v.ItemType {
+		case consts.Maintainance:
+			reply.Maintainance = append(reply.Maintainance, &i)
+		case consts.Repair:
+			reply.Repair = append(reply.Repair, &i)
+		case consts.Wash:
+			reply.Wash = append(reply.Wash, &i)
+		}
+	}
+
+	return reply, nil
+}
+
+func judgeCycle(mile, age int64, v model.MaintainDetailItem, m, d int64) bool {
+	if mile > 0 && v.MileCycle > 0 {
+		if mile >= v.StartMile && (mile-m)%v.MileCycle == 0 {
+			return true
+		}
+	}
+
+	if age > 0 && v.DateCycle > 0 {
+		if age >= v.StartDate && (age-d)%v.DateCycle == 0 {
+			return true
+		}
+	}
+
+	return false
+}
+
+func generateMaintainace(
+	list []model.MaintainDetailItem,
+	title *model.GdMaintainTitle,
+	reply *v1.MaintainManualInfoReply,
+) {
+	var (
+		mile       int64
+		age        int64
+		maitainLen int64
+	)
+
+	if title.MaintainDateMinCycle == 0 && title.MaintainMileMinCycle == 0 {
+		return
+	}
+
+	for {
+		// 当前周期
+		if title.StartMile != 0 && mile < title.StartMile {
+			mile = title.StartMile
+		} else {
+			mile += title.MaintainMileMinCycle
+		}
+
+		if title.StartDate != 0 && age < title.StartDate {
+			age = title.StartDate
+		} else {
+			age += title.MaintainDateMinCycle
+		}
+
+		if mile > 300000 {
+			break
+		}
+
+		if age > 180 {
+			break
+		}
+
+		maintain := v1.MaintainManualInfoReply_Maintain{
+			Mile: uint32(mile),
+			Age:  uint32(age),
+		}
+
+		for _, v := range list {
+			item := v1.MaintainManualInfoReply_Items{
+				ItemId:   uint32(v.ItemId),
+				ItemName: v.ItemName,
+			}
+
+			if judgeCycle(mile, age, v, title.StartMile, title.StartDate) {
+				item.Level = 2
+				if maitainLen > 0 {
+					for k := range reply.Maintain[maitainLen-1].Items {
+						if reply.Maintain[maitainLen-1].Items[k].ItemId == item.ItemId {
+							if reply.Maintain[maitainLen-1].Items[k].Level == 0 {
+								reply.Maintain[maitainLen-1].Items[k].Level = 1
+							}
+						}
+					}
+				}
+			}
+			maintain.Items = append(maintain.Items, &item)
+		}
+
+		reply.Maintain = append(reply.Maintain, &maintain)
+		maitainLen++
+	}
+
+	reply.Cycle = &v1.MaintainManualInfoReply_Cycle{
+		StartMile: title.StartMile,
+		MileCycle: title.MaintainMileMinCycle,
+		StartDate: title.StartDate,
+		DateCycle: title.MaintainDateMinCycle,
+	}
+
+}
+
+func Info(ctx context.Context, req *v1.MaintainManualInfoRequest) (reply *v1.MaintainManualInfoReply, err error) {
+	reply = &v1.MaintainManualInfoReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.StyleId == "" {
+		return reply, errors.ParamsError
+	}
+
+	list, err := model.NewMaintainDetailModel().MaintainDetailList(database.DB().Where("t1.style_id = ?", req.StyleId))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	title, err := model.NewMaintainTitleModel().Get(database.DB().Where("style_id = ?", req.StyleId))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	maintainList := []model.MaintainDetailItem{}
+
+	for _, v := range list {
+		switch v.ItemType {
+		case consts.Maintainance:
+			reply.MaintainItem = append(reply.MaintainItem, &v1.MaintainManualInfoReply_MaintainItem{
+				ItemId:    uint32(v.ItemId),
+				ItemName:  v.ItemName,
+				StartMile: v.StartMile,
+				StartDate: v.StartDate,
+				MileCycle: v.MileCycle,
+				DateCycle: v.DateCycle,
+				StyleId:   v.StyleId,
+			})
+			maintainList = append(maintainList, v)
+		case consts.Repair:
+			reply.Repair = append(reply.Repair, &v1.MaintainManualInfoReply_Repair{
+				Cycle:     uint32(v.MileCycle),
+				ItemName:  v.ItemName,
+				ItemId:    uint32(v.ItemId),
+				StartMile: v.StartMile,
+				StartDate: v.StartDate,
+				MileCycle: v.MileCycle,
+				DateCycle: v.DateCycle,
+				StyleId:   v.StyleId,
+			})
+		case consts.Wash:
+			reply.Wash = append(reply.Wash, &v1.MaintainManualInfoReply_Wash{
+				Cycle:     uint32(v.MileCycle),
+				ItemName:  v.ItemName,
+				ItemId:    uint32(v.ItemId),
+				StartMile: v.StartMile,
+				StartDate: v.StartDate,
+				MileCycle: v.MileCycle,
+				DateCycle: v.DateCycle,
+				StyleId:   v.StyleId,
+			})
+		}
+	}
+
+	if len(maintainList) > 0 {
+		generateMaintainace(maintainList, title, reply)
+	}
+
+	return reply, nil
+}

+ 129 - 0
impl/v1/maintainance/item.go

@@ -0,0 +1,129 @@
+package maintainance
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func ItemList(ctx context.Context, req *v1.ItemListRequest) (reply *v1.ItemListReply, err error) {
+	reply = &v1.ItemListReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.ItemType < 1 || req.ItemType > 3 {
+		return reply, errors.ParamsError
+	}
+
+	list, err := model.NewMaintainDetailModel().MaintainDetailList(database.DB().Where("t1.style_id = ?", req.StyleId))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	itemList, err := model.NewMaintainItemModel().
+		List(database.DB().Where("item_type = ?", req.ItemType), "id, item_id, item_name")
+	if err != nil {
+		return nil, errors.SystemError
+	}
+
+	exist := func(itemId int64, list []model.MaintainDetailItem) bool {
+		if len(list) == 0 {
+			return false
+		}
+
+		for _, v := range list {
+			if itemId == v.ItemId {
+				return true
+			}
+		}
+
+		return false
+	}
+
+	reply.List = make([]*v1.ItemListReply_Item, 0, len(itemList))
+	for _, v := range itemList {
+		if !exist(v.ItemId, list) {
+			reply.List = append(reply.List, &v1.ItemListReply_Item{
+				ItemId:   v.ItemId,
+				ItemName: v.ItemName,
+			})
+		}
+	}
+
+	return reply, nil
+}
+
+func TemplateItemList(ctx context.Context, req *v1.TemplateItemListRequest) (reply *v1.ItemListReply, err error) {
+	reply = &v1.ItemListReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.ItemType < 1 || req.ItemType > 3 {
+		return reply, errors.ParamsError
+	}
+
+	list, err := model.NewMaintainDetailTemplateModel().ListByItem(database.DB().Where("t1.tid = ?", req.Tid))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	itemList, err := model.NewMaintainItemModel().
+		List(database.DB().Where("item_type = ?", req.ItemType), "id, item_id, item_name")
+	if err != nil {
+		return nil, errors.SystemError
+	}
+
+	exist := func(itemId int64, list []model.MaintenanceDetailTemplateItem) bool {
+		if len(list) == 0 {
+			return false
+		}
+
+		for _, v := range list {
+			if itemId == v.ItemId {
+				return true
+			}
+		}
+
+		return false
+	}
+
+	reply.List = make([]*v1.ItemListReply_Item, 0, len(itemList))
+	for _, v := range itemList {
+		if !exist(v.ItemId, list) {
+			reply.List = append(reply.List, &v1.ItemListReply_Item{
+				ItemId:   v.ItemId,
+				ItemName: v.ItemName,
+			})
+		}
+	}
+
+	return reply, nil
+}

+ 150 - 0
impl/v1/maintainance/style_item.go

@@ -0,0 +1,150 @@
+package maintainance
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"time"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func StyleItem(ctx context.Context, req *v1.MaintainManualRequest) (reply *v1.StyleItemReply, err error) {
+	reply = &v1.StyleItemReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	list, err := model.NewStyleItemModel().List(database.DB().Where("style_id = ?", req.StyleId))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	reply.List = make([]*v1.StyleItem, 0, len(list))
+	for _, v := range list {
+		reply.List = append(reply.List, &v1.StyleItem{
+			Id:            v.ID,
+			C2Name:        v.C2Name,
+			C2Id:          v.C2Id,
+			Useage:        v.Useage,
+			Detail:        v.Detail,
+			AttributeRule: v.AttributeRule,
+			StyleId:       req.StyleId,
+		})
+	}
+
+	return reply, nil
+}
+
+func UpdateStyleItem(ctx context.Context, req *v1.UpdateStyleItemRequest) (reply *v1.EmptyReply, err error) {
+	reply = &v1.EmptyReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if len(req.List) == 0 {
+		return reply, errors.ParamsError
+	}
+
+	var (
+		insert []model.GdStyleItem
+		tx     = database.DB().Begin()
+	)
+
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+			return
+		}
+
+		tx.Commit()
+	}()
+
+	for _, v := range req.List {
+		if v.Id == 0 {
+			insert = append(insert, model.GdStyleItem{
+				StyleId:       v.StyleId,
+				C2Id:          v.C2Id,
+				Useage:        v.Useage,
+				Detail:        v.Detail,
+				AttributeRule: v.AttributeRule,
+				CreatedAt:     time.Now().Unix(),
+				UpdatedAt:     time.Now().Unix(),
+			})
+			continue
+		}
+
+		values := map[string]interface{}{
+			"c2_id":          v.C2Id,
+			"useage":         v.Useage,
+			"detail":         v.Detail,
+			"attribute_rule": v.AttributeRule,
+			"updated_at":     time.Now().Unix(),
+		}
+
+		if err := model.NewStyleItemModel().Update(tx.Where("id = ?", v.Id), values); err != nil {
+			return reply, errors.SystemError
+		}
+	}
+
+	if len(insert) != 0 {
+		if err := model.NewStyleItemModel().Insert(tx, insert); err != nil {
+			return reply, errors.SystemError
+		}
+	}
+
+	return reply, nil
+}
+
+func DeleteStyleItem(ctx context.Context, req *v1.DeleteStyleItemRequest) (reply *v1.EmptyReply, err error) {
+	reply = &v1.EmptyReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.Id == 0 {
+		return reply, errors.ParamsError
+	}
+
+	if err := model.NewStyleItemModel().Delete(database.DB().Where("id = ?", req.Id)); err != nil {
+		return reply, errors.SystemError
+	}
+
+	return reply, nil
+}

+ 495 - 0
impl/v1/maintainance/template.go

@@ -0,0 +1,495 @@
+package maintainance
+
+import (
+	"adm-vehicle-style/consts"
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+	"context"
+	"encoding/json"
+	"fmt"
+	"time"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func TemplateList(ctx context.Context, req *v1.TemplateListRequest) (reply *v1.TemplateListReply, err error) {
+	reply = &v1.TemplateListReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	db := database.DB()
+	if req.Name != "" {
+		db = db.Where("name like", "%"+req.Name+"%")
+	}
+
+	list, err := model.NewMaintenanceTemplateModel().List(db)
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			return reply, nil
+		}
+	}
+
+	reply.List = make([]*v1.Template, 0, len(list))
+	for _, v := range list {
+		reply.List = append(reply.List, &v1.Template{
+			Id:   v.ID,
+			Name: v.Name,
+		})
+	}
+
+	return reply, nil
+}
+
+func TemplateDetailList(ctx context.Context, req *v1.TemplateDetailListRequest) (reply *v1.TemplateDetailListReply, err error) {
+	reply = &v1.TemplateDetailListReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	db := database.DB()
+	if req.Tid > 0 {
+		db = db.Where("tid = ?", req.Tid)
+	}
+
+	count, err := model.NewMaintenanceTitleTemplateModel().Count(db)
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound || count == 0 {
+		return reply, nil
+	}
+
+	pageSize := consts.PageSize
+	if req.PageSize != 0 {
+		pageSize = int(req.PageSize)
+	}
+
+	// 构造分页类
+	pagination := model.NewPagination(int(req.Page), pageSize, 0).GetLimitOffset()
+	list, err := model.NewMaintenanceTitleTemplateModel().List(db, pagination)
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	reply.List = make([]*v1.TemplateDetail, 0, len(list))
+	for _, v := range list {
+		template, err := model.NewMaintenanceTemplateModel().Get(database.DB().Where("id = ?", v.Tid))
+		if err != nil && err != gorm.ErrRecordNotFound {
+			return reply, errors.SystemError
+		}
+
+		if err == gorm.ErrRecordNotFound {
+			return reply, nil
+		}
+		reply.List = append(reply.List, &v1.TemplateDetail{
+			Id:                   v.ID,
+			Name:                 template.Name,
+			StartMile:            v.StartMile,
+			StartDate:            v.StartDate,
+			MaintainMileMinCycle: v.MaintainMileMinCycle,
+			MaintainDateMinCycle: v.MaintainDateMinCycle,
+			Tid:                  v.Tid,
+		})
+	}
+
+	reply.Total = count
+
+	return reply, nil
+}
+
+func TemplateDetail(ctx context.Context, req *v1.TemplateDetailRequest) (reply *v1.TemplateDetailReply, err error) {
+	reply = &v1.TemplateDetailReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	list, err := model.NewMaintainDetailTemplateModel().ListByItem(database.DB().Where("tid = ?", req.Tid))
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			return reply, nil
+		}
+
+		return reply, errors.SystemError
+	}
+
+	template, err := model.NewMaintenanceTemplateModel().Get(database.DB().Where("id = ?", req.Tid))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	for _, v := range list {
+		i := v1.MaintainItem{
+			Id:        v.ID,
+			Item:      v.ItemName,
+			StartMile: v.StartMile,
+			StartDate: v.StartDate,
+			MileCycle: v.MileCycle,
+			DateCycle: v.DateCycle,
+			ItemId:    v.ItemId,
+		}
+		switch v.ItemType {
+		case consts.Maintainance:
+			reply.Maintainance = append(reply.Maintainance, &i)
+		case consts.Repair:
+			reply.Repair = append(reply.Repair, &i)
+		case consts.Wash:
+			reply.Wash = append(reply.Wash, &i)
+		}
+	}
+
+	reply.Name = template.Name
+
+	return reply, nil
+}
+
+func addTemplateTitle(db *gorm.DB, titleId, tid, startMile, mileCycle, startDate, dateCycle int64) error {
+	if titleId > 0 {
+		values := map[string]interface{}{
+			"start_mile":              startMile,
+			"start_date":              startDate,
+			"maintain_mile_min_cycle": mileCycle,
+			"maintain_date_min_cycle": dateCycle,
+			"repair_cycle":            mileCycle,
+			"wash_cycle":              mileCycle,
+			"updated_at":              time.Now().Format("2006-01-02 15:04:05"),
+		}
+
+		if err := model.NewMaintenanceTitleTemplateModel().Update(db.Where("id = ?", titleId), values); err != nil {
+			return errors.SystemError
+		}
+	} else {
+		// 没有title
+		title := &model.MaintenanceTitleTemplate{
+			Tid:                  tid,
+			StartMile:            startMile,
+			StartDate:            startDate,
+			MaintainMileMinCycle: mileCycle,
+			MaintainDateMinCycle: dateCycle,
+			RepairCycle:          mileCycle,
+			WashCycle:            mileCycle,
+			CreatedAt:            time.Now(),
+			UpdatedAt:            time.Now(),
+		}
+
+		if err := model.NewMaintenanceTitleTemplateModel().Insert(db, title); err != nil {
+			return errors.SystemError
+		}
+	}
+
+	return nil
+}
+
+func AddTemplateDetail(ctx context.Context, req *v1.AddTemplateDetailRequest) (reply *v1.AddTemplateDetailReply, err error) {
+	reply = &v1.AddTemplateDetailReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.Tid == 0 && req.Name == "" {
+		return reply, errors.ParamsError
+	}
+
+	var (
+		hasOil  bool
+		tid     = req.Tid
+		titleId int64
+		tx      = database.DB().Begin()
+	)
+
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+			return
+		}
+
+		tx.Commit()
+	}()
+
+	if req.Tid > 0 {
+		// 判断是否插入机油
+		info, err := model.NewMaintainDetailTemplateModel().Get(database.DB().Where("tid = ? AND item_id = ?", req.Tid, consts.Oil))
+		if err != nil && err != gorm.ErrRecordNotFound {
+			return nil, errors.SystemError
+		}
+
+		if err == nil && info != nil && info.ID != 0 {
+			hasOil = true
+		}
+
+		// 获取maintain_title
+		title, err := model.NewMaintenanceTitleTemplateModel().Get(database.DB().Where("tid = ?", req.Tid))
+		if err != nil && err != gorm.ErrRecordNotFound {
+			return nil, errors.SystemError
+		}
+
+		if err == nil && title != nil && title.ID > 0 {
+			titleId = title.ID
+		}
+	} else if req.Tid == 0 && req.Name != "" {
+		// 写入新模板
+		template := &model.MaintenanceTemplate{
+			Name: req.Name,
+		}
+
+		err = model.NewMaintenanceTemplateModel().Insert(tx, template)
+		if err != nil {
+			return reply, errors.SystemError
+		}
+
+		tid = template.ID
+	}
+
+	// 写入详情
+	detail := &model.MaintenanceDetailTemplate{
+		Tid:       tid,
+		ItemId:    req.ItemId,
+		StartMile: req.StartMile,
+		MileCycle: req.MileCycle,
+		StartDate: req.StartDate,
+		DateCycle: req.DateCycle,
+		CreatedAt: time.Now(),
+		UpdatedAt: time.Now(),
+	}
+
+	if err = model.NewMaintainDetailTemplateModel().Insert(tx, detail); err != nil {
+		return reply, errors.SystemError
+	}
+
+	reply.Tid = tid
+
+	// 以前插入机油,直接结束, 且当次插入不是机油
+	if hasOil && req.ItemId != consts.Oil {
+		return reply, nil
+	}
+
+	// 如果此条为机油
+	if req.ItemId == consts.Oil {
+		if err := addTemplateTitle(tx, titleId, tid, req.StartMile, req.MileCycle, req.StartDate, req.DateCycle); err != nil {
+			return reply, err
+		}
+		return reply, nil
+	}
+
+	// 如果都不是
+	// 获取已有的维保数据
+	list, err := model.NewMaintainDetailTemplateModel().
+		List(database.DB().Where("tid = ?", req.Tid))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	var (
+		idx      int
+		miniMile int64
+	)
+
+	list = append(list, model.MaintenanceDetailTemplate{
+		StartMile: req.StartMile,
+		MileCycle: req.MileCycle,
+		StartDate: req.StartDate,
+		DateCycle: req.DateCycle,
+	})
+
+	for k, v := range list {
+		if miniMile == 0 {
+			miniMile = v.MileCycle
+			idx = k
+		}
+		if v.MileCycle != 0 && v.MileCycle < miniMile {
+			miniMile = v.MileCycle
+			idx = k
+		}
+	}
+
+	if err := addTemplateTitle(tx, titleId, tid, list[idx].StartMile, list[idx].MileCycle, list[idx].StartDate, list[idx].DateCycle); err != nil {
+		return reply, err
+	}
+
+	return reply, nil
+}
+
+func UpdateTemplateDetail(ctx context.Context, req *v1.UpdateMaintainManualRequest) (reply *v1.EmptyReply, err error) {
+	reply = &v1.EmptyReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.Name != "" && req.Tid > 0 {
+		if err := model.NewMaintenanceTemplateModel().Update(database.DB().Where("id = ?", req.Tid), map[string]interface{}{
+			"name": req.Name,
+		}); err != nil {
+			return reply, errors.SystemError
+		}
+	}
+
+	if req.Id == 0 {
+		return reply, nil
+	}
+
+	info, err := model.NewMaintainDetailTemplateModel().Get(database.DB().Where("id = ?", req.Id))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	// 获取maintain_title
+	title, err := model.NewMaintenanceTitleTemplateModel().Get(database.DB().Where("tid = ?", info.Tid))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	// 判断是否插入机油
+	oil, err := model.NewMaintainDetailTemplateModel().Get(database.DB().Where("tid = ? AND item_id = ?", info.Tid, consts.Oil))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	var (
+		hasOil bool
+	)
+
+	if err == nil && oil != nil && oil.ID != 0 {
+		hasOil = true
+	}
+
+	var (
+		tx = database.DB().Begin()
+	)
+
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+			return
+		}
+
+		tx.Commit()
+	}()
+
+	values := map[string]interface{}{
+		"start_mile": req.StartMile,
+		"mile_cycle": req.MileCycle,
+		"start_date": req.StartDate,
+		"date_cycle": req.DateCycle,
+		"item_id":    req.ItemId,
+		"updated_at": time.Now().Format("2006-01-02 15:04:05"),
+	}
+
+	if err := model.NewMaintainDetailTemplateModel().Update(tx.Where("id = ?", req.Id), values); err != nil {
+		return reply, errors.SystemError
+	}
+
+	// 以前插入机油,直接结束, 且当次插入不是机油
+	if hasOil && req.ItemId != consts.Oil {
+		return reply, nil
+	}
+
+	// 如果此条为机油
+	if req.ItemId == consts.Oil {
+		if err := addTemplateTitle(tx, title.ID, info.Tid, req.StartMile, req.MileCycle, req.StartDate, req.DateCycle); err != nil {
+			return reply, err
+		}
+		return reply, nil
+	}
+
+	// 如果都不是
+	// 获取已有的维保数据
+	list, err := model.NewMaintainDetailTemplateModel().List(database.DB().Where("tid = ?", info.Tid))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	var (
+		idx      int
+		miniMile int64
+	)
+
+	if len(list) > 0 {
+		for k := range list {
+			if list[k].ID == req.Id {
+				list[k].StartMile = req.StartMile
+				list[k].StartDate = req.StartDate
+				list[k].MileCycle = req.MileCycle
+				list[k].DateCycle = req.DateCycle
+			}
+		}
+	} else {
+		list = append(list, model.MaintenanceDetailTemplate{
+			StartMile: req.StartMile,
+			MileCycle: req.MileCycle,
+			StartDate: req.StartDate,
+			DateCycle: req.DateCycle,
+		})
+
+	}
+
+	for k, v := range list {
+		if miniMile == 0 {
+			miniMile = v.MileCycle
+			idx = k
+		}
+		if v.MileCycle != 0 && v.MileCycle < miniMile {
+			miniMile = v.MileCycle
+			idx = k
+		}
+	}
+
+	if err := addTemplateTitle(tx, title.ID, info.Tid, list[idx].StartMile, list[idx].MileCycle, list[idx].StartDate, list[idx].DateCycle); err != nil {
+		return reply, err
+	}
+
+	return reply, nil
+}

+ 213 - 0
impl/v1/maintainance/update.go

@@ -0,0 +1,213 @@
+package maintainance
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"time"
+
+	"adm-vehicle-style/consts"
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func Update(ctx context.Context, req *v1.UpdateMaintainManualRequest) (reply *v1.EmptyReply, err error) {
+	reply = &v1.EmptyReply{}
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	// 获取maintain_title
+	title, err := model.NewMaintainTitleModel().Get(database.DB().Where("style_id = ?", req.StyleId))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	// 判断是否插入机油
+	info, err := model.NewMaintainDetailModel().Get(database.DB().Where("style_id = ? AND item_id = ?", req.StyleId, consts.Oil))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	var (
+		hasOil bool
+	)
+
+	if err == nil && info != nil && info.ID != 0 {
+		hasOil = true
+	}
+
+	var (
+		tx = database.DB().Begin()
+	)
+
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+			return
+		}
+
+		tx.Commit()
+	}()
+
+	if req.Id == 0 {
+		insert := model.GdMaintainDetail{
+			StyleId:   req.StyleId,
+			ItemId:    req.ItemId,
+			StartMile: req.StartMile,
+			MileCycle: req.MileCycle,
+			StartDate: req.StartDate,
+			DateCycle: req.DateCycle,
+			CreatedAt: time.Now(),
+			UpdatedAt: time.Now(),
+		}
+
+		if err := model.NewMaintainDetailModel().Insert(tx, &insert); err != nil {
+			return reply, errors.SystemError
+		}
+	} else {
+		values := map[string]interface{}{
+			"start_mile": req.StartMile,
+			"mile_cycle": req.MileCycle,
+			"start_date": req.StartDate,
+			"date_cycle": req.DateCycle,
+			"item_id":    req.ItemId,
+			"updated_at": time.Now().Format("2006-01-02 15:04:05"),
+		}
+
+		if err := model.NewMaintainDetailModel().Update(tx.Where("id = ?", req.Id), values); err != nil {
+			return reply, errors.SystemError
+		}
+	}
+
+	// 以前插入机油,直接结束, 且当次插入不是机油
+	if hasOil && req.ItemId != consts.Oil {
+		return reply, nil
+	}
+
+	// 如果此条为机油
+	if req.ItemId == consts.Oil {
+		if title == nil || title.ID == 0 {
+			// 没有title
+			title = &model.GdMaintainTitle{
+				StartMile:            req.StartMile,
+				StartDate:            req.StartDate,
+				StyleId:              req.StyleId,
+				MaintainMileMinCycle: req.MileCycle,
+				MaintainDateMinCycle: req.DateCycle,
+				RepairCycle:          req.MileCycle,
+				WashCycle:            req.MileCycle,
+				CreatedAt:            time.Now(),
+				UpdatedAt:            time.Now(),
+			}
+
+			if err := model.NewMaintainTitleModel().Insert(tx, title); err != nil {
+				return reply, errors.SystemError
+			}
+		} else {
+			values := map[string]interface{}{
+				"start_mile":              req.StartMile,
+				"start_date":              req.StartDate,
+				"maintain_mile_min_cycle": req.MileCycle,
+				"maintain_date_min_cycle": req.DateCycle,
+				"repair_cycle":            req.MileCycle,
+				"wash_cycle":              req.MileCycle,
+				"updated_at":              time.Now().Format("2006-01-02 15:04:05"),
+			}
+
+			if err := model.NewMaintainTitleModel().Update(tx.Where("id = ?", title.ID), values); err != nil {
+				return reply, errors.SystemError
+			}
+		}
+
+		return reply, nil
+	}
+
+	// 如果都不是
+	// 获取已有的维保数据
+	list, err := model.NewMaintainDetailModel().
+		MaintainDetailList(database.DB().Where("style_id = ?", req.StyleId))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return nil, errors.SystemError
+	}
+
+	var (
+		idx      int
+		miniMile int64
+	)
+
+	list = append(list, model.MaintainDetailItem{
+		StartMile: req.StartMile,
+		MileCycle: req.MileCycle,
+		StartDate: req.StartDate,
+		DateCycle: req.DateCycle,
+	})
+
+	for k, v := range list {
+		if miniMile == 0 {
+			miniMile = v.MileCycle
+			idx = k
+		}
+		if v.MileCycle != 0 && v.MileCycle < miniMile {
+			miniMile = v.MileCycle
+			idx = k
+		}
+	}
+
+	if title == nil || title.ID == 0 {
+		// 没有title
+		title = &model.GdMaintainTitle{
+			StyleId:              req.StyleId,
+			StartMile:            list[idx].StartMile,
+			StartDate:            list[idx].StartDate,
+			MaintainMileMinCycle: list[idx].MileCycle,
+			MaintainDateMinCycle: list[idx].DateCycle,
+			RepairCycle:          list[idx].MileCycle,
+			WashCycle:            list[idx].MileCycle,
+			CreatedAt:            time.Now(),
+			UpdatedAt:            time.Now(),
+		}
+
+		if err := model.NewMaintainTitleModel().Insert(tx, title); err != nil {
+			return reply, errors.SystemError
+		}
+	} else {
+		values := map[string]interface{}{
+			"start_mile":              list[idx].StartMile,
+			"start_date":              list[idx].StartDate,
+			"maintain_mile_min_cycle": list[idx].MileCycle,
+			"maintain_date_min_cycle": list[idx].DateCycle,
+			"repair_cycle":            list[idx].MileCycle,
+			"wash_cycle":              list[idx].MileCycle,
+			"updated_at":              time.Now().Format("2006-01-02 15:04:05"),
+		}
+		if err := model.NewMaintainTitleModel().Update(tx.Where("id = ?", title.ID), values); err != nil {
+			return reply, errors.SystemError
+		}
+	}
+
+	return reply, nil
+}
+
+func min(a, b int64) int64 {
+	if a < b {
+		return a
+	}
+
+	return b
+}

+ 74 - 0
impl/v1/query/brand.go

@@ -0,0 +1,74 @@
+package query
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+	"adm-vehicle-style/utils"
+
+	jsoniter "github.com/json-iterator/go"
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+type BrandItem struct {
+	BrandID       string `json:"brand_id"`
+	BrandName     string `json:"brand_name"`
+	Logo          string `json:"logo"`
+	BrandNamePrex string `json:"brand_name_prex"`
+}
+
+type BrandListResponse struct {
+	List []BrandItem `json:"list"`
+}
+
+func BrandList(ctx context.Context, params string) (reply *v1.QueryResponse, err error) {
+	reply = &v1.QueryResponse{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	// 构造分页类
+	pagination := model.NewPagination(0, 1000, 0).GetLimitOffset()
+	list, err := model.NewSyBrand().List(database.DB().Where("status = 1"), pagination)
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	res := BrandListResponse {
+		List: make([]BrandItem, 0, len(list)),
+	}
+	for _, v := range list {
+		res.List = append(res.List, BrandItem{
+			BrandID:       v.BrandId,
+			BrandName:     v.BrandName,
+			Logo:          utils.GetBrandLogoById(v.BrandId, int32(v.HasImg)),
+			BrandNamePrex: v.Initial,
+		})
+	}
+
+	reply.Data, _ = jsoniter.MarshalToString(res)
+
+	return reply, nil
+}

+ 22 - 0
impl/v1/query/center.go

@@ -0,0 +1,22 @@
+package query
+
+import (
+	"context"
+
+	"adm-vehicle-style/errors"
+	v1 "adm-vehicle-style/pb/v1"
+)
+
+func Query(ctx context.Context, req *v1.QueryRequest) (reply *v1.QueryResponse, err error) {
+	interfaces := map[string]func(ctx context.Context, params string) (reply *v1.QueryResponse, err error){
+		"001": BrandList,
+		"002": SeriesList,
+		"003": StyleList,
+	}
+
+	if v, ok := interfaces[req.Code]; ok {
+		return v(ctx, req.Params)
+	}
+
+	return reply, errors.InterfaceNoExistError
+}

+ 103 - 0
impl/v1/query/series.go

@@ -0,0 +1,103 @@
+package query
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"sort"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+	"adm-vehicle-style/utils"
+
+	jsoniter "github.com/json-iterator/go"
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+type SeriesListRequest struct {
+	BrandID string `json:"brand_id"`
+}
+
+type seriesItem struct {
+	BrandID    string `json:"brand_id"`
+	SeriesID   string `json:"series_id"`
+	SeriesName string `json:"series_name"`
+	SeriesImg  string `json:"series_img"`
+}
+
+type seriesList struct {
+	Maker string `json:"maker"`
+	SeriesList []seriesItem `json:"series_list"`
+}
+
+type SeriesListResponse struct {
+	List []seriesList `json:"list"`
+}
+
+func SeriesList(ctx context.Context, params string) (reply *v1.QueryResponse, err error) {
+	reply = &v1.QueryResponse{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	var req SeriesListRequest
+	err = jsoniter.UnmarshalFromString(params, &req)
+	if err != nil || req.BrandID == "" {
+		return nil, errors.ParamsError
+	}
+
+	list, err := model.NewSySerieModel().SeriesList(database.DB().Where("brand_id = ? AND status = 1", req.BrandID))
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	seriesMap := make(map[string][]seriesItem)
+	for k := range list {
+		series := seriesItem{
+			BrandID:    list[k].BrandId,
+			SeriesID:   list[k].SeriesId,
+			SeriesName: list[k].SeriesName,
+			SeriesImg:  utils.GetSeriesLogoById(list[k].SeriesId, list[k].HasImg),
+		}
+
+		seriesMap[list[k].Maker] = append(seriesMap[list[k].Maker], series)
+	}
+
+	var keys []string
+	for k := range seriesMap {
+		keys = append(keys, k)
+	}
+
+	sort.Strings(keys)
+
+	res := SeriesListResponse{}
+	for _,v := range keys{
+		si := seriesList{
+			Maker: v,
+			SeriesList: seriesMap[v],
+		}
+		res.List = append(res.List, si)
+	}
+	reply.Data, _ = jsoniter.MarshalToString(res)
+
+	return reply, nil
+}

+ 109 - 0
impl/v1/query/style.go

@@ -0,0 +1,109 @@
+package query
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"sort"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	jsoniter "github.com/json-iterator/go"
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+type StyleListRequest struct {
+	SeriesID string `json:"series_id"`
+}
+
+type styleItem struct {
+	BrandID   string `json:"brand_id"`
+	Maker     string `json:"maker"`
+	ModelYear string `json:"model_year"`
+	Price     string `json:"price"`
+	SeriesID  string `json:"series_id"`
+	StyleID   string `json:"style_id"`
+	StyleName string `json:"style_name"`
+}
+
+type styleList struct {
+	ModelYear string      `json:"model_year"`
+	StyleList []styleItem `json:"style_list"`
+}
+
+type StyleListResponse struct {
+	List []styleList `json:"list"`
+}
+
+func StyleList(ctx context.Context, params string) (reply *v1.QueryResponse, err error) {
+	reply = &v1.QueryResponse{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	var req StyleListRequest
+	err = jsoniter.UnmarshalFromString(params, &req)
+	if err != nil || req.SeriesID == "" {
+		return nil, errors.ParamsError
+	}
+
+	list, err := model.NewSyStyleModel().
+		StyleList(database.DB().Where("series_id = ? AND is_on = 1", req.SeriesID), "brand_id, maker, model_year, price, series_id, style_id, style_name")
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	yearMap := make(map[string][]styleItem)
+	for _, v := range list {
+		yearMap[v.ModelYear] = append(yearMap[v.ModelYear], styleItem{
+			BrandID:   v.BrandId,
+			Maker:     v.Maker,
+			ModelYear: v.ModelYear,
+			Price:     v.Price,
+			SeriesID:  v.SeriesId,
+			StyleID:   v.StyleId,
+			StyleName: v.StyleName,
+		})
+	}
+
+	var keys []string
+	keyLen := 0
+	for k := range yearMap {
+		keys = append(keys, k)
+		keyLen++
+	}
+
+	sort.Strings(keys)
+
+	res := StyleListResponse{}
+	for i := keyLen - 1; i >= 0; i-- {
+		st := styleList{
+			ModelYear: keys[i],
+			StyleList: yearMap[keys[i]],
+		}
+		res.List = append(res.List, st)
+	}
+	reply.Data, _ = jsoniter.MarshalToString(res)
+
+	return reply, nil
+}

+ 128 - 0
impl/v1/series/list.go

@@ -0,0 +1,128 @@
+package series
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	"adm-vehicle-style/consts"
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+	"adm-vehicle-style/utils"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func List(ctx context.Context, req *v1.SeriesListRequest) (reply *v1.SeriesListReply, err error) {
+	reply = &v1.SeriesListReply{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	var join bool
+
+	db := database.DB()
+	if req.BrandName != "" {
+		db = db.Where("brand_name = ?", req.BrandName)
+		join = true
+	}
+
+	if req.BrandId != "" {
+		db = db.Where("t1.brand_id = ?", req.BrandId)
+		join = true
+	}
+
+	if req.OldSeriesName != ""{
+		db = db.Where("old_series_name like ?", "%"+req.OldSeriesName+"%")
+		//db = db.Where("old_series_name = ?", req.OldSeriesName)
+	}
+
+	if req.SeriesName != "" {
+		db = db.Where("series_name = ?", req.SeriesName)
+	}
+
+	if req.SeriesId != "" {
+		db = db.Where("series_id = ?", req.SeriesId)
+	}
+
+	if req.HasImg == -1 {
+		db = db.Where("t1.has_img = 0")
+	} else if req.HasImg == 1 {
+		db = db.Where("t1.has_img = 1")
+	}
+
+	if req.Status == -1 {
+		db = db.Where("t1.status = 0")
+	} else if req.Status == 1 {
+		db = db.Where("t1.status = 1")
+	}
+
+	pageSize := consts.PageSize
+	if req.PageSize != 0 {
+		pageSize = int(req.PageSize)
+	}
+
+	// 构造分页类
+	pagination := model.NewPagination(int(req.Page), pageSize, 0).GetLimitOffset()
+
+	count, err := model.NewSySerieModel().Count(db, join)
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound || count == 0 {
+		return reply, nil
+	}
+
+	list, err := model.NewSySerieModel().List(db, pagination, join)
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	reply.List = make([]*v1.SeriesList, 0, len(list))
+	for _, v := range list {
+		reply.List = append(reply.List, &v1.SeriesList{
+			Id:         v.ID,
+			BrandName:  v.BrandName,
+			SeriesId:   v.SeriesId,
+			Maker:      v.Maker,
+			SeriesName: v.SeriesName,
+			Status:     v.Status,
+			Image:      utils.GetSeriesLogoById(v.SeriesId, v.HasImg),
+			BrandId:    v.BrandId,
+			OldSeriesName:v.OldSeriesName,
+		})
+	}
+
+	// 计算分页结果
+	pagination.CalPage(int(count))
+
+	reply.CurrentPage = int64(pagination.CurrentPage)
+	reply.PerPage = int64(pagination.PerPage)
+	reply.Total = int64(pagination.Total)
+	reply.FirstPage = int64(pagination.FirstPage)
+	reply.LastPage = int64(pagination.LastPage)
+	reply.PrevPage = int64(pagination.PrevPage)
+	reply.NextPage = int64(pagination.NextPage)
+
+	return reply, err
+}

+ 77 - 0
impl/v1/series/update.go

@@ -0,0 +1,77 @@
+package series
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"time"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+)
+
+func Update(ctx context.Context, req *v1.UpdateSeriesRequest) (reply *v1.EmptyReply, err error) {
+	reply = &v1.EmptyReply{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.Id <= 0 || req.SeriesName == "" || req.Maker == "" {
+		return reply, errors.ParamsError
+	}
+	values := map[string]interface{}{
+		"series_name": req.SeriesName,
+		"maker":       req.Maker,
+		"status":      req.Status,
+		"update_time": time.Now().Format("200601"),
+		"old_series_name":req.OldSeriesName,
+	}
+
+	if req.HasImg == 1 {
+		values["has_img"] = 1
+	}
+
+	tx := database.DB().Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+			return
+		}
+
+		tx.Commit()
+	}()
+
+	if err = model.NewSySerieModel().Update(tx.Where("id = ?", req.Id), values); err != nil {
+		return reply, errors.SystemError
+	}
+
+	res, err := model.NewSySerieModel().Get(database.DB().Where("id = ?", req.Id))
+	if err != nil {
+		return reply, errors.SystemError
+	}
+
+	if err = model.NewSyStyleModel().Update(tx.Where("series_id = ?", res.SeriesId), map[string]interface{}{
+		"is_on":       req.Status,
+		"series_name": req.SeriesName,
+	}); err != nil {
+		return reply, errors.SystemError
+	}
+
+	return reply, nil
+}

+ 233 - 0
impl/v1/style/export.go

@@ -0,0 +1,233 @@
+package style
+
+import (
+	"bytes"
+	"context"
+	"encoding/csv"
+	"encoding/json"
+	"fmt"
+	"reflect"
+	"strconv"
+	"time"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	"adm-vehicle-style/parser"
+	"adm-vehicle-style/pb"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"github.com/aliyun/aliyun-oss-go-sdk/oss"
+	jsoniter "github.com/json-iterator/go"
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func createFileAndUpload(id int64, list []model.GdSyStyle, fields []string) {
+	values := make([][]string, 0, 10000)
+	values = append(values, fields)
+
+	for _, v := range list {
+		refType := reflect.TypeOf(v)
+		refVal := reflect.ValueOf(v)
+		length := refType.NumField()
+		item := make([]string, 0, length)
+		for i := 0; i < length; i++ {
+			vField := refVal.Field(i)
+			f := refType.Field(i)
+			j := f.Tag.Get("json")
+			for _, field := range fields {
+				if field == j {
+					switch vField.Kind() {
+					case reflect.String:
+						item = append(item, vField.String())
+					case reflect.Int64:
+						item = append(item, strconv.FormatInt(vField.Int(), 10))
+					}
+				}
+			}
+		}
+		values = append(values, item)
+	}
+
+	client, err := oss.New(
+		parser.Conf.Oss.EndPoint,
+		parser.Conf.Oss.AccessKey,
+		parser.Conf.Oss.AccessSecret,
+	)
+	if err != nil {
+		return
+	}
+
+	bucket, err := client.Bucket(parser.Conf.Oss.DownLoadBucket)
+	if err != nil {
+		return
+	}
+
+	path := "export_style/" + strconv.FormatInt(time.Now().UnixNano(), 10) + ".csv"
+	var b bytes.Buffer
+	_, _ = b.WriteString("\xEF\xBB\xBF")
+	w := csv.NewWriter(&b)
+	w.UseCRLF = true
+	w.WriteAll(values)
+	reader := bytes.NewReader(b.Bytes())
+
+	err = bucket.PutObject(path, reader)
+	if err != nil {
+		return
+	}
+
+	model.NewExportStyleTaskModel().Update(database.DB().Where("id = ?", id), map[string]interface{}{
+		"path": "https://" + parser.Conf.Oss.DownLoadBucket + "." + parser.Conf.Oss.EndPoint + "/" + path,
+	})
+}
+
+func Export(ctx context.Context, req *v1.ExportStyleRequest) (reply *v1.ExportStyleReply, err error) {
+	reply = &v1.ExportStyleReply{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.TaskName == "" || req.Fields == "" {
+		return reply, errors.ParamsError
+	}
+
+	type p05Request struct {
+		TaskName  string `json:"task_name"`
+		Type      int    `json:"type"`
+		StartTime int64  `json:"start_time"`
+		EndTime   int64  `json:"end_time"`
+		List      string `json:"list"`
+	}
+
+	r := p05Request{
+		TaskName: req.TaskName,
+		List:     req.Fields,
+	}
+
+	str, _ := jsoniter.MarshalToString(r)
+	_, err = pb.Data.Query(ctx, &v1.QueryRequest{
+		Code:   "P05",
+		Params: str,
+	})
+	if err != nil {
+		logger.Error("func",
+			zap.String("call", "pb.Data.Query.P05"),
+			zap.String("params", str),
+			zap.String("error", err.Error()))
+		return reply, err
+	}
+
+	return reply, nil
+}
+
+func ExportTaskList(ctx context.Context, req *v1.EmptyReply) (reply *v1.ExportStyleTaskListReply, err error) {
+	reply = &v1.ExportStyleTaskListReply{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	list, err := model.NewExportStyleTaskModel().List(database.DB())
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	reply.List = make([]*v1.ExportStyleTaskList, 0, len(list))
+	for _, v := range list {
+		reply.List = append(reply.List, &v1.ExportStyleTaskList{
+			Id:        v.ID,
+			TaskName:  v.TaskName,
+			Path:      v.Path,
+			CreatedAt: v.CreatedAt.Format("2006-01-02 15:04:05"),
+		})
+	}
+
+	return reply, nil
+}
+
+func DeleteExportTask(ctx context.Context, req *v1.DeleteExportStyleTaskRequest) (reply *v1.EmptyReply, err error) {
+	reply = &v1.EmptyReply{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.Id <= 0 {
+		return reply, errors.ParamsError
+	}
+
+	db := database.DB().Where("id = ?", req.Id)
+
+	task, err := model.NewExportStyleTaskModel().Get(db)
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, errors.DataNotExistError
+	}
+
+	if task.Path != "" {
+		client, err := oss.New(
+			parser.Conf.Oss.EndPoint,
+			parser.Conf.Oss.AccessKey,
+			parser.Conf.Oss.AccessSecret,
+		)
+		if err != nil {
+			return reply, errors.SystemError
+		}
+
+		bucket, err := client.Bucket(parser.Conf.Oss.DownLoadBucket)
+		if err != nil {
+			return reply, errors.SystemError
+		}
+
+		path := task.Path[len("https://"+parser.Conf.Oss.DownLoadBucket+"."+parser.Conf.Oss.EndPoint+"/"):]
+
+		err = bucket.DeleteObject(path)
+		if err != nil {
+			return reply, errors.SystemError
+		}
+	}
+
+	if err = model.NewExportStyleTaskModel().Delete(db); err != nil {
+		return reply, errors.SystemError
+	}
+
+	return reply, nil
+}

+ 338 - 0
impl/v1/style/info.go

@@ -0,0 +1,338 @@
+package style
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+)
+
+func Info(ctx context.Context, req *v1.StyleInfoRequest) (reply *v1.StyleInfoReply, err error) {
+	reply = &v1.StyleInfoReply{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	res, err := model.NewSyStyleModel().Get(database.DB().Where("id = ?", req.Id))
+	if err != nil {
+		return reply, errors.SystemError
+	}
+
+	reply.Aircondition = &v1.StyleInfoReply_Aircondition{
+		AirconditionControlType:       res.AirconditionControlType,
+		CarAirPurifier:                res.CarAirPurifier,
+		FragranceSystem:               res.FragranceSystem,
+		NegativeIonGenerator:          res.NegativeIonGenerator,
+		Pm25Device:                    res.Pm25Device,
+		RearIndependentAirConditioner: res.RearIndependentAirConditioner,
+		RearSeatAirOutlet:             res.RearSeatAirOutlet,
+		Refrigerator:                  res.Refrigerator,
+		TemperatureZoneControl:        res.TemperatureZoneControl,
+	}
+	reply.Basic = &v1.StyleInfoReply_Basic{
+		BrandId:                        res.BrandId,
+		Alternator:                     res.Alternator,
+		BrakingDistanceMeasure:         res.BrakingDistanceMeasure,
+		BrandName:                      res.BrandName,
+		EmissionStandard:               res.EmissionStandard,
+		Engine:                         res.Engine,
+		FastChargeAmount:               res.FastChargeAmount,
+		FastChargingTime:               res.FastChargingTime,
+		FuelTypeDetail:                 res.FuelTypeDetail,
+		GearboxDesc:                    res.GearboxDesc,
+		HundredAccelerate:              res.HundredAccelerate,
+		HundredAccelerateMeasure:       res.HundredAccelerateMeasure,
+		Level:                          res.Level,
+		Lwh:                            res.Lwh,
+		Maker:                          res.Maker,
+		MaximumPower:                   res.MaximumPower,
+		MaximumSimulationMilage:        res.MaximumSimulationMilage,
+		MaximumSimulationMilageMeasure: res.MaximumSimulationMilageMeasure,
+		MaximumSpeed:                   res.MaximumSpeed,
+		MaximumTorque:                  res.MaximumTorque,
+		ModelYear:                      res.ModelYear,
+		OilWearComrehensive:            res.OilWearComrehensive,
+		OilWearMeasure:                 res.OilWearMeasure,
+		Price:                          res.Price,
+		PriceYuan:                      res.PriceYuan,
+		SeriesId:                       res.SeriesId,
+		SeriesName:                     res.SeriesName,
+		SlowChargingTime:               res.SlowChargingTime,
+		StyleId:                        res.StyleId,
+		StyleName:                      res.StyleName,
+		SubLevel:                       res.SubLevel,
+		VehicleStructure:               res.VehicleStructure,
+		VehicleWarranty:                res.VehicleWarranty,
+	}
+	reply.Body = &v1.StyleInfoReply_Body{
+		BackWheelDistance:      res.BackWheelDistance,
+		DoorNumber:             res.DoorNumber,
+		FrontWheelDistance:     res.FrontWheelDistance,
+		High:                   res.High,
+		Long:                   res.Long,
+		MinimumGroundClearance: res.MinimumGroundClearance,
+		OilboxVolume:           res.OilboxVolume,
+		SeatNumber:             res.SeatNumber,
+		TrunkVolume:            res.TrunkVolume,
+		UnladenMass:            res.UnladenMass,
+		Wheelbase:              res.Wheelbase,
+		Wide:                   res.Wide,
+	}
+	reply.Chassis = &v1.StyleInfoReply_Chassis{
+		AssistType:          res.AssistType,
+		BackSuspentionType:  res.BackSuspentionType,
+		BodyStructure:       res.BodyStructure,
+		DriveType:           res.DriveType,
+		FrontSuspentionType: res.FrontSuspentionType,
+	}
+	reply.Control = &v1.StyleInfoReply_Control{
+		AirSuspension:                   res.AirSuspension,
+		AscentAssist:                    res.AscentAssist,
+		AutoHold:                        res.AutoHold,
+		AutomaticDrivingAssistance:      res.AutomaticDrivingAssistance,
+		AutomaticParking:                res.AutomaticParking,
+		BackParkingRador:                res.BackParkingRador,
+		CentralDiffLock:                 res.CentralDiffLock,
+		CruiseSystem:                    res.CruiseSystem,
+		DrivingModeSelection:            res.DrivingModeSelection,
+		EInductionSuspension:            res.EInductionSuspension,
+		Edl:                             res.Edl,
+		EngineStartStopTechnology:       res.EngineStartStopTechnology,
+		FrontParkingRador:               res.FrontParkingRador,
+		Hdc:                             res.Hdc,
+		OverallActiveSteeringSystem:     res.OverallActiveSteeringSystem,
+		ReverseVehicleSideWarningSystem: res.ReverseVehicleSideWarningSystem,
+		VariableSteeringRatio:           res.VariableSteeringRatio,
+		VariableSuspension:              res.VariableSuspension,
+		WadeSensingSystem:               res.WadeSensingSystem,
+	}
+	reply.Electric = &v1.StyleInfoReply_Electric{
+		BackElectricMaximumPower:      res.BackElectricMaximumPower,
+		BackElectricTorque:            res.BackElectricTorque,
+		BatteryEnergy:                 res.BatteryEnergy,
+		BatteryPackWarranty:           res.BatteryPackWarranty,
+		BatteryType:                   res.BatteryType,
+		FrontElectricMaximumPower:     res.FrontElectricMaximumPower,
+		FrontElectricTorque:           res.FrontElectricTorque,
+		HundredElectricityConsumption: res.HundredElectricityConsumption,
+		MaximumSimulationMilage:       res.MaximumSimulationMilage,
+		MotorLayout:                   res.MotorLayout,
+		MotorNumber:                   res.MotorNumber,
+		MotorType:                     res.MotorType,
+		SystemIntegratedPower:         res.SystemIntegratedPower,
+		SystemIntegratedTorque:        res.SystemIntegratedTorque,
+		TotalMotorPower:               res.TotalMotorPower,
+		TotalMotorTorque:              res.TotalMotorTorque,
+	}
+	reply.Engine = &v1.StyleInfoReply_Engine{
+		AirIntakForm:         res.AirIntakForm,
+		CylinderArrangement:  res.CylinderArrangement,
+		CylinderDiameter:     res.CylinderDiameter,
+		CylinderHeadMaterial: res.CylinderHeadMaterial,
+		CylinderMaterial:     res.CylinderMaterial,
+		CylinderNumber:       res.CylinderNumber,
+		CylinderValveNumber:  res.CylinderValveNumber,
+		Displacement:         res.Displacement,
+		DisplacementL:        res.DisplacementL,
+		EngineTechnology:     res.EngineTechnology,
+		EngineType:           res.EngineType,
+		FuelLable:            res.FuelLable,
+		FuelTypeDetail:       res.FuelTypeDetail,
+		MaximumHorsepower:    res.MaximumHorsepower,
+		MaximumPowerRpm:      res.MaximumPowerRpm,
+		OilSupplyMode:        res.OilSupplyMode,
+		PistonStroke:         res.PistonStroke,
+		ReductionRatio:       res.ReductionRatio,
+		Rpm:                  res.Rpm,
+		ValveMechanism:       res.ValveMechanism,
+	}
+	reply.External = &v1.StyleInfoReply_External{
+		ActiveIntakeGrille:                 res.ActiveIntakeGrille,
+		BatteryPreHeating:                  res.BatteryPreHeating,
+		CentralControlLock:                 res.CentralControlLock,
+		ElectricTrunk:                      res.ElectricTrunk,
+		ElectronicAntiTheft:                res.ElectronicAntiTheft,
+		Eosd:                               res.Eosd,
+		FramelessDesignDoor:                res.FramelessDesignDoor,
+		HideElectricDoorHandle:             res.HideElectricDoorHandle,
+		InductiveTrunk:                     res.InductiveTrunk,
+		KeyType:                            res.KeyType,
+		KeylessEntrySystem:                 res.KeylessEntrySystem,
+		KeylessStartSystem:                 res.KeylessStartSystem,
+		OutsidePedal:                       res.OutsidePedal,
+		RearCompartmentPositionMemory:      res.RearCompartmentPositionMemory,
+		RemoteStart:                        res.RemoteStart,
+		RimMaterial:                        res.RimMaterial,
+		RoofLuggageRack:                    res.RoofLuggageRack,
+		SideSlidingDoor:                    res.SideSlidingDoor,
+		SkylightType:                       res.SkylightType,
+		SportsAppearanceKit:                res.SportsAppearanceKit,
+		Tail:                               res.Tail,
+		TheTailgateGlassOpensIndependently: res.TheTailgateGlassOpensIndependently,
+	}
+	reply.Gearbox = &v1.StyleInfoReply_Gearbox{
+		GearNumber:  res.GearNumber,
+		GearboxDesc: res.GearboxDesc,
+		GearboxType: res.GearboxType,
+	}
+	reply.Internal = &v1.StyleInfoReply_Internal{
+		ActiveNoiseReduction:         res.ActiveNoiseReduction,
+		CarDrivingRecorder:           res.CarDrivingRecorder,
+		DrivingComputerDisplay:       res.DrivingComputerDisplay,
+		ElectricallyAdjustablePedal:  res.ElectricallyAdjustablePedal,
+		FullLcdDashboard:             res.FullLcdDashboard,
+		FullLcdDashboardSize:         res.FullLcdDashboardSize,
+		HudRisingNumberDisplay:       res.HudRisingNumberDisplay,
+		MobilePhoneWirelessCharging:  res.MobilePhoneWirelessCharging,
+		MultiFunctionalSteeringWheel: res.MultiFunctionalSteeringWheel,
+		SteeringWheelAdjustment:      res.SteeringWheelAdjustment,
+		SteeringWheelHeating:         res.SteeringWheelHeating,
+		SteeringWheelMaterial:        res.SteeringWheelMaterial,
+		SteeringWheelRemember:        res.SteeringWheelRemember,
+		SteeringWheelShift:           res.SteeringWheelShift,
+	}
+	reply.Light = &v1.StyleInfoReply_Light{
+		AdaptiveFarNear:     res.AdaptiveFarNear,
+		Atmosphere:          res.Atmosphere,
+		AutoHead:            res.AutoHead,
+		Clean:               res.Clean,
+		Daytime:             res.Daytime,
+		Far:                 res.Far,
+		Fog:                 res.Fog,
+		HeadlampDelayOff:    res.HeadlampDelayOff,
+		HeadlampRainFogMode: res.HeadlampRainFogMode,
+		HeightAdjustable:    res.HeightAdjustable,
+		LightingFeatures:    res.LightingFeatures,
+		Near:                res.Near,
+		SideTurn:            res.SideTurn,
+		SteeringAssistLamp:  res.SteeringAssistLamp,
+		TouchReadingLamp:    res.TouchReadingLamp,
+	}
+	reply.Media = &v1.StyleInfoReply_Media{
+		BackLcd:                             res.BackLcd,
+		CarInternet:                         res.CarInternet,
+		CarPhone:                            res.CarPhone,
+		CarTv:                               res.CarTv,
+		CdDvd:                               res.CdDvd,
+		CenterConsoleLargeScreenSize:        res.CenterConsoleLargeScreenSize,
+		CentralColourScreen:                 res.CentralColourScreen,
+		CentralLcdSplitScreen:               res.CentralLcdSplitScreen,
+		ChargingInterface:                   res.ChargingInterface,
+		FaceRecognition:                     res.FaceRecognition,
+		GestureControl:                      res.GestureControl,
+		Gps:                                 res.Gps,
+		InterfaceOf12V:                      res.InterfaceOf12v,
+		MobileInternet:                      res.MobileInternet,
+		NavigationTrafficInformationDisplay: res.NavigationTrafficInformationDisplay,
+		NumberOfInterfaces:                  res.NumberOfInterfaces,
+		Ota:                                 res.Ota,
+		PowerOf220V:                         res.PowerOf220v,
+		RearControlMultimedia:               res.RearControlMultimedia,
+		RoadRescueCall:                      res.RoadRescueCall,
+		SpeakerBrand:                        res.SpeakerBrand,
+		SpeakerNumber:                       res.SpeakerNumber,
+		VoiceControl:                        res.VoiceControl,
+	}
+	reply.Optional = &v1.StyleInfoReply_Optional{
+		BodyColour:    res.BodyColour,
+		InteriorColor: res.InteriorColor,
+	}
+	reply.Rearview = &v1.StyleInfoReply_Rearview{
+		AntiPinchHand:                  res.AntiPinchHand,
+		BackElectricWindow:             res.BackElectricWindow,
+		BackSidePrivacy:                res.BackSidePrivacy,
+		BackSideSunshade:               res.BackSideSunshade,
+		BackSunshade:                   res.BackSunshade,
+		BackWiper:                      res.BackWiper,
+		Cosmetic:                       res.Cosmetic,
+		ExteriorRearviewMirrorFunction: res.ExteriorRearviewMirrorFunction,
+		FrontElectricWindow:            res.FrontElectricWindow,
+		FrontWiper:                     res.FrontWiper,
+		HeatableSprayNozzle:            res.HeatableSprayNozzle,
+		InteriorRearviewMirrorFunction: res.InteriorRearviewMirrorFunction,
+		MultilayerSoundInsulationGlass: res.MultilayerSoundInsulationGlass,
+		WindowOneKey:                   res.WindowOneKey,
+	}
+	reply.Safety = &v1.StyleInfoReply_Safety{
+		Abs:                         res.Abs,
+		ActiveBrake:                 res.ActiveBrake,
+		AsrTcsTrc:                   res.AsrTcsTrc,
+		AuxiliarySeatAirbag:         res.AuxiliarySeatAirbag,
+		BackBeltAirbag:              res.BackBeltAirbag,
+		BackHeadAirbag:              res.BackHeadAirbag,
+		BackSideAirbag:              res.BackSideAirbag,
+		EbaBasBa:                    res.EbaBasBa,
+		EbdCbc:                      res.EbdCbc,
+		Esp:                         res.Esp,
+		FatigueDrivingWarning:       res.FatigueDrivingWarning,
+		FontHeadAirbag:              res.FontHeadAirbag,
+		FrontMiddleAirbag:           res.FrontMiddleAirbag,
+		FrontSideAirbag:             res.FrontSideAirbag,
+		IsoFix:                      res.IsoFix,
+		KneeAirbag:                  res.KneeAirbag,
+		LaneDepartureWarningSystem:  res.LaneDepartureWarningSystem,
+		LaneKeeping:                 res.LaneKeeping,
+		MainSeatAirbag:              res.MainSeatAirbag,
+		NightVision:                 res.NightVision,
+		ParallelAuxiliary:           res.ParallelAuxiliary,
+		PassengerSeatCushionAirbag:  res.PassengerSeatCushionAirbag,
+		PassivePedestrianProtection: res.PassivePedestrianProtection,
+		RearCentralAirbag:           res.RearCentralAirbag,
+		RearSeatAntiSlideAirbag:     res.RearSeatAntiSlideAirbag,
+		RoadTrafficSignRecognition:  res.RoadTrafficSignRecognition,
+		RunFlatTire:                 res.RunFlatTire,
+		SeatBeltWarning:             res.SeatBeltWarning,
+		TirePresureMonitor:          res.TirePresureMonitor,
+	}
+	reply.Seat = &v1.StyleInfoReply_Seat{
+		AuxiliaryAdjustableButton:   res.AuxiliaryAdjustableButton,
+		AuxiliaryElectricAdust:      res.AuxiliaryElectricAdust,
+		AuxiliarySeatAdjustmentMode: res.AuxiliarySeatAdjustmentMode,
+		BackCupHolder:               res.BackCupHolder,
+		BackDownType:                res.BackDownType,
+		BackFoldTable:               res.BackFoldTable,
+		BackHandrail:                res.BackHandrail,
+		ElectricSeatRemeber:         res.ElectricSeatRemeber,
+		FrontHandrail:               res.FrontHandrail,
+		FrontSeatFunction:           res.FrontSeatFunction,
+		HeatingCoolingCupHolder:     res.HeatingCoolingCupHolder,
+		MainElectricAdust:           res.MainElectricAdust,
+		MainSeatAdjustmentMode:      res.MainSeatAdjustmentMode,
+		RearSeatElectricAdjustment:  res.RearSeatElectricAdjustment,
+		RearSeatFunction:            res.RearSeatFunction,
+		RearSeatPowerDown:           res.RearSeatPowerDown,
+		SeatLayoutForm:              res.SeatLayoutForm,
+		SeatMaterial:                res.SeatMaterial,
+		SecondIndependent:           res.SecondIndependent,
+		SecondRowSeatAdjustment:     res.SecondRowSeatAdjustment,
+		SportSeat:                   res.SportSeat,
+	}
+	reply.Wheelbrake = &v1.StyleInfoReply_Wheelbrake{
+		BackBrakeType:           res.BackBrakeType,
+		BackWheelSpecification:  res.BackWheelSpecification,
+		FrontBrakeType:          res.FrontBrakeType,
+		FrontWheelSpecification: res.FrontWheelSpecification,
+		ParkingBrakeType:        res.ParkingBrakeType,
+		SpareWheelSpecification: res.SpareWheelSpecification,
+	}
+
+	return reply, nil
+}

+ 141 - 0
impl/v1/style/list.go

@@ -0,0 +1,141 @@
+package style
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	"adm-vehicle-style/consts"
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+	"gorm.io/gorm"
+)
+
+func List(ctx context.Context, req *v1.StyleListRequest) (reply *v1.StyleListReply, err error) {
+	reply = &v1.StyleListReply{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	db := database.DB()
+	if req.BrandName != "" {
+		db = db.Where("brand_name = ?", req.BrandName)
+	}
+
+	if req.SeriesName != "" {
+		db = db.Where("series_name = ?", req.SeriesName)
+	}
+
+	if req.Maker != "" {
+		db = db.Where("maker = ?", req.Maker)
+	}
+
+	if req.ModelYear != 0 {
+		db = db.Where("model_year = ?", req.ModelYear)
+	}
+
+	if req.StyleName != "" {
+		db = db.Where("style_name like ?", "%"+req.StyleName+"%")
+	}
+
+	if req.BrandId != "" {
+		db = db.Where("brand_id = ?", req.BrandId)
+	}
+
+	if req.SeriesId != "" {
+		db = db.Where("series_id = ?", req.SeriesId)
+	}
+
+	if req.StyleId != "" {
+		db = db.Where("t1.style_id = ?", req.StyleId)
+	}
+
+	switch req.Status {
+	case -1:
+		db = db.Where("is_on = 0")
+	case 1:
+		db = db.Where("is_on = 1")
+	}
+
+	var join bool
+	switch req.HasManual {
+	case -1:
+		db = db.Where("t2.id is null")
+		join = true
+	case 1:
+		db = db.Where("t2.id <> 0")
+		join = true
+	}
+
+	pageSize := consts.PageSize
+	if req.PageSize != 0 {
+		pageSize = int(req.PageSize)
+	}
+
+	// 构造分页类
+	pagination := model.NewPagination(int(req.Page), pageSize, 0).GetLimitOffset()
+
+	count, err := model.NewSyStyleModel().Count(db, join)
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound || count == 0 {
+		return reply, nil
+	}
+
+	list, err := model.NewSyStyleModel().List(db, pagination, join)
+	if err != nil && err != gorm.ErrRecordNotFound {
+		return reply, errors.SystemError
+	}
+
+	if err == gorm.ErrRecordNotFound {
+		return reply, nil
+	}
+
+	reply.List = make([]*v1.StyleList, 0, len(list))
+
+	for _, v := range list {
+		reply.List = append(reply.List, &v1.StyleList{
+			Id:         v.ID,
+			StyleId:    v.StyleId,
+			BrandName:  v.BrandName,
+			Maker:      v.Maker,
+			SeriesName: v.SeriesName,
+			StyleName:  v.StyleName,
+			Status:     v.IsOn,
+			MaintainId: v.MaintainId,
+			SeriesId:   v.SeriesId,
+			BrandId:    v.BrandId,
+		})
+	}
+
+	// 计算分页结果
+	pagination.CalPage(int(count))
+
+	reply.CurrentPage = int64(pagination.CurrentPage)
+	reply.PerPage = int64(pagination.PerPage)
+	reply.Total = int64(pagination.Total)
+	reply.FirstPage = int64(pagination.FirstPage)
+	reply.LastPage = int64(pagination.LastPage)
+	reply.PrevPage = int64(pagination.PrevPage)
+	reply.NextPage = int64(pagination.NextPage)
+
+	return reply, nil
+}

+ 142 - 0
impl/v1/style/update.go

@@ -0,0 +1,142 @@
+package style
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"strings"
+	"gorm.io/gorm"
+	"time"
+
+	"adm-vehicle-style/errors"
+	"adm-vehicle-style/model"
+	v1 "adm-vehicle-style/pb/v1"
+
+	jsoniter "github.com/json-iterator/go"
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/logger"
+	"go.uber.org/zap"
+	"google.golang.org/grpc/status"
+)
+
+func Update(ctx context.Context, req *v1.UpdateStyleRequest) (reply *v1.EmptyReply, err error) {
+	reply = &v1.EmptyReply{}
+
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	if req.Id <= 0 || req.StyleName == "" {
+		return reply, errors.ParamsError
+	}
+	values := map[string]interface{}{
+		"style_name": req.StyleName,
+		"is_on":      req.Status,
+		"updated_at": time.Now().Unix(),
+	}
+
+	if err = model.NewSyStyleModel().Update(database.DB().Where("id = ?", req.Id), values); err != nil {
+		return reply, errors.SystemError
+	}
+
+	return reply, nil
+}
+
+func updateAds14(db *gorm.DB,styleId string ,c2Id int ,attributeRule string) error {
+	ads14 :=  &model.Ads14{}
+	ads14.StyleId = styleId
+	ads14.C2Id = c2Id
+	err := ads14.Query(db,map[string]interface{}{"style_id":ads14.StyleId,"c2_id":ads14.C2Id})
+	ads14.AttributeRule = attributeRule
+	if err != nil{
+		if err == gorm.ErrRecordNotFound{
+			err = ads14.Insert(db)
+			if err != nil && !strings.Contains(err.Error(), "Duplicate") {
+				return errors.SystemError
+			}
+		}else{
+			return errors.SystemError
+		}
+	}else{
+		err = ads14.Update(db)
+		if err != nil && err != gorm.ErrRecordNotFound {
+			return errors.SystemError
+		}
+	}
+	return nil
+}
+
+func UpdateStyleInfo(ctx context.Context, req *v1.UpdateStyleInfoRequest) (reply *v1.EmptyReply, err error){
+	reply = &v1.EmptyReply{}
+	if req.Id <= 0 || req.Data == "" {
+		return reply, errors.ParamsError
+	}
+
+	db := database.DB().Begin()
+	err = UpdateStyleInfoImpl(db,req)
+	if err != nil{
+		db.Rollback()
+	}else{
+		db.Commit()
+	}
+
+	return reply,err
+}
+
+func UpdateStyleInfoImpl(db *gorm.DB, req *v1.UpdateStyleInfoRequest) (err error) {
+	// 捕获各个task中的异常并返回给调用者
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%+v", r)
+			e := &status.Status{}
+			if er := json.Unmarshal([]byte(err.Error()), e); er != nil {
+				logger.Error("err",
+					zap.String("system_err", err.Error()),
+					zap.Stack("stacktrace"))
+			}
+		}
+	}()
+
+	values := make(map[string]interface{})
+	_ = jsoniter.UnmarshalFromString(req.Data, &values)
+	values["updated_at"] = time.Now().Unix()
+	res, err := model.NewSyStyleModel().Get(db.Where("id = ?", req.Id))
+	if err != nil {
+		return errors.SystemError
+	}
+
+	if err = model.NewSyStyleModel().Update(db.Where("id = ?", req.Id), values); err != nil {
+		return errors.SystemError
+	}
+
+	var front ,back string
+	if value ,ok := values["front_wheel_specification"];ok{
+		front = value.(string)
+	}
+
+	if value,ok := values["back_wheel_specification"];ok{
+		back = value.(string)
+	}
+
+	if front != "" && front != res.FrontWheelSpecification{
+		err = updateAds14(db,res.StyleId,1001,front)
+		if err != nil{
+			return err
+		}
+	}
+
+	if back != "" && back != res.BackWheelSpecification{
+		return  updateAds14(db,res.StyleId,1002,back)
+	}
+
+	return nil
+}

+ 1 - 0
init

@@ -0,0 +1 @@
+111

+ 1 - 0
logs/adm-vehicle-style.log

@@ -0,0 +1 @@
+{"L":"ERROR","T":"2022-06-24 10:04:37.504","C":"style/update.go:102","M":"err","system_err":"interface conversion: interface {} is nil, not string","stacktrace":"adm-vehicle-style/impl/v1/style.UpdateStyleInfoImpl.func1\n\tD:/mygo/src/adm-vehicle-style/impl/v1/style/update.go:104\nruntime.gopanic\n\tC:/Program Files/Go/src/runtime/panic.go:965\nruntime.panicdottypeE\n\tC:/Program Files/Go/src/runtime/iface.go:261\nadm-vehicle-style/impl/v1/style.UpdateStyleInfoImpl\n\tD:/mygo/src/adm-vehicle-style/impl/v1/style/update.go:122\nadm-vehicle-style/impl/v1/style.UpdateStyleInfo\n\tD:/mygo/src/adm-vehicle-style/impl/v1/style/update.go:85\nadm-vehicle-style/impl.(*Rcvr).UpdateStyleInfo.func1\n\tD:/mygo/src/adm-vehicle-style/impl/rcvr.go:121\ngitlab.sygd.com/repo/gopkgs/tasker/rpctasker.Exec\n\tD:/mygo/pkg/mod/gitlab.sygd.com/repo/gopkgs@v1.1.1/tasker/rpctasker/tasker.go:47\nadm-vehicle-style/impl.(*Rcvr).UpdateStyleInfo\n\tD:/mygo/src/adm-vehicle-style/impl/rcvr.go:125\nadm-vehicle-style/pb._VehicleStyle_UpdateStyleInfo_Handler\n\tD:/mygo/src/adm-vehicle-style/pb/adm_vehicle_style.pb.go:676\ngoogle.golang.org/grpc.(*Server).processUnaryRPC\n\tD:/mygo/pkg/mod/google.golang.org/grpc@v1.29.0/server.go:1082\ngoogle.golang.org/grpc.(*Server).handleStream\n\tD:/mygo/pkg/mod/google.golang.org/grpc@v1.29.0/server.go:1405\ngoogle.golang.org/grpc.(*Server).serveStreams.func1.1\n\tD:/mygo/pkg/mod/google.golang.org/grpc@v1.29.0/server.go:746"}

+ 135 - 0
main.go

@@ -0,0 +1,135 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package main
+
+import (
+	"context"
+	"flag"
+	"fmt"
+	"log"
+	"net"
+	"os"
+	"os/signal"
+	"syscall"
+	"time"
+
+	"adm-vehicle-style/etcd"
+	"adm-vehicle-style/impl"
+	"adm-vehicle-style/parser"
+	"adm-vehicle-style/pb"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"git.getensh.com/common/gopkgsv2/tasker"
+	"gopkg.in/ini.v1"
+
+	"google.golang.org/grpc"
+)
+
+var (
+	configFile = flag.String("config", "/etc/adm/common.yaml", "config file location")
+	appConf    = flag.String("local_config", "/etc/adm-vehicle-style/app.conf", "config file location")
+	version    = flag.Bool("version", false, "print the version")
+	GitCommit  = "library-import"
+	Version    = "library-import"
+)
+
+func showVersion() {
+	fmt.Println("Version:  ", Version)
+	fmt.Println("GitCommit:", GitCommit)
+}
+
+func prepare(filename string) {
+	// 加载配置
+	err := parser.LoadConfig(filename)
+	if err != nil {
+		fmt.Printf("get conf failed, err: %+v\n\n", err)
+		os.Exit(1)
+	}
+
+	// 注册处理函数
+	parser.Register(parser.MysqlHandler, parser.LoggerHandler)
+	// parser.Register(parser.LoggerHandler)
+	// 执行注册的处理函数
+	parser.Handle()
+}
+
+func run(discoveryType, etcdAddr, serviceIp, servicePort string) {
+	if discoveryType == "etcd" {
+		etcd.Init(etcdAddr, serviceIp, servicePort)
+	}
+
+	// 开始监听
+	serveAddr := serviceIp + ":" + servicePort
+
+	log.Printf("Listening and serving TCP on %s\n", serveAddr)
+	lis, err := net.Listen("tcp", serveAddr)
+	if err != nil {
+		os.Exit(1)
+	}
+	s := grpc.NewServer()
+	defer s.GracefulStop()
+
+	impl.Register(s)
+
+	// 建立rpc客户端
+	conns := pb.SetupClients()
+	for _, conn := range conns {
+		defer conn.Close()
+	}
+
+	go func() {
+		if err := s.Serve(lis); err != nil {
+			log.Fatalf("HTTP server listen failed. err: %s\n", err.Error())
+		}
+	}()
+
+	// 优雅关闭服务器
+	sigChan := make(chan os.Signal, 1)
+	// 捕获信号
+	signal.Notify(sigChan, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL)
+	sigValue := <-sigChan
+
+	log.Printf("Got a signal:%v", sigValue)
+
+	// 让tasker安全退出
+	tasker.SignalNotify(sigValue)
+
+	// 不管什么行为,都等待5秒退出
+	log.Println("Start to shutdown server...")
+	_, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+	defer cancel()
+
+	log.Println("Shutdown server finished.")
+}
+
+func main() {
+	defer func() {
+		database.Close()
+	}()
+
+	flag.Parse()
+	if *version {
+		showVersion()
+		os.Exit(1)
+	}
+
+	// 读取app.conf内容
+	cfg, err := ini.Load(*appConf)
+	if err != nil {
+		fmt.Printf("get app.conf failed, err:%+v\n", err)
+		os.Exit(1)
+	}
+
+	discoveryType := cfg.Section("").Key("discoveryType").String()
+	serviceIp := cfg.Section("").Key("serviceIp").String()
+	servicePort := cfg.Section("").Key("servicePort").String()
+	etcdAddr := cfg.Section("").Key("etcdAddr").String()
+	prepare(*configFile)
+
+	// go utils.Free()
+
+	run(discoveryType, etcdAddr, serviceIp, servicePort)
+
+	return
+}

+ 143 - 0
model/ads14.go

@@ -0,0 +1,143 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package model
+
+import (
+	//"adm-vehicle-style/common.in/utils"
+//	"git.getensh.com/common/gopkgsv2/logger"
+//	"go.uber.org/zap"
+	"gorm.io/gorm"
+	"time"
+)
+
+type Ads14 struct {
+	ID        int64  `gorm:"primary_key" json:"-"`
+	StyleId string `json:"style_id"`
+	C2Id int `json:"c2_id"`
+	AttributeRule string `json:"attribute_rule"`
+	Useage string `json:"useage"`
+	Detail string `json:"detail"`
+	CreatedAt int64  `json:"-"`
+	UpdatedAt int64  `json:"-"`
+}
+
+func (Ads14) TableName() string {
+	return "db_adm_ads.t_adm_ads14"
+}
+
+// Insert 插入一条记录
+func (p *Ads14) Insert(db *gorm.DB) error {
+    timeNow := time.Now().Unix()
+	p.CreatedAt = timeNow
+	p.UpdatedAt = timeNow
+
+	err := db.Create(p).Error
+	/*if err != nil {
+		logger.Error("mysql",
+			zap.String("sql", "insert into "+p.TableName()),
+			zap.String("fields", utils.MarshalJsonString(*p)),
+			zap.String("error", err.Error()))
+	}*/
+	return err
+}
+
+func (p *Ads14) InsertByMap(db *gorm.DB, data map[string]interface{}) error {
+	err := db.Model(p).Create(data).Error
+	/*if err != nil {
+		logger.Error("mysql",
+			zap.String("sql", "insert into "+p.TableName()),
+			zap.String("fields", utils.MarshalJsonString(data)),
+			zap.String("error", err.Error()))
+	}*/
+	return err
+}
+
+func (p *Ads14) Delete(db *gorm.DB, filter map[string]interface{}) error {
+	err := db.Where(filter).Delete(p).Error
+	/*if err != nil {
+		logger.Error("mysql",
+			zap.String("sql", "delete from "+p.TableName()),
+			zap.String("fields", utils.MarshalJsonString(filter)),
+			zap.String("error", err.Error()))
+	}*/
+	return err
+}
+
+func (p *Ads14) Save(db *gorm.DB) error {
+	err := db.Save(p).Error
+	/*if err != nil {
+
+		logger.Error("mysql",
+			zap.String("sql", "save "+p.TableName()),
+			zap.String("fields", utils.MarshalJsonString(*p)),
+			zap.String("error", err.Error()))
+	}*/
+	return err
+}
+
+func (p *Ads14) Update(db *gorm.DB) error {
+	p.CreatedAt = 0
+	timeNow := time.Now().Unix()
+	p.UpdatedAt = timeNow
+
+	err := db.Model(p).UpdateColumns(p).Error
+	/*if err != nil {
+		logger.Error("mysql",
+			zap.String("sql", "update "+p.TableName()),
+			zap.String("fields", utils.MarshalJsonString(*p)),
+			zap.String("error", err.Error()))
+	}*/
+	return err
+}
+
+func (p *Ads14) UpdateByMap(db *gorm.DB, data map[string]interface{}) error {
+	err := db.Model(p).Updates(data).Error
+	/*if err != nil {
+		logger.Error("mysql",
+			zap.String("sql", "update "+p.TableName()),
+			zap.String("fields", utils.MarshalJsonString(data)),
+			zap.String("error", err.Error()))
+	}*/
+	return err
+}
+
+// 通过结构体变量更新字段值, gorm库会忽略零值字段。就是字段值等于0, nil, "", false这些值会被忽略掉,不会更新。如果想更新零值,可以使用map类型替代结构体。
+func (p *Ads14) UpdateSome(db *gorm.DB, filed map[string]interface{}) error {
+	err := db.Model(p).Updates(filed).Error
+	/*if err != nil {
+		logger.Error("mysql",
+			zap.String("sql", "update "+p.TableName()),
+			zap.String("fields", utils.MarshalJsonString(filed)),
+			zap.String("error", err.Error()))
+	}*/
+	return err
+}
+
+func (p *Ads14) Query(db *gorm.DB, filter map[string]interface{}) error {
+	err := db.Where(filter).Find(p).Error
+	/*if err != nil {
+
+		logger.Error("mysql",
+			zap.String("sql", "select from "+p.TableName()),
+			zap.String("fields", utils.MarshalJsonString(filter)),
+			zap.String("error", err.Error()))
+	}*/
+
+	if p.ID == 0 {
+		return gorm.ErrRecordNotFound
+	}
+
+	return err
+}
+
+func (p *Ads14) QueryAll(db *gorm.DB, filter map[string]interface{}, out interface{}) error {
+	err := db.Where(filter).Find(out).Error
+	/*if err != nil {
+		logger.Error("mysql",
+			zap.String("sql", "select from "+p.TableName()),
+			zap.String("fields", utils.MarshalJsonString(filter)),
+			zap.String("error", err.Error()))
+	}*/
+	return err
+}

+ 37 - 0
model/c2_item.go

@@ -0,0 +1,37 @@
+package model
+
+import (
+	"git.getensh.com/common/gopkgsv2/database"
+	"gorm.io/gorm"
+)
+
+type C2ItemModel interface {
+	List(db *gorm.DB) ([]C2Item, error)
+}
+
+type C2Item struct {
+	ID   int64  `gorm:"column:id"   json:"id"`
+	Name string `gorm:"column:name" json:"name"`
+}
+
+type defaultC2ItemModel struct {
+	tabname string
+	fields  string
+}
+
+func NewC2ItemModel() C2ItemModel {
+	return &defaultC2ItemModel{
+		tabname: "db_adm_ads.t_adm_ads6",
+		fields:  "id, name",
+	}
+}
+
+func (d *defaultC2ItemModel) List(db *gorm.DB) ([]C2Item, error) {
+	var res []C2Item
+	err := database.List(db, &res, database.Option{
+		TableName: d.tabname,
+		Fields:    d.fields,
+	})
+
+	return res, err
+}

+ 73 - 0
model/export_style_task.go

@@ -0,0 +1,73 @@
+package model
+
+import (
+	"time"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"gorm.io/gorm"
+)
+
+type ExportStyleTaskModel interface {
+	Insert(db *gorm.DB, data interface{}) error
+	Update(db *gorm.DB, values interface{}) error
+	List(db *gorm.DB) ([]ExportStyleTask, error)
+	Delete(db *gorm.DB) error
+	Get(db *gorm.DB) (*ExportStyleTask, error)
+}
+
+type ExportStyleTask struct {
+	ID        int64     `gorm:"column:id"         json:"id"`
+	TaskName  string    `gorm:"column:task_name"  json:"task_name"`
+	Path      string    `gorm:"column:path"       json:"path"`
+	CreatedAt time.Time `gorm:"column:created_at" json:"created_at"`
+}
+
+type defaultExportStyleTaskModel struct {
+	tableName string
+	fields    string
+}
+
+func NewExportStyleTaskModel() ExportStyleTaskModel {
+	return &defaultExportStyleTaskModel{
+		tableName: "db_adm_management.t_export_style_task",
+		fields:    "id, task_name, path, created_at",
+	}
+}
+
+func (d *defaultExportStyleTaskModel) Insert(db *gorm.DB, data interface{}) error {
+	return database.Create(db, data, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defaultExportStyleTaskModel) Update(db *gorm.DB, values interface{}) error {
+	return database.Update(db, values, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defaultExportStyleTaskModel) List (db *gorm.DB) ([]ExportStyleTask, error) {
+	var res []ExportStyleTask
+	err := database.List(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields: d.fields,
+		OrderBy: "id DESC",
+	})
+
+	return res, err
+}
+
+func (d *defaultExportStyleTaskModel) Delete(db *gorm.DB) error {
+	m := ExportStyleTask{}
+	return db.Table(d.tableName).Delete(&m).Error
+}
+
+func (d *defaultExportStyleTaskModel) Get(db *gorm.DB) (*ExportStyleTask, error) {
+	var res ExportStyleTask
+	err := database.Get(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields: d.fields,
+	})
+
+	return &res, err
+}

+ 101 - 0
model/maintain_detail.go

@@ -0,0 +1,101 @@
+package model
+
+import (
+	"time"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"gorm.io/gorm"
+)
+
+type MaintainDetailModel interface {
+	MaintainDetailList(db *gorm.DB) ([]MaintainDetailItem, error)
+	List(db *gorm.DB) ([]GdMaintainDetail, error)
+	Update(db *gorm.DB, values interface{}) error
+	Insert(db *gorm.DB, data interface{}) error
+	Delete(db *gorm.DB) error
+	Get(db *gorm.DB) (*GdMaintainDetail, error)
+}
+
+type GdMaintainDetail struct {
+	ID        int64     `gorm:"column:id"         json:"id"`
+	StyleId   string    `gorm:"column:style_id"   json:"style_id"`
+	ItemId    int64     `gorm:"column:item_id"    json:"item_id"`
+	StartMile int64     `gorm:"column:start_mile" json:"start_mile"`
+	MileCycle int64     `gorm:"column:mile_cycle" json:"mile_cycle"`
+	StartDate int64     `gorm:"column:start_date" json:"start_date"`
+	DateCycle int64     `gorm:"column:date_cycle" json:"date_cycle"`
+	CreatedAt time.Time `gorm:"column:created_at" json:"created_at"`
+	UpdatedAt time.Time `gorm:"column:updated_at" json:"updated_at"`
+}
+
+type MaintainDetailItem struct {
+	ID        int64  `gorm:"column:id"         json:"id"`
+	StyleId   string `gorm:"column:style_id"   json:"style_id"`
+	StartMile int64  `gorm:"column:start_mile" json:"start_mile"`
+	MileCycle int64  `gorm:"column:mile_cycle" json:"mile_cycle"`
+	StartDate int64  `gorm:"column:start_date" json:"start_date"`
+	DateCycle int64  `gorm:"column:date_cycle" json:"date_cycle"`
+	ItemName  string `gorm:"column:item_name"  json:"item_name"`
+	ItemType  int8   `gorm:"column:item_type"  json:"item_type"`
+	ItemId    int64  `gorm:"column:item_id"    json:"item_id"`
+}
+
+type defaultGdMaintain struct {
+	tableName string
+	fields    string
+}
+
+func NewMaintainDetailModel() MaintainDetailModel {
+	return &defaultGdMaintain{
+		tableName: "db_adm_ads.t_adm_ads7",
+		fields:    "id, style_id, item_id, start_mile, mile_cycle, start_date, date_cycle, created_at, updated_at",
+	}
+}
+
+func (d *defaultGdMaintain) MaintainDetailList(db *gorm.DB) ([]MaintainDetailItem, error) {
+	var res []MaintainDetailItem
+	err := database.List(db, &res, database.Option{
+		TableName: d.tableName + " AS t1",
+		Fields:    "t1.id, style_id, t1.start_mile, mile_cycle, start_date, date_cycle, t2.item_name, t2.item_type, t1.item_id",
+		Joins:     []string{"LEFT JOIN db_adm_ads.t_adm_ads12 AS t2 ON t1.item_id = t2.item_id"},
+	})
+
+	return res, err
+}
+
+func (d *defaultGdMaintain) List(db *gorm.DB) ([]GdMaintainDetail, error) {
+	var res []GdMaintainDetail
+	err := database.List(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    d.fields,
+	})
+
+	return res, err
+}
+
+func (d *defaultGdMaintain) Update(db *gorm.DB, values interface{}) error {
+	return database.Update(db, values, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defaultGdMaintain) Insert(db *gorm.DB, data interface{}) error {
+	return database.Create(db, data, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defaultGdMaintain) Delete(db *gorm.DB) error {
+	m := GdMaintainDetail{}
+	return db.Table(d.tableName).Delete(&m).Error
+}
+
+func (d *defaultGdMaintain) Get(db *gorm.DB) (*GdMaintainDetail, error) {
+	var res GdMaintainDetail
+	err := database.Get(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    d.fields,
+	})
+
+	return &res, err
+}

+ 96 - 0
model/maintain_detail_template.go

@@ -0,0 +1,96 @@
+package model
+
+import (
+	"time"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"gorm.io/gorm"
+)
+
+type MaintainDetailTemplateModel interface {
+	Insert(db *gorm.DB, data interface{}) error
+	List(db *gorm.DB) ([]MaintenanceDetailTemplate, error)
+	ListByItem(db *gorm.DB) ([]MaintenanceDetailTemplateItem, error)
+	Get(db *gorm.DB) (*MaintenanceDetailTemplate, error)
+	Update(db *gorm.DB, values interface{}) error
+}
+
+type MaintenanceDetailTemplate struct {
+	ID        int64     `gorm:"column:id" json:"id"`
+	Tid       int64     `gorm:"column:tid" json:"tid"`
+	ItemId    int64     `gorm:"column:item_id" json:"item_id"`
+	StartMile int64     `gorm:"column:start_mile" json:"start_mile"`
+	MileCycle int64     `gorm:"column:mile_cycle" json:"mile_cycle"`
+	StartDate int64     `gorm:"column:start_date" json:"start_date"`
+	DateCycle int64     `gorm:"column:date_cycle" json:"date_cycle"`
+	CreatedAt time.Time `gorm:"column:created_at" json:"created_at"`
+	UpdatedAt time.Time `gorm:"column:updated_at" json:"updated_at"`
+}
+
+type MaintenanceDetailTemplateItem struct {
+	ID        int64  `gorm:"column:id"         json:"id"`
+	StyleId   string `gorm:"column:style_id"   json:"style_id"`
+	StartMile int64  `gorm:"column:start_mile" json:"start_mile"`
+	MileCycle int64  `gorm:"column:mile_cycle" json:"mile_cycle"`
+	StartDate int64  `gorm:"column:start_date" json:"start_date"`
+	DateCycle int64  `gorm:"column:date_cycle" json:"date_cycle"`
+	ItemName  string `gorm:"column:item_name"  json:"item_name"`
+	ItemType  int8   `gorm:"column:item_type"  json:"item_type"`
+	ItemId    int64  `gorm:"column:item_id"    json:"item_id"`
+}
+
+type defaultMaintainDetailTemplateModel struct {
+	tableName string
+	fields    string
+}
+
+func NewMaintainDetailTemplateModel() MaintainDetailTemplateModel {
+	return &defaultMaintainDetailTemplateModel{
+		"db_adm_management.t_adm_maintenance_detail_template",
+		"id, tid, item_id, start_mile, mile_cycle, start_date, date_cycle, created_at, updated_at",
+	}
+}
+
+func (d *defaultMaintainDetailTemplateModel) Insert(db *gorm.DB, data interface{}) error {
+	return database.Create(db, data, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defaultMaintainDetailTemplateModel) List(db *gorm.DB) ([]MaintenanceDetailTemplate, error) {
+	var res []MaintenanceDetailTemplate
+	err := database.List(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    d.fields,
+	})
+
+	return res, err
+}
+
+func (d *defaultMaintainDetailTemplateModel) ListByItem(db *gorm.DB) ([]MaintenanceDetailTemplateItem, error) {
+	var res []MaintenanceDetailTemplateItem
+	err := database.List(db, &res, database.Option{
+		TableName: d.tableName + " AS t1",
+		Fields:    "t1.id, t1.start_mile, mile_cycle, start_date, date_cycle, t2.item_name, t2.item_type, t1.item_id",
+		Joins:     []string{"LEFT JOIN db_adm_ads.t_adm_ads12 AS t2 ON t1.item_id = t2.item_id"},
+		OrderBy:   "t1.item_id",
+	})
+
+	return res, err
+}
+
+func (d *defaultMaintainDetailTemplateModel) Get(db *gorm.DB) (*MaintenanceDetailTemplate, error) {
+	var res MaintenanceDetailTemplate
+	err := database.Get(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    d.fields,
+	})
+
+	return &res, err
+}
+
+func (d *defaultMaintainDetailTemplateModel) Update(db *gorm.DB, values interface{}) error {
+	return database.Update(db, values, database.Option{
+		TableName: d.tableName,
+	})
+}

+ 53 - 0
model/maintain_item.go

@@ -0,0 +1,53 @@
+package model
+
+import (
+	"git.getensh.com/common/gopkgsv2/database"
+	"gorm.io/gorm"
+)
+
+type MaintainItemModel interface {
+	Get(db *gorm.DB) (*GdMaintainItem, error)
+	List(db *gorm.DB, fields string) ([]GdMaintainItem, error)
+}
+
+type GdMaintainItem struct {
+	ID int64 `gorm:"column:id" json:"id"`
+	ItemId int64 `gorm:"column:item_id" json:"item_id"`
+	ItemName string `gorm:"column:item_name" json:"item_name"`
+	ItemType int64 `gorm:"column:item_type" json:"item_type"`
+}
+
+type defaultMaintainItem struct {
+	tableName string
+	fields string
+}
+
+func NewMaintainItemModel() MaintainItemModel {
+	return &defaultMaintainItem{
+		tableName: "db_adm_ads.t_adm_ads12",
+		fields: "id, item_id, item_name, item_type",
+	}
+}
+
+func (d *defaultMaintainItem) Get (db *gorm.DB) (*GdMaintainItem, error) {
+	var res GdMaintainItem
+	err := database.Get(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields: d.fields,
+	})
+
+	return &res, err
+}
+
+func (d *defaultMaintainItem) List (db *gorm.DB, fields string) ([]GdMaintainItem, error) {
+	if fields == "" {
+		fields = d.fields
+	}
+	var res []GdMaintainItem
+	err := database.List(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields: fields,
+	})
+
+	return res, err
+}

+ 62 - 0
model/maintain_template.go

@@ -0,0 +1,62 @@
+package model
+
+import (
+	"git.getensh.com/common/gopkgsv2/database"
+	"gorm.io/gorm"
+)
+
+type MaintenanceTemplateModel interface {
+	Insert(db *gorm.DB, data interface{}) error
+	List(db *gorm.DB) ([]MaintenanceTemplate, error)
+	Get(db *gorm.DB) (*MaintenanceTemplate, error)
+	Update(db *gorm.DB, values interface{}) error
+}
+
+type MaintenanceTemplate struct {
+	ID   int64  `gorm:"column:id" json:"id"`
+	Name string `gorm:"column:name" json:"name"`
+}
+
+type defaultMaintenanceTemplateModel struct {
+	tableName string
+	fields    string
+}
+
+func NewMaintenanceTemplateModel() MaintenanceTemplateModel {
+	return &defaultMaintenanceTemplateModel{
+		"db_adm_management.t_adm_maintenance_template",
+		"id, name",
+	}
+}
+
+func (d *defaultMaintenanceTemplateModel) Insert(db *gorm.DB, data interface{}) error {
+	return database.Create(db, data, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defaultMaintenanceTemplateModel) List(db *gorm.DB) ([]MaintenanceTemplate, error) {
+	var res []MaintenanceTemplate
+	err := database.List(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    d.fields,
+	})
+
+	return res, err
+}
+
+func (d *defaultMaintenanceTemplateModel) Get(db *gorm.DB) (*MaintenanceTemplate, error) {
+	var res MaintenanceTemplate
+	err := database.Get(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    d.fields,
+	})
+
+	return &res, err
+}
+
+func (d *defaultMaintenanceTemplateModel) Update(db *gorm.DB, values interface{}) error {
+	return database.Update(db, values, database.Option{
+		TableName: d.tableName,
+	})
+}

+ 67 - 0
model/maintain_title.go

@@ -0,0 +1,67 @@
+package model
+
+import (
+	"time"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"gorm.io/gorm"
+)
+
+type MaintainTitleModel interface {
+	Get(db *gorm.DB) (*GdMaintainTitle, error)
+	Insert(db *gorm.DB, data interface{}) error
+	Update(db *gorm.DB, values interface{}) error
+	Delete(db *gorm.DB) error
+}
+
+type GdMaintainTitle struct {
+	ID                   int64     `gorm:"column:id" json:"id"`
+	StyleId              string    `gorm:"column:style_id" json:"style_id"`
+	StartMile            int64     `gorm:"column:start_mile" json:"start_mile"`
+	StartDate            int64     `gorm:"column:start_date" json:"start_date"`
+	MaintainMileMinCycle int64     `gorm:"column:maintain_mile_min_cycle" json:"maintain_mile_min_cycle"`
+	MaintainDateMinCycle int64     `gorm:"column:maintain_date_min_cycle" json:"maintain_date_min_cycle"`
+	WashCycle            int64     `gorm:"column:wash_cycle" json:"wash_cycle"`
+	RepairCycle          int64     `gorm:"column:repair_cycle" json:"repair_cycle"`
+	CreatedAt            time.Time `gorm:"column:created_at" json:"created_at"`
+	UpdatedAt            time.Time `gorm:"column:updated_at" json:"updated_at"`
+}
+
+type defalutMaintainTitleModel struct {
+	tableName string
+	fileds    string
+}
+
+func NewMaintainTitleModel() MaintainTitleModel {
+	return &defalutMaintainTitleModel{
+		tableName: "db_adm_ads.t_adm_ads13",
+		fileds:    "id, style_id, start_mile, start_date, maintain_mile_min_cycle, maintain_date_min_cycle, wash_cycle, repair_cycle, created_at, updated_at",
+	}
+}
+
+func (d *defalutMaintainTitleModel) Get(db *gorm.DB) (*GdMaintainTitle, error) {
+	var res GdMaintainTitle
+	err := database.Get(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    d.fileds,
+	})
+
+	return &res, err
+}
+
+func (d *defalutMaintainTitleModel) Insert(db *gorm.DB, data interface{}) error {
+	return database.Create(db, data, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defalutMaintainTitleModel) Update(db *gorm.DB, values interface{}) error {
+	return database.Update(db, values, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defalutMaintainTitleModel) Delete(db *gorm.DB) error {
+	m := GdMaintainTitle{}
+	return db.Table(d.tableName).Delete(&m).Error
+}

+ 81 - 0
model/maintain_title_template.go

@@ -0,0 +1,81 @@
+package model
+
+import (
+	"time"
+
+	"git.getensh.com/common/gopkgsv2/database"
+	"gorm.io/gorm"
+)
+
+type MaintenanceTitleTemplateModel interface {
+	Insert(db *gorm.DB, data interface{}) error
+	Count(db *gorm.DB) (int64, error)
+	List(db *gorm.DB, pagination *Pagination) ([]MaintenanceTitleTemplate, error)
+	Get(db *gorm.DB) (*MaintenanceTitleTemplate, error)
+	Update(db *gorm.DB, values interface{}) error
+}
+
+type MaintenanceTitleTemplate struct {
+	ID                   int64     `gorm:"column:id" json:"id"`
+	Tid                  int64     `gorm:"column:tid" json:"tid"`
+	StartMile            int64     `gorm:"column:start_mile" json:"start_mile"`
+	StartDate            int64     `gorm:"column:start_date" json:"start_date"`
+	MaintainMileMinCycle int64     `gorm:"column:maintain_mile_min_cycle" json:"maintain_mile_min_cycle"`
+	MaintainDateMinCycle int64     `gorm:"column:maintain_date_min_cycle" json:"maintain_date_min_cycle"`
+	WashCycle            int64     `gorm:"column:wash_cycle" json:"wash_cycle"`
+	RepairCycle          int64     `gorm:"column:repair_cycle" json:"repair_cycle"`
+	CreatedAt            time.Time `gorm:"column:created_at" json:"created_at"`
+	UpdatedAt            time.Time `gorm:"column:updated_at" json:"updated_at"`
+}
+
+type defaultMaintenanceTitleTemplateModel struct {
+	tableName string
+	fields    string
+}
+
+func NewMaintenanceTitleTemplateModel() MaintenanceTitleTemplateModel {
+	return &defaultMaintenanceTitleTemplateModel{
+		"db_adm_management.t_adm_maintenance_title_template",
+		"id, tid, start_mile, start_date, maintain_mile_min_cycle, maintain_date_min_cycle, wash_cycle, repair_cycle, created_at, updated_at",
+	}
+}
+
+func (d *defaultMaintenanceTitleTemplateModel) Insert(db *gorm.DB, data interface{}) error {
+	return database.Create(db, data, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defaultMaintenanceTitleTemplateModel) Count(db *gorm.DB) (int64, error) {
+	return database.Count(db, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defaultMaintenanceTitleTemplateModel) List(db *gorm.DB, pagination *Pagination) ([]MaintenanceTitleTemplate, error) {
+	var res []MaintenanceTitleTemplate
+	err := database.List(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    d.fields,
+		Limit:     pagination.Limit,
+		OffSet:    pagination.Offset,
+	})
+
+	return res, err
+}
+
+func (d *defaultMaintenanceTitleTemplateModel) Get(db *gorm.DB) (*MaintenanceTitleTemplate, error) {
+	var res MaintenanceTitleTemplate
+	err := database.Get(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    d.fields,
+	})
+
+	return &res, err
+}
+
+func (d *defaultMaintenanceTitleTemplateModel) Update(db *gorm.DB, values interface{}) error {
+	return database.Update(db, values, database.Option{
+		TableName: d.tableName,
+	})
+}

+ 120 - 0
model/pagination.go

@@ -0,0 +1,120 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package model
+
+import (
+	"strings"
+	"time"
+)
+
+// 游标分页
+type CursorPagination struct {
+	Top         string
+	TopNum      string
+	TopExtra    string
+	Bottom      string
+	BottomNum   string
+	BottomExtra string
+}
+
+func NewCursorPagination() *CursorPagination {
+	return &CursorPagination{}
+}
+
+// 分割分页的top/bottom
+func (c *CursorPagination) SplitTopBottomData(topParam, bottomParam string) {
+	if topParam == "" {
+		c.Top = "0"
+		c.TopNum = "0"
+		c.TopExtra = "0"
+	} else {
+		top := strings.Split(topParam, ",")
+		c.Top = top[0]
+		c.TopNum = top[1]
+		c.TopExtra = top[2]
+	}
+
+	if bottomParam == "" {
+		c.Bottom = "0"
+		c.BottomNum = "0"
+		c.BottomExtra = "0"
+	} else {
+		bottom := strings.Split(bottomParam, ",")
+		c.Bottom = bottom[0]
+		c.BottomNum = bottom[1]
+		c.BottomExtra = bottom[2]
+	}
+}
+
+// 传统分页
+type Pagination struct {
+	CurrentPage int   `json:"current_page"` // 当前页
+	PerPage     int   `json:"per_page"`     // 每一页多少条
+	Total       int   `json:"total"`        // 总条数
+	FirstPage   int   `json:"first_page"`   // 第一页
+	LastPage    int   `json:"last_page"`    // 最后页
+	PrevPage    int   `json:"prev_page"`    // 上一页
+	NextPage    int   `json:"next_page"`    // 下一页
+	Limit       int   `json:"limit"`
+	Offset      int   `json:"offset"`
+	RequestTime int64 `json:"request_time"`
+}
+
+func NewPagination(currentPage, perPage int, requestTime int64) *Pagination {
+	if currentPage == 0 {
+		currentPage = 1
+	}
+	if requestTime == 0 {
+		requestTime = time.Now().Unix()
+	}
+	return &Pagination{
+		CurrentPage: currentPage,
+		PerPage:     perPage,
+		PrevPage:    -1,
+		NextPage:    -1,
+		RequestTime: requestTime,
+	}
+}
+
+// 根据当前页获取分页条数和偏移量
+func (p *Pagination) GetLimitOffset() *Pagination {
+	var num int
+
+	if p.CurrentPage < 1 {
+		num = 0
+	} else {
+		num = p.CurrentPage - 1
+	}
+
+	p.Limit = p.PerPage
+	p.Offset = num * p.PerPage
+
+	return p
+}
+
+// 计算上、下、首、末页
+func (p *Pagination) CalPage(total int) {
+	p.Total = total
+
+	// 第一页
+	if total != 0 {
+		p.FirstPage = 1
+	}
+
+	// 最后页
+	p.LastPage = total / p.PerPage
+	if total%p.PerPage != 0 {
+		p.LastPage += 1
+	}
+
+	// 上一页
+	if p.CurrentPage > 1 {
+		p.PrevPage = p.CurrentPage - 1
+	}
+
+	// 下一页
+	if total > p.PerPage*p.CurrentPage {
+		p.NextPage = p.CurrentPage + 1
+	}
+}

+ 74 - 0
model/style_item.go

@@ -0,0 +1,74 @@
+package model
+
+import (
+	"git.getensh.com/common/gopkgsv2/database"
+	"gorm.io/gorm"
+)
+
+type StyleItemModel interface {
+	List(db *gorm.DB) ([]StyleItem, error)
+	Update(db *gorm.DB, values interface{}) error
+	Insert(db *gorm.DB, datab []GdStyleItem) error
+	Delete(db *gorm.DB) error
+}
+
+type GdStyleItem struct {
+	ID            int64     `gorm:"column:id"             json:"id"`
+	StyleId       string    `gorm:"column:style_id"       json:"style_id"`
+	C2Id          int64     `gorm:"column:c2_id"          json:"c2_id"`
+	AttributeRule string    `gorm:"column:attribute_rule" json:"attribute_rule"`
+	Useage        string    `gorm:"column:useage"         json:"useage"`
+	Detail        string    `gorm:"column:detail"         json:"detail"`
+	CreatedAt     int64 `gorm:"column:created_at"     json:"created_at"`
+	UpdatedAt     int64 `gorm:"column:updated_at"     json:"updated_at"`
+}
+
+type StyleItem struct {
+	ID            int64  `gorm:"column:id"             json:"id"`
+	StyleId       string `gorm:"column:style_id"       json:"style_id"`
+	C2Id          int64  `gorm:"column:c2_id"          json:"c2_id"`
+	C2Name        string `gorm:"column:c2_name"        json:"c2_name"`
+	AttributeRule string `gorm:"column:attribute_rule" json:"attribute_rule"`
+	Useage        string `gorm:"column:useage"         json:"useage"`
+	Detail        string `gorm:"column:detail"         json:"detail"`
+}
+
+type defaultStyleItemModel struct {
+	tableName string
+	fields    string
+}
+
+func NewStyleItemModel() StyleItemModel {
+	return &defaultStyleItemModel{
+		tableName: "db_adm_ads.t_adm_ads14",
+		fields:    "id, style_id, c2_id, attribute_rule, useage, detail, created_at, updated_at",
+	}
+}
+
+func (d *defaultStyleItemModel) List(db *gorm.DB) ([]StyleItem, error) {
+	var res []StyleItem
+	err := database.List(db, &res, database.Option{
+		TableName: d.tableName + " AS t1",
+		Fields:    "t1.id, style_id, c2_id, useage, attribute_rule, detail, t2.name AS c2_name",
+		Joins:     []string{"LEFT JOIN db_adm_ads.t_adm_ads6 AS t2 ON t1.c2_id = t2.id"},
+	})
+
+	return res, err
+}
+
+func (d *defaultStyleItemModel) Update(db *gorm.DB, values interface{}) error {
+	return database.Update(db, values, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defaultStyleItemModel) Insert(db *gorm.DB, data []GdStyleItem) error {
+	return database.Create(db, data, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defaultStyleItemModel) Delete(db *gorm.DB) error {
+	m := GdStyleItem{}
+	return db.Table(d.tableName).Delete(&m).Error
+}

+ 71 - 0
model/sy_brand.go

@@ -0,0 +1,71 @@
+package model
+
+import (
+	"git.getensh.com/common/gopkgsv2/database"
+	"gorm.io/gorm"
+)
+
+type SyBrandModel interface {
+	Get(db *gorm.DB) (*GdSyBrand, error)
+	List(db *gorm.DB, pagination *Pagination) ([]GdSyBrand, error)
+	Count(db *gorm.DB) (int64, error)
+	Update(db *gorm.DB, values interface{}) error
+}
+
+type GdSyBrand struct {
+	ID         int64  `gorm:"column:id"          json:"id"          form:"id"`
+	Initial    string `gorm:"column:initial"     json:"initial"     form:"initial"`
+	BrandName  string `gorm:"column:brand_name"  json:"brand_name"  form:"brand_name"`
+	BrandId    string `gorm:"column:brand_id"    json:"brand_id"    form:"brand_id"`
+	Weight     int64  `gorm:"column:weight"      json:"weight"      form:"weight"`
+	HasImg     int64  `gorm:"column:has_img"     json:"has_img"     form:"has_img"`
+	Status     int64  `gorm:"column:status"      json:"status"      form:"status"`
+	OldBrandName string `gorm:"old_brand_name" json:"old_brand_name" form:"old_brand_name"`
+	UpdateTime string `gorm:"column:update_time" json:"update_time" form:"update_time"`
+}
+
+type defaultSyBrand struct {
+	tableName string
+	fields    string
+}
+
+func NewSyBrand() SyBrandModel {
+	return &defaultSyBrand{
+		tableName: "db_adm_ads.t_adm_ads2",
+		fields:    "id, initial, brand_name, brand_id, weight, has_img, status,old_brand_name, update_time",
+	}
+}
+
+func(d *defaultSyBrand) Get(db *gorm.DB) (*GdSyBrand, error) {
+	var res GdSyBrand
+	err := database.Get(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields: d.fields,
+	})
+
+	return &res, err
+}
+
+func (d *defaultSyBrand) List(db *gorm.DB, pagination *Pagination) ([]GdSyBrand, error) {
+	var res []GdSyBrand
+	err := database.List(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    d.fields,
+		Limit:     pagination.Limit,
+		OffSet:    pagination.Offset,
+	})
+
+	return res, err
+}
+
+func (d *defaultSyBrand) Count(db *gorm.DB) (int64, error) {
+	return database.Count(db, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defaultSyBrand) Update(db *gorm.DB, values interface{}) error {
+	return database.Update(db, values, database.Option{
+		TableName: d.tableName,
+	})
+}

+ 127 - 0
model/sy_series.go

@@ -0,0 +1,127 @@
+package model
+
+import (
+	"git.getensh.com/common/gopkgsv2/database"
+	"gorm.io/gorm"
+)
+
+type SySeriesModel interface {
+	MakerList(db *gorm.DB) ([]Maker, error)
+	Update(db *gorm.DB, values interface{}) error
+	Count(db *gorm.DB, join bool) (int64, error)
+	List(db *gorm.DB, pagination *Pagination, join bool) ([]SeriesAndBrandName, error)
+	Get(db *gorm.DB) (*GdSySeries, error)
+	SeriesList(db *gorm.DB) ([]GdSySeries, error)
+}
+
+type GdSySeries struct {
+	ID           int64  `gorm:"column:id"            json:"id"            form:"id"`
+	SeriesId     string `gorm:"column:series_id"     json:"series_id"     form:"series_id"`
+	BrandId      string `gorm:"column:brand_id"      json:"brand_id"      form:"brand_id"`
+	SeriesName   string `gorm:"column:series_name"   json:"series_name"   form:"series_name"`
+	Maker        string `gorm:"column:maker"         json:"maker"         form:"maker"`
+	MakerId      string `gorm:"column:maker_id"      json:"maker_id"      form:"maker_id"`
+	LowestPrice  string `gorm:"column:lowest_price"  json:"lowest_price"  form:"lowest_price"`
+	HighestPrice string `gorm:"column:highest_price" json:"highest_price" form:"highest_price"`
+	HasImg       int64  `gorm:"column:has_img"       json:"has_img"       form:"has_img"`
+	UpdateTime   string `gorm:"column:update_time"   json:"update_time"   form:"update_time"`
+	Status       int64  `gorm:"column:status"        json:"status"`
+}
+
+type SeriesAndBrandName struct {
+	ID         int64  `gorm:"column:id"          json:"id"          form:"id"`
+	SeriesId   string `gorm:"column:series_id"   json:"series_id"   form:"series_id"`
+	SeriesName string `gorm:"column:series_name" json:"series_name" form:"series_name"`
+	BrandId    string `gorm:"column:brand_id"    json:"brand_id"    form:"brand_id"`
+	BrandName  string `gorm:"column:brand_name"  json:"brand_name"  form:"brand_name"`
+	Maker      string `gorm:"column:maker"       json:"maker"       form:"maker"`
+	HasImg     int64  `gorm:"column:has_img"     json:"has_img"     form:"has_img"`
+	Status     int64  `gorm:"column:status"      json:"status"`
+	OldSeriesName string `gorm:"column:old_series_name" json:"old_series_name" form:"old_series_name"`
+}
+
+type Maker struct {
+	BrandId string `gorm:"column:brand_id" json:"brand_id" form:"brand_id"`
+	Maker   string `gorm:"column:maker"    json:"maker"    form:"maker"`
+	MakerId string `gorm:"column:maker_id" json:"maker_id" form:"maker_id"`
+}
+
+type defalutSySerieModel struct {
+	tableName string
+	fields    string
+}
+
+func NewSySerieModel() SySeriesModel {
+	return &defalutSySerieModel{
+		tableName: "db_adm_ads.t_adm_ads4",
+		fields:    "id, series_id,series_name, brand_id, maker, maker_id, lowest_price, highest_price, has_img,old_series_name, update_time",
+	}
+}
+
+func (d *defalutSySerieModel) MakerList(db *gorm.DB) ([]Maker, error) {
+	var res []Maker
+	err := database.List(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    "brand_id, maker, maker_id",
+		Group:     "maker",
+	})
+	return res, err
+}
+
+func (d *defalutSySerieModel) Update(db *gorm.DB, values interface{}) error {
+	return database.Update(db, values, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defalutSySerieModel) List(db *gorm.DB, pagination *Pagination, join bool) ([]SeriesAndBrandName, error) {
+	var res []SeriesAndBrandName
+
+	option := database.Option{
+		TableName: d.tableName + " AS t1",
+		Joins:     []string{"LEFT JOIN db_adm_ads.t_adm_ads2 AS t2 ON t1.brand_id = t2.brand_id"},
+		Fields:    "t1.id, t1.series_id, t1.series_name, t1.maker, t1.status, t1.has_img,t1.old_series_name, t2.brand_name, t1.brand_id",
+		Limit:     pagination.Limit,
+		OffSet:    pagination.Offset,
+	}
+
+	if join {
+		option.Joins = []string{}
+	}
+
+	err := database.List(db, &res, option)
+
+	return res, err
+}
+
+func (d *defalutSySerieModel) Count(db *gorm.DB, join bool) (int64, error) {
+	option := database.Option{
+		TableName: d.tableName + " AS t1",
+	}
+
+	if join {
+		option.Joins = []string{"LEFT JOIN db_adm_ads.t_adm_ads2 AS t2 ON t1.brand_id = t2.brand_id"}
+	}
+
+	return database.Count(db, option)
+}
+
+func (d *defalutSySerieModel) Get(db *gorm.DB) (*GdSySeries, error) {
+	var res GdSySeries
+	err := database.Get(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    d.fields,
+	})
+
+	return &res, err
+}
+
+func (d *defalutSySerieModel) SeriesList(db *gorm.DB) ([]GdSySeries, error) {
+	var res []GdSySeries
+	err := database.List(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    d.fields,
+	})
+
+	return res, err
+}

+ 380 - 0
model/sy_style.go

@@ -0,0 +1,380 @@
+package model
+
+import (
+	"git.getensh.com/common/gopkgsv2/database"
+	"gorm.io/gorm"
+)
+
+type SyStyleModel interface {
+	Update(db *gorm.DB, values interface{}) error
+	List(db *gorm.DB, pagination *Pagination, join bool) ([]StyleList, error)
+	Count(db *gorm.DB, join bool) (int64, error)
+	Get(db *gorm.DB) (*GdSyStyle, error)
+	StyleList(db *gorm.DB, fields string) ([]GdSyStyle, error)
+}
+
+type GdSyStyle struct {
+	ID                                  int64  `gorm:"column:id"                                     json:"id"                                     form:"id"`
+	Initial                             string `gorm:"column:initial"                                json:"initial"                                form:"initial"`
+	BrandId                             string `gorm:"column:brand_id"                               json:"brand_id"                               form:"brand_id"`
+	BrandName                           string `gorm:"column:brand_name"                             json:"brand_name"                             form:"brand_name"`
+	SeriesId                            string `gorm:"column:series_id"                              json:"series_id"                              form:"series_id"`
+	SeriesName                          string `gorm:"column:series_name"                            json:"series_name"                            form:"series_name"`
+	StyleId                             string `gorm:"column:style_id"                               json:"style_id"                               form:"style_id"`
+	StyleName                           string `gorm:"column:style_name"                             json:"style_name"                             form:"style_name"`
+	Level                               string `gorm:"column:level"                                  json:"level"                                  form:"level"`
+	Maker                               string `gorm:"column:maker"                                  json:"maker"                                  form:"maker"`
+	MakerId                             string `gorm:"column:maker_id"                               json:"maker_id"                               form:"maker_id"`
+	OnSale                              string `gorm:"column:on_sale"                                json:"on_sale"                                form:"on_sale"`
+	ModelYear                           string `gorm:"column:model_year"                             json:"model_year"                             form:"model_year"`
+	MarketTime                          string `gorm:"column:market_time"                            json:"market_time"                            form:"market_time"`
+	PriceYuan                           string `gorm:"column:price_yuan"                             json:"price_yuan"                             form:"price_yuan"`
+	Price                               string `gorm:"column:price"                                  json:"price"                                  form:"price"`
+	SubLevel                            string `gorm:"column:sub_level"                              json:"sub_level"                              form:"sub_level"`
+	FuelTypeDetail1                     string `gorm:"column:fuel_type_detail1"                      json:"fuel_type_detail1"                      form:"fuel_type_detail1"`
+	EmissionStandard                    string `gorm:"column:emission_standard"                      json:"emission_standard"                      form:"emission_standard"`
+	FastChargingTime                    string `gorm:"column:fast_charging_time"                     json:"fast_charging_time"                     form:"fast_charging_time"`
+	SlowChargingTime                    string `gorm:"column:slow_charging_time"                     json:"slow_charging_time"                     form:"slow_charging_time"`
+	FastChargeAmount                    string `gorm:"column:fast_charge_amount"                     json:"fast_charge_amount"                     form:"fast_charge_amount"`
+	MaximumPower                        string `gorm:"column:maximum_power"                          json:"maximum_power"                          form:"maximum_power"`
+	MaximumTorque                       string `gorm:"column:maximum_torque"                         json:"maximum_torque"                         form:"maximum_torque"`
+	Engine                              string `gorm:"column:engine"                                 json:"engine"                                 form:"engine"`
+	Alternator                          string `gorm:"column:alternator"                             json:"alternator"                             form:"alternator"`
+	GearboxDesc                         string `gorm:"column:gearbox_desc"                           json:"gearbox_desc"                           form:"gearbox_desc"`
+	Lwh                                 string `gorm:"column:lwh"                                    json:"lwh"                                    form:"lwh"`
+	VehicleStructure                    string `gorm:"column:vehicle_structure"                      json:"vehicle_structure"                      form:"vehicle_structure"`
+	MaximumSpeed                        string `gorm:"column:maximum_speed"                          json:"maximum_speed"                          form:"maximum_speed"`
+	HundredAccelerate                   string `gorm:"column:hundred_accelerate"                     json:"hundred_accelerate"                     form:"hundred_accelerate"`
+	HundredAccelerateMeasure            string `gorm:"column:hundred_accelerate_measure"             json:"hundred_accelerate_measure"             form:"hundred_accelerate_measure"`
+	BrakingDistanceMeasure              string `gorm:"column:braking_distance_measure"               json:"braking_distance_measure"               form:"braking_distance_measure"`
+	MaximumSimulationMilageMeasure      string `gorm:"column:maximum_simulation_milage_measure"      json:"maximum_simulation_milage_measure"      form:"maximum_simulation_milage_measure"`
+	OilWearComrehensive                 string `gorm:"column:oil_wear_comrehensive"                  json:"oil_wear_comrehensive"                  form:"oil_wear_comrehensive"`
+	OilWearMeasure                      string `gorm:"column:oil_wear_measure"                       json:"oil_wear_measure"                       form:"oil_wear_measure"`
+	VehicleWarranty                     string `gorm:"column:vehicle_warranty"                       json:"vehicle_warranty"                       form:"vehicle_warranty"`
+	Long                                string `gorm:"column:long"                                   json:"long"                                   form:"long"`
+	Wide                                string `gorm:"column:wide"                                   json:"wide"                                   form:"wide"`
+	High                                string `gorm:"column:high"                                   json:"high"                                   form:"high"`
+	Wheelbase                           string `gorm:"column:wheelbase"                              json:"wheelbase"                              form:"wheelbase"`
+	FrontWheelDistance                  string `gorm:"column:front_wheel_distance"                   json:"front_wheel_distance"                   form:"front_wheel_distance"`
+	BackWheelDistance                   string `gorm:"column:back_wheel_distance"                    json:"back_wheel_distance"                    form:"back_wheel_distance"`
+	MinimumGroundClearance              string `gorm:"column:minimum_ground_clearance"               json:"minimum_ground_clearance"               form:"minimum_ground_clearance"`
+	DoorNumber                          string `gorm:"column:door_number"                            json:"door_number"                            form:"door_number"`
+	SeatNumber                          string `gorm:"column:seat_number"                            json:"seat_number"                            form:"seat_number"`
+	OilboxVolume                        string `gorm:"column:oilbox_volume"                          json:"oilbox_volume"                          form:"oilbox_volume"`
+	TrunkVolume                         string `gorm:"column:trunk_volume"                           json:"trunk_volume"                           form:"trunk_volume"`
+	UnladenMass                         string `gorm:"column:unladen_mass"                           json:"unladen_mass"                           form:"unladen_mass"`
+	EngineType                          string `gorm:"column:engine_type"                            json:"engine_type"                            form:"engine_type"`
+	Displacement                        string `gorm:"column:displacement"                           json:"displacement"                           form:"displacement"`
+	DisplacementL                       string `gorm:"column:displacement_l"                         json:"displacement_l"                         form:"displacement_l"`
+	AirIntakForm                        string `gorm:"column:air_intak_form"                         json:"air_intak_form"                         form:"air_intak_form"`
+	AirIntakFormDetail                  string `gorm:"column:air_intak_form_detail"                  json:"air_intak_form_detail"                  form:"air_intak_form_detail"`
+	CylinderArrangement                 string `gorm:"column:cylinder_arrangement"                   json:"cylinder_arrangement"                   form:"cylinder_arrangement"`
+	CylinderNumber                      string `gorm:"column:cylinder_number"                        json:"cylinder_number"                        form:"cylinder_number"`
+	CylinderValveNumber                 string `gorm:"column:cylinder_valve_number"                  json:"cylinder_valve_number"                  form:"cylinder_valve_number"`
+	ReductionRatio                      string `gorm:"column:reduction_ratio"                        json:"reduction_ratio"                        form:"reduction_ratio"`
+	ValveMechanism                      string `gorm:"column:valve_mechanism"                        json:"valve_mechanism"                        form:"valve_mechanism"`
+	CylinderDiameter                    string `gorm:"column:cylinder_diameter"                      json:"cylinder_diameter"                      form:"cylinder_diameter"`
+	PistonStroke                        string `gorm:"column:piston_stroke"                          json:"piston_stroke"                          form:"piston_stroke"`
+	MaximumHorsepower                   string `gorm:"column:maximum_horsepower"                     json:"maximum_horsepower"                     form:"maximum_horsepower"`
+	MaximumPowerRpm                     string `gorm:"column:maximum_power_rpm"                      json:"maximum_power_rpm"                      form:"maximum_power_rpm"`
+	Rpm                                 string `gorm:"column:rpm"                                    json:"rpm"                                    form:"rpm"`
+	EngineTechnology                    string `gorm:"column:engine_technology"                      json:"engine_technology"                      form:"engine_technology"`
+	FuelTypeDetail                      string `gorm:"column:fuel_type_detail"                       json:"fuel_type_detail"                       form:"fuel_type_detail"`
+	FuelLable                           string `gorm:"column:fuel_lable"                             json:"fuel_lable"                             form:"fuel_lable"`
+	OilSupplyMode                       string `gorm:"column:oil_supply_mode"                        json:"oil_supply_mode"                        form:"oil_supply_mode"`
+	CylinderHeadMaterial                string `gorm:"column:cylinder_head_material"                 json:"cylinder_head_material"                 form:"cylinder_head_material"`
+	CylinderMaterial                    string `gorm:"column:cylinder_material"                      json:"cylinder_material"                      form:"cylinder_material"`
+	MotorType                           string `gorm:"column:motor_type"                             json:"motor_type"                             form:"motor_type"`
+	TotalMotorPower                     string `gorm:"column:total_motor_power"                      json:"total_motor_power"                      form:"total_motor_power"`
+	TotalMotorTorque                    string `gorm:"column:total_motor_torque"                     json:"total_motor_torque"                     form:"total_motor_torque"`
+	FrontElectricMaximumPower           string `gorm:"column:front_electric_maximum_power"           json:"front_electric_maximum_power"           form:"front_electric_maximum_power"`
+	FrontElectricTorque                 string `gorm:"column:front_electric_torque"                  json:"front_electric_torque"                  form:"front_electric_torque"`
+	BackElectricMaximumPower            string `gorm:"column:back_electric_maximum_power"            json:"back_electric_maximum_power"            form:"back_electric_maximum_power"`
+	BackElectricTorque                  string `gorm:"column:back_electric_torque"                   json:"back_electric_torque"                   form:"back_electric_torque"`
+	SystemIntegratedPower               string `gorm:"column:system_integrated_power"                json:"system_integrated_power"                form:"system_integrated_power"`
+	SystemIntegratedTorque              string `gorm:"column:system_integrated_torque"               json:"system_integrated_torque"               form:"system_integrated_torque"`
+	MotorNumber                         string `gorm:"column:motor_number"                           json:"motor_number"                           form:"motor_number"`
+	MotorLayout                         string `gorm:"column:motor_layout"                           json:"motor_layout"                           form:"motor_layout"`
+	BatteryType                         string `gorm:"column:battery_type"                           json:"battery_type"                           form:"battery_type"`
+	MaximumSimulationMilage             string `gorm:"column:maximum_simulation_milage"              json:"maximum_simulation_milage"              form:"maximum_simulation_milage"`
+	BatteryEnergy                       string `gorm:"column:battery_energy"                         json:"battery_energy"                         form:"battery_energy"`
+	HundredElectricityConsumption       string `gorm:"column:hundred_electricity_consumption"        json:"hundred_electricity_consumption"        form:"hundred_electricity_consumption"`
+	BatteryPackWarranty                 string `gorm:"column:battery_pack_warranty"                  json:"battery_pack_warranty"                  form:"battery_pack_warranty"`
+	GearNumber                          string `gorm:"column:gear_number"                            json:"gear_number"                            form:"gear_number"`
+	GearboxType                         string `gorm:"column:gearbox_type"                           json:"gearbox_type"                           form:"gearbox_type"`
+	DriveType                           string `gorm:"column:drive_type"                             json:"drive_type"                             form:"drive_type"`
+	FrontSuspentionType                 string `gorm:"column:front_suspention_type"                  json:"front_suspention_type"                  form:"front_suspention_type"`
+	BackSuspentionType                  string `gorm:"column:back_suspention_type"                   json:"back_suspention_type"                   form:"back_suspention_type"`
+	AssistType                          string `gorm:"column:assist_type"                            json:"assist_type"                            form:"assist_type"`
+	BodyStructure                       string `gorm:"column:body_structure"                         json:"body_structure"                         form:"body_structure"`
+	FrontBrakeType                      string `gorm:"column:front_brake_type"                       json:"front_brake_type"                       form:"front_brake_type"`
+	BackBrakeType                       string `gorm:"column:back_brake_type"                        json:"back_brake_type"                        form:"back_brake_type"`
+	ParkingBrakeType                    string `gorm:"column:parking_brake_type"                     json:"parking_brake_type"                     form:"parking_brake_type"`
+	FrontWheelSpecification             string `gorm:"column:front_wheel_specification"              json:"front_wheel_specification"              form:"front_wheel_specification"`
+	BackWheelSpecification              string `gorm:"column:back_wheel_specification"               json:"back_wheel_specification"               form:"back_wheel_specification"`
+	SpareWheelSpecification             string `gorm:"column:spare_wheel_specification"              json:"spare_wheel_specification"              form:"spare_wheel_specification"`
+	MainSeatAirbag                      string `gorm:"column:main_seat_airbag"                       json:"main_seat_airbag"                       form:"main_seat_airbag"`
+	AuxiliarySeatAirbag                 string `gorm:"column:auxiliary_seat_airbag"                  json:"auxiliary_seat_airbag"                  form:"auxiliary_seat_airbag"`
+	FrontSideAirbag                     string `gorm:"column:front_side_airbag"                      json:"front_side_airbag"                      form:"front_side_airbag"`
+	BackSideAirbag                      string `gorm:"column:back_side_airbag"                       json:"back_side_airbag"                       form:"back_side_airbag"`
+	FontHeadAirbag                      string `gorm:"column:font_head_airbag"                       json:"font_head_airbag"                       form:"font_head_airbag"`
+	BackHeadAirbag                      string `gorm:"column:back_head_airbag"                       json:"back_head_airbag"                       form:"back_head_airbag"`
+	KneeAirbag                          string `gorm:"column:knee_airbag"                            json:"knee_airbag"                            form:"knee_airbag"`
+	PassengerSeatCushionAirbag          string `gorm:"column:passenger_seat_cushion_airbag"          json:"passenger_seat_cushion_airbag"          form:"passenger_seat_cushion_airbag"`
+	FrontMiddleAirbag                   string `gorm:"column:front_middle_airbag"                    json:"front_middle_airbag"                    form:"front_middle_airbag"`
+	BackBeltAirbag                      string `gorm:"column:back_belt_airbag"                       json:"back_belt_airbag"                       form:"back_belt_airbag"`
+	RearSeatAntiSlideAirbag             string `gorm:"column:rear_seat_anti_slide_airbag"            json:"rear_seat_anti_slide_airbag"            form:"rear_seat_anti_slide_airbag"`
+	RearCentralAirbag                   string `gorm:"column:rear_central_airbag"                    json:"rear_central_airbag"                    form:"rear_central_airbag"`
+	PassivePedestrianProtection         string `gorm:"column:passive_pedestrian_protection"          json:"passive_pedestrian_protection"          form:"passive_pedestrian_protection"`
+	TirePresureMonitor                  string `gorm:"column:tire_presure_monitor"                   json:"tire_presure_monitor"                   form:"tire_presure_monitor"`
+	RunFlatTire                         string `gorm:"column:run_flat_tire"                          json:"run_flat_tire"                          form:"run_flat_tire"`
+	SeatBeltWarning                     string `gorm:"column:seat_belt_warning"                      json:"seat_belt_warning"                      form:"seat_belt_warning"`
+	IsoFix                              string `gorm:"column:iso_fix"                                json:"iso_fix"                                form:"iso_fix"`
+	Abs                                 string `gorm:"column:abs"                                    json:"abs"                                    form:"abs"`
+	EbdCbc                              string `gorm:"column:ebd_cbc"                                json:"ebd_cbc"                                form:"ebd_cbc"`
+	EbaBasBa                            string `gorm:"column:eba_bas_ba"                             json:"eba_bas_ba"                             form:"eba_bas_ba"`
+	AsrTcsTrc                           string `gorm:"column:asr_tcs_trc"                            json:"asr_tcs_trc"                            form:"asr_tcs_trc"`
+	Esp                                 string `gorm:"column:esp"                                    json:"esp"                                    form:"esp"`
+	ParallelAuxiliary                   string `gorm:"column:parallel_auxiliary"                     json:"parallel_auxiliary"                     form:"parallel_auxiliary"`
+	LaneDepartureWarningSystem          string `gorm:"column:lane_departure_warning_system"          json:"lane_departure_warning_system"          form:"lane_departure_warning_system"`
+	LaneKeeping                         string `gorm:"column:lane_keeping"                           json:"lane_keeping"                           form:"lane_keeping"`
+	RoadTrafficSignRecognition          string `gorm:"column:road_traffic_sign_recognition"          json:"road_traffic_sign_recognition"          form:"road_traffic_sign_recognition"`
+	ActiveBrake                         string `gorm:"column:active_brake"                           json:"active_brake"                           form:"active_brake"`
+	NightVision                         string `gorm:"column:night_vision"                           json:"night_vision"                           form:"night_vision"`
+	FatigueDrivingWarning               string `gorm:"column:fatigue_driving_warning"                json:"fatigue_driving_warning"                form:"fatigue_driving_warning"`
+	FrontParkingRador                   string `gorm:"column:front_parking_rador"                    json:"front_parking_rador"                    form:"front_parking_rador"`
+	BackParkingRador                    string `gorm:"column:back_parking_rador"                     json:"back_parking_rador"                     form:"back_parking_rador"`
+	AutomaticDrivingAssistance          string `gorm:"column:automatic_driving_assistance"           json:"automatic_driving_assistance"           form:"automatic_driving_assistance"`
+	ReverseVehicleSideWarningSystem     string `gorm:"column:reverse_vehicle_side_warning_system"    json:"reverse_vehicle_side_warning_system"    form:"reverse_vehicle_side_warning_system"`
+	CruiseSystem                        string `gorm:"column:cruise_system"                          json:"cruise_system"                          form:"cruise_system"`
+	DrivingModeSelection                string `gorm:"column:driving_mode_selection"                 json:"driving_mode_selection"                 form:"driving_mode_selection"`
+	AutomaticParking                    string `gorm:"column:automatic_parking"                      json:"automatic_parking"                      form:"automatic_parking"`
+	EngineStartStopTechnology           string `gorm:"column:engine_start_stop_technology"           json:"engine_start_stop_technology"           form:"engine_start_stop_technology"`
+	AutoHold                            string `gorm:"column:auto_hold"                              json:"auto_hold"                              form:"auto_hold"`
+	AscentAssist                        string `gorm:"column:ascent_assist"                          json:"ascent_assist"                          form:"ascent_assist"`
+	Hdc                                 string `gorm:"column:hdc"                                    json:"hdc"                                    form:"hdc"`
+	VariableSuspension                  string `gorm:"column:variable_suspension"                    json:"variable_suspension"                    form:"variable_suspension"`
+	AirSuspension                       string `gorm:"column:air_suspension"                         json:"air_suspension"                         form:"air_suspension"`
+	EInductionSuspension                string `gorm:"column:e_induction_suspension"                 json:"e_induction_suspension"                 form:"e_induction_suspension"`
+	VariableSteeringRatio               string `gorm:"column:variable_steering_ratio"                json:"variable_steering_ratio"                form:"variable_steering_ratio"`
+	CentralDiffLock                     string `gorm:"column:central_diff_lock"                      json:"central_diff_lock"                      form:"central_diff_lock"`
+	OverallActiveSteeringSystem         string `gorm:"column:overall_active_steering_system"         json:"overall_active_steering_system"         form:"overall_active_steering_system"`
+	Edl                                 string `gorm:"column:edl"                                    json:"edl"                                    form:"edl"`
+	WadeSensingSystem                   string `gorm:"column:wade_sensing_system"                    json:"wade_sensing_system"                    form:"wade_sensing_system"`
+	SkylightType                        string `gorm:"column:skylight_type"                          json:"skylight_type"                          form:"skylight_type"`
+	SportsAppearanceKit                 string `gorm:"column:sports_appearance_kit"                  json:"sports_appearance_kit"                  form:"sports_appearance_kit"`
+	Tail                                string `gorm:"column:tail"                                   json:"tail"                                   form:"tail"`
+	RimMaterial                         string `gorm:"column:rim_material"                           json:"rim_material"                           form:"rim_material"`
+	Eosd                                string `gorm:"column:eosd"                                   json:"eosd"                                   form:"eosd"`
+	FramelessDesignDoor                 string `gorm:"column:frameless_design_door"                  json:"frameless_design_door"                  form:"frameless_design_door"`
+	SideSlidingDoor                     string `gorm:"column:side_sliding_door"                      json:"side_sliding_door"                      form:"side_sliding_door"`
+	ElectricTrunk                       string `gorm:"column:electric_trunk"                         json:"electric_trunk"                         form:"electric_trunk"`
+	InductiveTrunk                      string `gorm:"column:inductive_trunk"                        json:"inductive_trunk"                        form:"inductive_trunk"`
+	RearCompartmentPositionMemory       string `gorm:"column:rear_compartment_position_memory"       json:"rear_compartment_position_memory"       form:"rear_compartment_position_memory"`
+	TheTailgateGlassOpensIndependently  string `gorm:"column:the_tailgate_glass_opens_independently" json:"the_tailgate_glass_opens_independently" form:"the_tailgate_glass_opens_independently"`
+	RoofLuggageRack                     string `gorm:"column:roof_luggage_rack"                      json:"roof_luggage_rack"                      form:"roof_luggage_rack"`
+	ElectronicAntiTheft                 string `gorm:"column:electronic_anti_theft"                  json:"electronic_anti_theft"                  form:"electronic_anti_theft"`
+	CentralControlLock                  string `gorm:"column:central_control_lock"                   json:"central_control_lock"                   form:"central_control_lock"`
+	KeyType                             string `gorm:"column:key_type"                               json:"key_type"                               form:"key_type"`
+	KeylessStartSystem                  string `gorm:"column:keyless_start_system"                   json:"keyless_start_system"                   form:"keyless_start_system"`
+	KeylessEntrySystem                  string `gorm:"column:keyless_entry_system"                   json:"keyless_entry_system"                   form:"keyless_entry_system"`
+	HideElectricDoorHandle              string `gorm:"column:hide_electric_door_handle"              json:"hide_electric_door_handle"              form:"hide_electric_door_handle"`
+	ActiveIntakeGrille                  string `gorm:"column:active_intake_grille"                   json:"active_intake_grille"                   form:"active_intake_grille"`
+	RemoteStart                         string `gorm:"column:remote_start"                           json:"remote_start"                           form:"remote_start"`
+	OutsidePedal                        string `gorm:"column:outside_pedal"                          json:"outside_pedal"                          form:"outside_pedal"`
+	BatteryPreHeating                   string `gorm:"column:battery_pre_heating"                    json:"battery_pre_heating"                    form:"battery_pre_heating"`
+	SteeringWheelMaterial               string `gorm:"column:steering_wheel_material"                json:"steering_wheel_material"                form:"steering_wheel_material"`
+	SteeringWheelAdjustment             string `gorm:"column:steering_wheel_adjustment"              json:"steering_wheel_adjustment"              form:"steering_wheel_adjustment"`
+	MultiFunctionalSteeringWheel        string `gorm:"column:multi_functional_steering_wheel"        json:"multi_functional_steering_wheel"        form:"multi_functional_steering_wheel"`
+	SteeringWheelShift                  string `gorm:"column:steering_wheel_shift"                   json:"steering_wheel_shift"                   form:"steering_wheel_shift"`
+	SteeringWheelHeating                string `gorm:"column:steering_wheel_heating"                 json:"steering_wheel_heating"                 form:"steering_wheel_heating"`
+	SteeringWheelRemember               string `gorm:"column:steering_wheel_remember"                json:"steering_wheel_remember"                form:"steering_wheel_remember"`
+	DrivingComputerDisplay              string `gorm:"column:driving_computer_display"               json:"driving_computer_display"               form:"driving_computer_display"`
+	FullLcdDashboard                    string `gorm:"column:full_lcd_dashboard"                     json:"full_lcd_dashboard"                     form:"full_lcd_dashboard"`
+	FullLcdDashboardSize                string `gorm:"column:full_lcd_dashboard_size"                json:"full_lcd_dashboard_size"                form:"full_lcd_dashboard_size"`
+	HudRisingNumberDisplay              string `gorm:"column:hud_rising_number_display"              json:"hud_rising_number_display"              form:"hud_rising_number_display"`
+	CarDrivingRecorder                  string `gorm:"column:car_driving_recorder"                   json:"car_driving_recorder"                   form:"car_driving_recorder"`
+	ActiveNoiseReduction                string `gorm:"column:active_noise_reduction"                 json:"active_noise_reduction"                 form:"active_noise_reduction"`
+	MobilePhoneWirelessCharging         string `gorm:"column:mobile_phone_wireless_charging"         json:"mobile_phone_wireless_charging"         form:"mobile_phone_wireless_charging"`
+	ElectricallyAdjustablePedal         string `gorm:"column:electrically_adjustable_pedal"          json:"electrically_adjustable_pedal"          form:"electrically_adjustable_pedal"`
+	SeatMaterial                        string `gorm:"column:seat_material"                          json:"seat_material"                          form:"seat_material"`
+	SportSeat                           string `gorm:"column:sport_seat"                             json:"sport_seat"                             form:"sport_seat"`
+	MainSeatAdjustmentMode              string `gorm:"column:main_seat_adjustment_mode"              json:"main_seat_adjustment_mode"              form:"main_seat_adjustment_mode"`
+	AuxiliarySeatAdjustmentMode         string `gorm:"column:auxiliary_seat_adjustment_mode"         json:"auxiliary_seat_adjustment_mode"         form:"auxiliary_seat_adjustment_mode"`
+	MainElectricAdust                   string `gorm:"column:main_electric_adust"                    json:"main_electric_adust"                    form:"main_electric_adust"`
+	AuxiliaryElectricAdust              string `gorm:"column:auxiliary_electric_adust"               json:"auxiliary_electric_adust"               form:"auxiliary_electric_adust"`
+	FrontSeatFunction                   string `gorm:"column:front_seat_function"                    json:"front_seat_function"                    form:"front_seat_function"`
+	ElectricSeatRemeber                 string `gorm:"column:electric_seat_remeber"                  json:"electric_seat_remeber"                  form:"electric_seat_remeber"`
+	AuxiliaryAdjustableButton           string `gorm:"column:auxiliary_adjustable_button"            json:"auxiliary_adjustable_button"            form:"auxiliary_adjustable_button"`
+	SecondRowSeatAdjustment             string `gorm:"column:second_row_seat_adjustment"             json:"second_row_seat_adjustment"             form:"second_row_seat_adjustment"`
+	RearSeatElectricAdjustment          string `gorm:"column:rear_seat_electric_adjustment"          json:"rear_seat_electric_adjustment"          form:"rear_seat_electric_adjustment"`
+	RearSeatFunction                    string `gorm:"column:rear_seat_function"                     json:"rear_seat_function"                     form:"rear_seat_function"`
+	BackFoldTable                       string `gorm:"column:back_fold_table"                        json:"back_fold_table"                        form:"back_fold_table"`
+	SecondIndependent                   string `gorm:"column:second_independent"                     json:"second_independent"                     form:"second_independent"`
+	SeatLayoutForm                      string `gorm:"column:seat_layout_form"                       json:"seat_layout_form"                       form:"seat_layout_form"`
+	BackDownType                        string `gorm:"column:back_down_type"                         json:"back_down_type"                         form:"back_down_type"`
+	RearSeatPowerDown                   string `gorm:"column:rear_seat_power_down"                   json:"rear_seat_power_down"                   form:"rear_seat_power_down"`
+	FrontHandrail                       string `gorm:"column:front_handrail"                         json:"front_handrail"                         form:"front_handrail"`
+	BackHandrail                        string `gorm:"column:back_handrail"                          json:"back_handrail"                          form:"back_handrail"`
+	BackCupHolder                       string `gorm:"column:back_cup_holder"                        json:"back_cup_holder"                        form:"back_cup_holder"`
+	HeatingCoolingCupHolder             string `gorm:"column:heating_cooling_cup_holder"             json:"heating_cooling_cup_holder"             form:"heating_cooling_cup_holder"`
+	CentralColourScreen                 string `gorm:"column:central_colour_screen"                  json:"central_colour_screen"                  form:"central_colour_screen"`
+	CenterConsoleLargeScreenSize        string `gorm:"column:center_console_large_screen_size"       json:"center_console_large_screen_size"       form:"center_console_large_screen_size"`
+	Gps                                 string `gorm:"column:gps"                                    json:"gps"                                    form:"gps"`
+	NavigationTrafficInformationDisplay string `gorm:"column:navigation_traffic_information_display" json:"navigation_traffic_information_display" form:"navigation_traffic_information_display"`
+	RoadRescueCall                      string `gorm:"column:road_rescue_call"                       json:"road_rescue_call"                       form:"road_rescue_call"`
+	CentralLcdSplitScreen               string `gorm:"column:central_lcd_split_screen"               json:"central_lcd_split_screen"               form:"central_lcd_split_screen"`
+	CarPhone                            string `gorm:"column:car_phone"                              json:"car_phone"                              form:"car_phone"`
+	MobileInternet                      string `gorm:"column:mobile_internet"                        json:"mobile_internet"                        form:"mobile_internet"`
+	VoiceControl                        string `gorm:"column:voice_control"                          json:"voice_control"                          form:"voice_control"`
+	GestureControl                      string `gorm:"column:gesture_control"                        json:"gesture_control"                        form:"gesture_control"`
+	FaceRecognition                     string `gorm:"column:face_recognition"                       json:"face_recognition"                       form:"face_recognition"`
+	CarInternet                         string `gorm:"column:car_internet"                           json:"car_internet"                           form:"car_internet"`
+	Ota                                 string `gorm:"column:ota"                                    json:"ota"                                    form:"ota"`
+	CarTv                               string `gorm:"column:car_tv"                                 json:"car_tv"                                 form:"car_tv"`
+	BackLcd                             string `gorm:"column:back_lcd"                               json:"back_lcd"                               form:"back_lcd"`
+	RearControlMultimedia               string `gorm:"column:rear_control_multimedia"                json:"rear_control_multimedia"                form:"rear_control_multimedia"`
+	ChargingInterface                   string `gorm:"column:charging_interface"                     json:"charging_interface"                     form:"charging_interface"`
+	NumberOfInterfaces                  string `gorm:"column:number_of_interfaces"                   json:"number_of_interfaces"                   form:"number_of_interfaces"`
+	CdDvd                               string `gorm:"column:cd_dvd"                                 json:"cd_dvd"                                 form:"cd_dvd"`
+	PowerOf220v                         string `gorm:"column:power_of220v"                           json:"power_of220v"                           form:"power_of220v"`
+	InterfaceOf12v                      string `gorm:"column:interface_of12v"                        json:"interface_of12v"                        form:"interface_of12v"`
+	SpeakerBrand                        string `gorm:"column:speaker_brand"                          json:"speaker_brand"                          form:"speaker_brand"`
+	SpeakerNumber                       string `gorm:"column:speaker_number"                         json:"speaker_number"                         form:"speaker_number"`
+	Near                                string `gorm:"column:near"                                   json:"near"                                   form:"near"`
+	Far                                 string `gorm:"column:far"                                    json:"far"                                    form:"far"`
+	LightingFeatures                    string `gorm:"column:lighting_features"                      json:"lighting_features"                      form:"lighting_features"`
+	Daytime                             string `gorm:"column:daytime"                                json:"daytime"                                form:"daytime"`
+	AdaptiveFarNear                     string `gorm:"column:adaptive_far_near"                      json:"adaptive_far_near"                      form:"adaptive_far_near"`
+	AutoHead                            string `gorm:"column:auto_head"                              json:"auto_head"                              form:"auto_head"`
+	SteeringAssistLamp                  string `gorm:"column:steering_assist_lamp"                   json:"steering_assist_lamp"                   form:"steering_assist_lamp"`
+	SideTurn                            string `gorm:"column:side_turn"                              json:"side_turn"                              form:"side_turn"`
+	Fog                                 string `gorm:"column:fog"                                    json:"fog"                                    form:"fog"`
+	HeadlampRainFogMode                 string `gorm:"column:headlamp_rain_fog_mode"                 json:"headlamp_rain_fog_mode"                 form:"headlamp_rain_fog_mode"`
+	HeightAdjustable                    string `gorm:"column:height_adjustable"                      json:"height_adjustable"                      form:"height_adjustable"`
+	Clean                               string `gorm:"column:clean"                                  json:"clean"                                  form:"clean"`
+	HeadlampDelayOff                    string `gorm:"column:headlamp_delay_off"                     json:"headlamp_delay_off"                     form:"headlamp_delay_off"`
+	TouchReadingLamp                    string `gorm:"column:touch_reading_lamp"                     json:"touch_reading_lamp"                     form:"touch_reading_lamp"`
+	Atmosphere                          string `gorm:"column:atmosphere"                             json:"atmosphere"                             form:"atmosphere"`
+	FrontElectricWindow                 string `gorm:"column:front_electric_window"                  json:"front_electric_window"                  form:"front_electric_window"`
+	BackElectricWindow                  string `gorm:"column:back_electric_window"                   json:"back_electric_window"                   form:"back_electric_window"`
+	WindowOneKey                        string `gorm:"column:window_one_key"                         json:"window_one_key"                         form:"window_one_key"`
+	AntiPinchHand                       string `gorm:"column:anti_pinch_hand"                        json:"anti_pinch_hand"                        form:"anti_pinch_hand"`
+	MultilayerSoundInsulationGlass      string `gorm:"column:multilayer_sound_insulation_glass"      json:"multilayer_sound_insulation_glass"      form:"multilayer_sound_insulation_glass"`
+	ExteriorRearviewMirrorFunction      string `gorm:"column:exterior_rearview_mirror_function"      json:"exterior_rearview_mirror_function"      form:"exterior_rearview_mirror_function"`
+	InteriorRearviewMirrorFunction      string `gorm:"column:interior_rearview_mirror_function"      json:"interior_rearview_mirror_function"      form:"interior_rearview_mirror_function"`
+	BackSunshade                        string `gorm:"column:back_sunshade"                          json:"back_sunshade"                          form:"back_sunshade"`
+	BackSideSunshade                    string `gorm:"column:back_side_sunshade"                     json:"back_side_sunshade"                     form:"back_side_sunshade"`
+	BackSidePrivacy                     string `gorm:"column:back_side_privacy"                      json:"back_side_privacy"                      form:"back_side_privacy"`
+	Cosmetic                            string `gorm:"column:cosmetic"                               json:"cosmetic"                               form:"cosmetic"`
+	BackWiper                           string `gorm:"column:back_wiper"                             json:"back_wiper"                             form:"back_wiper"`
+	FrontWiper                          string `gorm:"column:front_wiper"                            json:"front_wiper"                            form:"front_wiper"`
+	HeatableSprayNozzle                 string `gorm:"column:heatable_spray_nozzle"                  json:"heatable_spray_nozzle"                  form:"heatable_spray_nozzle"`
+	AirconditionControlType             string `gorm:"column:aircondition_control_type"              json:"aircondition_control_type"              form:"aircondition_control_type"`
+	RearIndependentAirConditioner       string `gorm:"column:rear_independent_air_conditioner"       json:"rear_independent_air_conditioner"       form:"rear_independent_air_conditioner"`
+	RearSeatAirOutlet                   string `gorm:"column:rear_seat_air_outlet"                   json:"rear_seat_air_outlet"                   form:"rear_seat_air_outlet"`
+	TemperatureZoneControl              string `gorm:"column:temperature_zone_control"               json:"temperature_zone_control"               form:"temperature_zone_control"`
+	CarAirPurifier                      string `gorm:"column:car_air_purifier"                       json:"car_air_purifier"                       form:"car_air_purifier"`
+	Pm25Device                          string `gorm:"column:pm25_device"                            json:"pm25_device"                            form:"pm25_device"`
+	NegativeIonGenerator                string `gorm:"column:negative_ion_generator"                 json:"negative_ion_generator"                 form:"negative_ion_generator"`
+	FragranceSystem                     string `gorm:"column:fragrance_system"                       json:"fragrance_system"                       form:"fragrance_system"`
+	Refrigerator                        string `gorm:"column:refrigerator"                           json:"refrigerator"                           form:"refrigerator"`
+	AuxiliaryDrivingChip                string `gorm:"column:auxiliary_driving_chip"                 json:"auxiliary_driving_chip"                 form:"auxiliary_driving_chip"`
+	ChipComputingPower                  string `gorm:"column:chip_computing_power"                   json:"chip_computing_power"                   form:"chip_computing_power"`
+	NumberOfCameras                     string `gorm:"column:number_of_cameras"                      json:"number_of_cameras"                      form:"number_of_cameras"`
+	NumberOfUltrasonicRadars            string `gorm:"column:number_of_ultrasonic_radars"            json:"number_of_ultrasonic_radars"            form:"number_of_ultrasonic_radars"`
+	NumberOfMillimeterWaveRadars        string `gorm:"column:number_of_millimeter_wave_radars"       json:"number_of_millimeter_wave_radars"       form:"number_of_millimeter_wave_radars"`
+	NumberOfLidars                      string `gorm:"column:number_of_lidars"                       json:"number_of_lidars"                       form:"number_of_lidars"`
+	BodyColour                          string `gorm:"column:body_colour"                            json:"body_colour"                            form:"body_colour"`
+	InteriorColor                       string `gorm:"column:interior_color"                         json:"interior_color"                         form:"interior_color"`
+	IsOn                                int64  `gorm:"column:is_on"                                  json:"is_on"                                  form:"is_on"`
+	CreatedAt                           int64  `gorm:"column:created_at"                             json:"created_at"                             form:"created_at"`
+	UpdatedAt                           int64  `gorm:"column:updated_at"                             json:"updated_at"                             form:"updated_at"`
+}
+
+type StyleList struct {
+	ID         int64  `gorm:"column:id"          json:"id"          form:"id"`
+	BrandId    string `gorm:"column:brand_id"    json:"brand_id"    form:"brand_id"`
+	BrandName  string `gorm:"column:brand_name"  json:"brand_name"  form:"brand_name"`
+	SeriesId   string `gorm:"column:series_id"   json:"series_id"   form:"series_id"`
+	SeriesName string `gorm:"column:series_name" json:"series_name" form:"series_name"`
+	StyleId    string `gorm:"column:style_id"    json:"style_id"    form:"style_id"`
+	StyleName  string `gorm:"column:style_name"  json:"style_name"  form:"style_name"`
+	Maker      string `gorm:"column:maker"       json:"maker"       form:"maker"`
+	IsOn       int64  `gorm:"column:is_on"       json:"is_on"       form:"is_on"`
+	MaintainId int64  `gorm:"column:maintain_id" json:"maintain_id" form:"maintain_id"`
+}
+
+type defalutSyStyleModel struct {
+	tableName string
+}
+
+func NewSyStyleModel() SyStyleModel {
+	return &defalutSyStyleModel{
+		tableName: "db_adm_ads.t_adm_ads5",
+	}
+}
+
+func (d *defalutSyStyleModel) Update(db *gorm.DB, values interface{}) error {
+	return database.Update(db, values, database.Option{
+		TableName: d.tableName,
+	})
+}
+
+func (d *defalutSyStyleModel) List(db *gorm.DB, pagination *Pagination, join bool) ([]StyleList, error) {
+	var res []StyleList
+
+	option := database.Option{
+		TableName: d.tableName + " AS t1",
+		Joins:     []string{"LEFT JOIN db_adm_ads.t_adm_ads13 AS t2 ON t1.style_id = t2.style_id"},
+		Fields:    "t1.id, brand_name, series_id, series_name, t1.style_id, style_name, maker, is_on, t2.id AS maintain_id",
+		Limit:     pagination.Limit,
+		OffSet:    pagination.Offset,
+	}
+	if join {
+		option.Joins = []string{}
+	}
+
+	err := database.List(db, &res, option)
+
+	return res, err
+}
+
+func (d *defalutSyStyleModel) Count(db *gorm.DB, join bool) (int64, error) {
+	option := database.Option{}
+	if join {
+		option = database.Option{
+			TableName: d.tableName + " AS t1",
+			Joins:     []string{"LEFT JOIN db_adm_ads.t_adm_ads13 AS t2 ON t1.style_id = t2.style_id"},
+		}
+	} else {
+		option = database.Option{
+			TableName: d.tableName + " AS t1",
+		}
+	}
+	return database.Count(db, option)
+}
+
+func (d *defalutSyStyleModel) Get(db *gorm.DB) (*GdSyStyle, error) {
+	var res GdSyStyle
+	err := database.Get(db, &res, database.Option{
+		TableName: d.tableName,
+	})
+
+	return &res, err
+}
+
+func (d *defalutSyStyleModel) StyleList(db *gorm.DB, fields string) ([]GdSyStyle, error) {
+	var res []GdSyStyle
+
+	if fields == "" {
+		fields = "*"
+	}
+
+	err := database.List(db, &res, database.Option{
+		TableName: d.tableName,
+		Fields:    fields,
+	})
+
+	return res, err
+}

+ 2 - 0
nohup.out

@@ -0,0 +1,2 @@
+2023/02/06 10:37:45 Register etcd success
+2023/02/06 10:37:45 Listening and serving TCP on 0.0.0.0:40053

+ 96 - 0
parser/config.go

@@ -0,0 +1,96 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package parser
+
+import (
+	"fmt"
+	"path/filepath"
+	"strings"
+
+	"adm-vehicle-style/config"
+
+	"github.com/fsnotify/fsnotify"
+	"github.com/spf13/viper"
+)
+
+var (
+	v    *viper.Viper
+	Conf *config.Configure
+)
+
+// LoadConfig 装载配置文件
+func LoadConfig(filename string) error {
+	configPath, configName := filepath.Split(filename)
+	fileList := strings.Split(configName, ".")
+	if len(fileList) < 2 {
+		return fmt.Errorf("%s", "文件格式不正确")
+	}
+
+	configName = fileList[0]
+	fileExt := fileList[1]
+	var err error
+	if fileExt == "json" {
+		err = LoadConfigFromJson(configName, configPath)
+	} else if fileExt == "yaml" || fileExt == "yml" {
+		err = LoadConfigFromYaml(configName, configPath)
+	} else {
+		err = fmt.Errorf("%s", "不支持的文件格式")
+	}
+
+	// 出错直接返回
+	if err != nil {
+		return err
+	}
+
+	// 设置文件监听函数
+	v.OnConfigChange(func(e fsnotify.Event) {
+		fmt.Printf("配置文件有变化, Event:%s \n", e.String())
+		parseConfig()
+		Handle()
+	})
+
+	// 监听
+	v.WatchConfig()
+
+	return nil
+}
+
+// LoadConfigFromYaml 装载yaml类型的配置文件
+func LoadConfigFromYaml(configName, configPath string) error {
+	v = viper.New()
+	v.SetConfigName(configName + ".yaml")
+	v.AddConfigPath(configPath)
+	// 设置配置文件类型
+	v.SetConfigType("yaml")
+
+	if err := v.ReadInConfig(); err != nil {
+		return err
+	}
+
+	return parseConfig()
+}
+
+// LoadConfigFromJson 装载json类型的配置文件
+func LoadConfigFromJson(configName, configPath string) error {
+	v = viper.New()
+	v.SetConfigName(configName + ".json")
+	v.AddConfigPath(configPath)
+
+	// 设置配置文件类型
+	v.SetConfigType("json")
+	if err := v.ReadInConfig(); err != nil {
+		return err
+	}
+
+	return parseConfig()
+}
+
+func parseConfig() error {
+	Conf = &config.Configure{}
+	if err := v.Unmarshal(Conf); err != nil {
+		return err
+	}
+
+	return nil
+}

+ 61 - 0
parser/database.go

@@ -0,0 +1,61 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package parser
+
+import (
+	"adm-vehicle-style/config"
+
+	"git.getensh.com/common/gopkgsv2/database"
+)
+
+var mysqlConfig config.MysqlConfig
+
+func MysqlHandler(conf *config.Configure) {
+	// mysqlConfig.Addr 不为空表示已经初始化
+	if mysqlConfig.Addr != "" {
+		sqlDB, err := database.DB().DB()
+		if err != nil {
+			return
+		}
+		// 地址,用户名,密码相同比较其他配置是否一致
+		if mysqlConfig.User == conf.Mysql.User &&
+			mysqlConfig.Password == conf.Mysql.Password &&
+			mysqlConfig.Addr == conf.Mysql.Addr {
+			if mysqlConfig.MaxIdle != conf.Mysql.MaxIdle {
+				sqlDB.SetMaxIdleConns(conf.Mysql.MaxIdle)
+			}
+
+			if mysqlConfig.MaxConn != conf.Mysql.MaxConn {
+				sqlDB.SetMaxOpenConns(conf.Mysql.MaxConn)
+			}
+
+			if mysqlConfig.LogMode != conf.Mysql.LogMode {
+				database.DB().Debug()
+			}
+
+			return // 这里直接返回
+		}
+
+		// 地址用户名密码不一致,关闭连接重新连接
+		_ = sqlDB.Close()
+	}
+
+	// 私有db为空使用公共db
+	dbname := conf.Rpc.ADMVehicleStyle.MysqlDb
+	if dbname == "" {
+		dbname = conf.Mysql.DB
+	}
+
+	// 连接database
+	database.Setup(conf.Mysql.User,
+		conf.Mysql.Password,
+		conf.Mysql.Addr,
+		dbname,
+		conf.Mysql.Charset,
+		conf.Mysql.MaxIdle,
+		conf.Mysql.MaxConn,
+		conf.Mysql.LogMode)
+
+	mysqlConfig = conf.Mysql
+}

+ 30 - 0
parser/init.go

@@ -0,0 +1,30 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package parser
+
+import "adm-vehicle-style/config"
+
+// 处理函数的声明
+type Handler func(*config.Configure)
+
+// 处理函数数组
+var handlers []Handler
+
+// Register 注册处理函数
+func Register(handler ...Handler) {
+	handlers = append(handlers, handler...)
+}
+
+// Do 执行处理函数
+func Handle() {
+	// 配置为nil,直接返回
+	if Conf == nil {
+		return
+	}
+
+	// 执行处理函数
+	for _, handler := range handlers {
+		handler(Conf)
+	}
+}

+ 57 - 0
parser/logger.go

@@ -0,0 +1,57 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package parser
+
+import (
+	"adm-vehicle-style/config"
+	"fmt"
+
+	"git.getensh.com/common/gopkgsv2/logger"
+	"git.getensh.com/common/gopkgsv2/tasker"
+)
+
+var logConfig config.LogConfig
+
+func LoggerHandler(conf *config.Configure) {
+	// logConfig.Path 不为空表示已经初始化
+	if logConfig.Path != "" {
+		if logConfig.Path == conf.Log.Path {
+			return
+		} else {
+			// 刷盘
+			// logger.Sync()
+		}
+	}
+
+	// 取出Stacktrace和Level
+	logStacktrace := conf.Rpc.ADMVehicleStyle.LogStacktrace
+	logLevel := conf.Rpc.ADMVehicleStyle.LogLevel
+	if logLevel == "" {
+		logLevel = conf.Log.Level
+	}
+
+	// 新建全局日志器
+	logger.New(conf.RunMode,
+		logLevel,
+		fmt.Sprintf("%s/%s.log", conf.Log.Path, conf.Rpc.ADMVehicleStyle.ServiceName),
+		conf.Log.MaxSize,
+		conf.Log.MaxBackups,
+		conf.Log.MaxAge,
+		logStacktrace,
+		true)
+
+	// access日志器
+	accessLogger := logger.New(conf.RunMode,
+		logLevel,
+		fmt.Sprintf("%s/%s-access.log", conf.Log.Path, conf.Rpc.ADMVehicleStyle.ServiceName),
+		conf.Log.MaxSize,
+		conf.Log.MaxBackups,
+		conf.Log.MaxAge,
+		logStacktrace,
+		false)
+
+	// 设置访问日志
+	tasker.SetLogger(accessLogger)
+	logConfig = conf.Log
+}

+ 61 - 0
parser/redis.go

@@ -0,0 +1,61 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package parser
+
+import (
+	"adm-vehicle-style/config"
+
+	"git.getensh.com/common/gopkgsv2/cache"
+)
+
+var redisConfig config.RedisConfig
+
+func RedisHandler(conf *config.Configure) {
+	// redisConfig.Addr 不为空表示已经初始化
+	if len(redisConfig.Addrs) != 0 {
+		// 地址或密码变化,关闭当前连接,重新连接
+		if len(redisConfig.Addrs) != len(conf.Redis.Addrs) ||
+			redisConfig.Password != conf.Redis.Password {
+			cache.Close()
+		} else {
+			// 判断addrs数组是否相同
+			addrs := map[string]bool{}
+			for _, v := range redisConfig.Addrs {
+				addrs[v] = true
+			}
+			for _, v := range conf.Redis.Addrs {
+				addrs[v] = true
+			}
+
+			// 地址和密码不变返回
+			if len(redisConfig.Addrs) == len(addrs) {
+				return
+			}
+
+			// 关闭cache
+			cache.Close()
+		}
+	}
+
+	// 私有db不合法使用公共db
+	db := conf.Rpc.ADMVehicleStyle.RedisDb
+	if db < 0 || db > 15 {
+		db = conf.Redis.DB
+	}
+
+	// 连接redis
+	cache.Setup(conf.Redis.Addrs,
+		conf.Redis.Password,
+		db,
+		conf.Redis.PoolSize,
+		conf.Redis.MinIdleConns,
+		conf.Redis.MaxRetries,
+		conf.Redis.Cluster)
+
+	if conf.RunMode != "prod" {
+		// open 'DEBUG' switcher
+	}
+
+	redisConfig = conf.Redis
+}

+ 24 - 0
pb/ReadMe.md

@@ -0,0 +1,24 @@
+### 必要条件
+1. 下载与安装`protoc`工具
+
+    https://github.com/protocolbuffers/protobuf/releases
+
+2. 安装protoc Go插件:`protoc-gen-go`
+
+    方式1(`默认带omitempty`):
+    ```shell
+    go get -u github.com/golang/protobuf/protoc-gen-go
+    ```
+    方式2(`不带omitempty`):
+    ```shell
+    git clone http://gitlab.sygd.com/repo/libs/go/gomodule
+    cd mod /github.com/golang/protobuf@v1.3.4/protoc-gen-go/generator
+    go build
+    cp protoc-gen-go $GOBIN/
+    ```
+
+### 生成说明
+1. 普通生成
+    protoc --go_out=. *.proto
+2. 支持rpc
+    protoc --go_out=plugins=grpc:. *.proto

+ 127 - 0
pb/adm_data.pb.go

@@ -0,0 +1,127 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: adm_data.proto
+
+// package声明符,用来防止不同的消息类型有命名冲突
+
+package pb
+
+import (
+	v1 "adm-vehicle-style/pb/v1"
+	context "context"
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+func init() {
+	proto.RegisterFile("adm_data.proto", fileDescriptor_6b31a6a84b848144)
+}
+
+var fileDescriptor_6b31a6a84b848144 = []byte{
+	// 132 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4b, 0x4c, 0xc9, 0x8d,
+	0x4f, 0x49, 0x2c, 0x49, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x2a, 0x48, 0xd2, 0x2b,
+	0x4e, 0x2d, 0x2a, 0xcb, 0x4c, 0x4e, 0x95, 0xe2, 0x2d, 0x33, 0xd4, 0x47, 0x48, 0x19, 0x99, 0x71,
+	0xb1, 0xb8, 0x24, 0x96, 0x24, 0x0a, 0xe9, 0x71, 0xb1, 0x06, 0x96, 0xa6, 0x16, 0x55, 0x0a, 0x09,
+	0xe8, 0x95, 0x19, 0xea, 0x81, 0x99, 0x41, 0xa9, 0x85, 0xa5, 0xa9, 0xc5, 0x25, 0x52, 0x82, 0x48,
+	0x22, 0xc5, 0x05, 0xf9, 0x79, 0xc5, 0xa9, 0x4a, 0x0c, 0x4e, 0x62, 0x51, 0x22, 0x89, 0x29, 0xb9,
+	0xba, 0x65, 0xa9, 0x19, 0x99, 0xc9, 0x39, 0xa9, 0xba, 0xc5, 0x25, 0x95, 0x39, 0xa9, 0xfa, 0x05,
+	0x49, 0x49, 0x6c, 0x60, 0x63, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x36, 0xae, 0xd2, 0xdd,
+	0x83, 0x00, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// DataClient is the client API for Data service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type DataClient interface {
+	// 通用接口查询
+	Query(ctx context.Context, in *v1.QueryRequest, opts ...grpc.CallOption) (*v1.QueryResponse, error)
+}
+
+type dataClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewDataClient(cc grpc.ClientConnInterface) DataClient {
+	return &dataClient{cc}
+}
+
+func (c *dataClient) Query(ctx context.Context, in *v1.QueryRequest, opts ...grpc.CallOption) (*v1.QueryResponse, error) {
+	out := new(v1.QueryResponse)
+	err := c.cc.Invoke(ctx, "/pb.service.Data/Query", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// DataServer is the server API for Data service.
+type DataServer interface {
+	// 通用接口查询
+	Query(context.Context, *v1.QueryRequest) (*v1.QueryResponse, error)
+}
+
+// UnimplementedDataServer can be embedded to have forward compatible implementations.
+type UnimplementedDataServer struct {
+}
+
+func (*UnimplementedDataServer) Query(ctx context.Context, req *v1.QueryRequest) (*v1.QueryResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Query not implemented")
+}
+
+func RegisterDataServer(s *grpc.Server, srv DataServer) {
+	s.RegisterService(&_Data_serviceDesc, srv)
+}
+
+func _Data_Query_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.QueryRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DataServer).Query(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.Data/Query",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DataServer).Query(ctx, req.(*v1.QueryRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _Data_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "pb.service.Data",
+	HandlerType: (*DataServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "Query",
+			Handler:    _Data_Query_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "adm_data.proto",
+}

+ 13 - 0
pb/adm_data.proto

@@ -0,0 +1,13 @@
+syntax = "proto3";
+
+import "v1/data.proto";
+
+// package声明符,用来防止不同的消息类型有命名冲突
+package pb.service;
+// 用于生成指定语言go的包名称
+option go_package = "adm-vehicle-style/pb";
+
+service Data {
+	// 通用接口查询
+	rpc Query(v1.QueryRequest) returns (v1.QueryResponse) {}
+}

+ 1296 - 0
pb/adm_vehicle_style.pb.go

@@ -0,0 +1,1296 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: adm_vehicle_style.proto
+
+// package声明符,用来防止不同的消息类型有命名冲突
+
+package pb
+
+import (
+	v1 "adm-vehicle-style/pb/v1"
+	context "context"
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+func init() { proto.RegisterFile("adm_vehicle_style.proto", fileDescriptor_7df2a90d4754b945) }
+
+var fileDescriptor_7df2a90d4754b945 = []byte{
+	// 632 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x5b, 0x6f, 0xd3, 0x30,
+	0x14, 0xe6, 0x85, 0x89, 0x9d, 0x75, 0xeb, 0xea, 0xde, 0x20, 0x6c, 0x02, 0xf1, 0xbe, 0x54, 0x1d,
+	0x48, 0x15, 0x37, 0x01, 0x6b, 0x0b, 0xaa, 0xa0, 0x42, 0xac, 0x03, 0x09, 0x5e, 0x26, 0xb7, 0x39,
+	0xa8, 0xd1, 0x72, 0x23, 0x71, 0x23, 0xfa, 0x87, 0xf9, 0x1d, 0x28, 0x76, 0x9d, 0xd8, 0x4e, 0x02,
+	0x88, 0xb7, 0x9c, 0xef, 0x9c, 0xef, 0x3b, 0x3e, 0x17, 0x5b, 0x81, 0x3e, 0x75, 0xfc, 0xeb, 0x14,
+	0xd7, 0xee, 0xca, 0xc3, 0xeb, 0x84, 0x6d, 0x3d, 0xb4, 0xa3, 0x38, 0x64, 0x21, 0x81, 0x68, 0x69,
+	0x27, 0x18, 0xa7, 0xee, 0x0a, 0xad, 0x5e, 0x3a, 0x1c, 0x54, 0xc4, 0x58, 0x87, 0xe9, 0x70, 0xe0,
+	0x50, 0x46, 0x85, 0x79, 0xfe, 0xab, 0x09, 0x8d, 0x2f, 0x22, 0x6c, 0x91, 0x45, 0x91, 0x11, 0xec,
+	0x5f, 0xc4, 0x34, 0x70, 0x3e, 0xb8, 0x09, 0x23, 0x1d, 0x3b, 0x1d, 0xda, 0xb9, 0x79, 0x89, 0x3f,
+	0x36, 0x98, 0x30, 0x8b, 0x18, 0x68, 0xe4, 0x6d, 0x1f, 0xdd, 0x22, 0x36, 0xec, 0x2d, 0x90, 0xc6,
+	0xab, 0x35, 0x69, 0x65, 0x7e, 0xf1, 0x2d, 0x29, 0x4d, 0x15, 0x12, 0xf1, 0xcf, 0xe1, 0xf0, 0x73,
+	0xe4, 0x50, 0x86, 0x8b, 0xaf, 0x5c, 0x8b, 0xdc, 0xcd, 0x62, 0x34, 0x48, 0xb2, 0x8f, 0x32, 0xcf,
+	0xd4, 0x8f, 0xd8, 0x56, 0x92, 0x9f, 0xc0, 0x9d, 0x77, 0xc8, 0xe6, 0xf4, 0x06, 0x63, 0xd2, 0xce,
+	0xbc, 0xd2, 0x92, 0x94, 0x96, 0x0e, 0x0a, 0xd6, 0x08, 0x0e, 0x84, 0xbe, 0x20, 0xf6, 0x8a, 0x84,
+	0x1a, 0xb7, 0x9c, 0xee, 0x19, 0xc0, 0x02, 0x63, 0x17, 0x13, 0xde, 0x95, 0xae, 0x28, 0x46, 0xda,
+	0x92, 0xd6, 0x36, 0x61, 0xc1, 0x7d, 0x0a, 0x8d, 0x5d, 0x51, 0xdc, 0x45, 0xfa, 0x4a, 0x99, 0x1c,
+	0xa9, 0x4f, 0x3b, 0x82, 0x7d, 0x3e, 0x94, 0x62, 0x16, 0xb9, 0xa9, 0xcd, 0x42, 0x41, 0x8d, 0x42,
+	0xc5, 0x4c, 0x95, 0x42, 0x39, 0xf0, 0xf7, 0x8c, 0xb3, 0xe0, 0x7b, 0xa8, 0x64, 0xcc, 0xcc, 0x72,
+	0x46, 0x81, 0x0a, 0xe2, 0x2b, 0x68, 0x2a, 0x09, 0x38, 0xdd, 0x32, 0xb2, 0xaa, 0x22, 0xe5, 0xcc,
+	0x6f, 0xe1, 0x68, 0x4e, 0xdd, 0x80, 0x51, 0x37, 0x98, 0xd3, 0x60, 0x43, 0x3d, 0x72, 0x2f, 0x8b,
+	0xd1, 0x31, 0x49, 0xef, 0x57, 0xb9, 0xf2, 0xcd, 0x98, 0x31, 0xf4, 0x79, 0xcb, 0xf8, 0x44, 0xa4,
+	0xa5, 0x6d, 0x46, 0x01, 0x0a, 0xd6, 0x0c, 0x3a, 0x72, 0x11, 0xb4, 0x33, 0x3c, 0x50, 0x57, 0xa4,
+	0xea, 0x24, 0xe5, 0x42, 0x2e, 0x81, 0xe8, 0xa1, 0xbc, 0x19, 0xa7, 0xe5, 0x13, 0xab, 0xfd, 0xb8,
+	0x5f, 0xe7, 0x16, 0x9a, 0x2f, 0xe4, 0x58, 0x18, 0xfa, 0x7f, 0xea, 0x8b, 0x32, 0x1b, 0x86, 0xbe,
+	0x72, 0x33, 0xc7, 0xe7, 0xbc, 0x21, 0xbc, 0x76, 0xf1, 0xad, 0xdd, 0x4c, 0x09, 0x55, 0xce, 0x32,
+	0xcb, 0x59, 0x9a, 0x25, 0x97, 0xaf, 0x6b, 0xc1, 0x18, 0x5a, 0x13, 0xf4, 0xb0, 0xe8, 0x19, 0x5d,
+	0x21, 0x39, 0xc9, 0xc2, 0x4a, 0x70, 0xbd, 0xc8, 0x4b, 0x38, 0x98, 0xfe, 0x8c, 0xc2, 0x98, 0x29,
+	0x3b, 0xac, 0x00, 0x92, 0xd8, 0x29, 0xe1, 0x82, 0x3e, 0x85, 0xb6, 0x82, 0x5e, 0xd1, 0xe4, 0x86,
+	0x77, 0xc0, 0xc8, 0x63, 0x9d, 0x18, 0x74, 0x19, 0x28, 0x65, 0xde, 0x43, 0x57, 0x9c, 0xd9, 0x88,
+	0x21, 0x0f, 0x8b, 0x72, 0x0c, 0x57, 0x7d, 0x49, 0x36, 0xdc, 0xfe, 0xb4, 0xc1, 0x78, 0x4b, 0x8e,
+	0x33, 0x17, 0xff, 0xd4, 0xb6, 0x72, 0x87, 0x24, 0x51, 0x18, 0x24, 0x28, 0x06, 0x21, 0x32, 0x18,
+	0x83, 0x30, 0xc0, 0xfa, 0x84, 0xaf, 0xa1, 0x71, 0x85, 0x7e, 0xe4, 0x51, 0x26, 0xde, 0x10, 0x7e,
+	0x6f, 0x54, 0x44, 0x52, 0xbb, 0x65, 0x47, 0xbe, 0xcd, 0x12, 0x9e, 0x20, 0xa3, 0xae, 0xc7, 0x75,
+	0x4e, 0xd5, 0xf0, 0x02, 0xd7, 0xb6, 0xb9, 0xca, 0x9d, 0x5f, 0x75, 0xdd, 0x29, 0x56, 0x5a, 0xc7,
+	0xb4, 0xab, 0x6e, 0xba, 0x84, 0xce, 0x47, 0x68, 0xbd, 0x71, 0x1c, 0x43, 0x8a, 0x0f, 0xb4, 0x04,
+	0x4b, 0x35, 0xab, 0xc6, 0x6b, 0xbc, 0x02, 0x86, 0xe6, 0x7f, 0xbc, 0x02, 0x33, 0xe8, 0x8c, 0xd7,
+	0x61, 0x98, 0x54, 0x4a, 0x55, 0x79, 0xea, 0xa5, 0x26, 0x70, 0x2c, 0x43, 0xf3, 0x97, 0x4d, 0xeb,
+	0xf0, 0xbf, 0xbc, 0x70, 0x17, 0xbd, 0x6f, 0x1d, 0xea, 0xf8, 0x67, 0xbb, 0x5f, 0x82, 0x33, 0xfe,
+	0x4b, 0x30, 0x88, 0x96, 0xcb, 0x3d, 0xfe, 0x1f, 0xf0, 0xf8, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0xf7, 0x7e, 0xfd, 0x74, 0x55, 0x08, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// VehicleStyleClient is the client API for VehicleStyle service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type VehicleStyleClient interface {
+	// 品牌列表
+	BrandList(ctx context.Context, in *v1.BrandListRequest, opts ...grpc.CallOption) (*v1.BrandListReply, error)
+	// 模糊搜索
+	Search(ctx context.Context, in *v1.SearchRequest, opts ...grpc.CallOption) (*v1.SearchReply, error)
+	// 更新品牌信息
+	UpdateSYBrand(ctx context.Context, in *v1.UpdateSYBrandRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error)
+	// 获取厂商列表
+	GetMaker(ctx context.Context, in *v1.GetMakerRequest, opts ...grpc.CallOption) (*v1.GetMakerReply, error)
+	// 更新厂商
+	UpdateMaker(ctx context.Context, in *v1.UpdateMakerRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error)
+	// 车系列表
+	SeriesList(ctx context.Context, in *v1.SeriesListRequest, opts ...grpc.CallOption) (*v1.SeriesListReply, error)
+	// 更新车系
+	UpdateSeries(ctx context.Context, in *v1.UpdateSeriesRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error)
+	// 车型列表
+	StyleList(ctx context.Context, in *v1.StyleListRequest, opts ...grpc.CallOption) (*v1.StyleListReply, error)
+	// 更新车型
+	UpdateStyle(ctx context.Context, in *v1.UpdateStyleRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error)
+	// 获取车辆配置信息
+	StyleInfo(ctx context.Context, in *v1.StyleInfoRequest, opts ...grpc.CallOption) (*v1.StyleInfoReply, error)
+	// 更新车辆配置信息
+	UpdateStyleInfo(ctx context.Context, in *v1.UpdateStyleInfoRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error)
+	// 维保手册
+	MaintainManual(ctx context.Context, in *v1.MaintainManualRequest, opts ...grpc.CallOption) (*v1.MaintainManualReply, error)
+	// 项目列表
+	ItemList(ctx context.Context, in *v1.ItemListRequest, opts ...grpc.CallOption) (*v1.ItemListReply, error)
+	// 更新维保手册
+	UpdateMaintainManual(ctx context.Context, in *v1.UpdateMaintainManualRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error)
+	// 维保详情
+	MaintainManualInfo(ctx context.Context, in *v1.MaintainManualInfoRequest, opts ...grpc.CallOption) (*v1.MaintainManualInfoReply, error)
+	// 配件参数
+	StyleItem(ctx context.Context, in *v1.MaintainManualRequest, opts ...grpc.CallOption) (*v1.StyleItemReply, error)
+	// 获取c2列表
+	C2List(ctx context.Context, in *v1.C2ListRequest, opts ...grpc.CallOption) (*v1.C2ListReply, error)
+	// 修改配件参数信息
+	UpdateStyleItem(ctx context.Context, in *v1.UpdateStyleItemRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error)
+	// 删除维保信息
+	DeleteMaintainace(ctx context.Context, in *v1.DeleteMaintainaceRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error)
+	// 车型信息导出
+	ExportStyle(ctx context.Context, in *v1.ExportStyleRequest, opts ...grpc.CallOption) (*v1.ExportStyleReply, error)
+	// 车型导出列表
+	ExportStyleTaskList(ctx context.Context, in *v1.EmptyReply, opts ...grpc.CallOption) (*v1.ExportStyleTaskListReply, error)
+	// 删除车型导出列表
+	DeleteExportStyleTask(ctx context.Context, in *v1.DeleteExportStyleTaskRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error)
+	// 通用接口查询
+	Query(ctx context.Context, in *v1.QueryRequest, opts ...grpc.CallOption) (*v1.QueryResponse, error)
+	// 删除配件信息
+	DeleteStyleItem(ctx context.Context, in *v1.DeleteStyleItemRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error)
+	// 模板列表
+	TemplateList(ctx context.Context, in *v1.TemplateListRequest, opts ...grpc.CallOption) (*v1.TemplateListReply, error)
+	// 模板详情列表
+	TemplateDetailList(ctx context.Context, in *v1.TemplateDetailListRequest, opts ...grpc.CallOption) (*v1.TemplateDetailListReply, error)
+	// 模板详情
+	TemplateDetail(ctx context.Context, in *v1.TemplateDetailRequest, opts ...grpc.CallOption) (*v1.TemplateDetailReply, error)
+	// 增加模板
+	AddTemplateDetail(ctx context.Context, in *v1.AddTemplateDetailRequest, opts ...grpc.CallOption) (*v1.AddTemplateDetailReply, error)
+	// 修改模板
+	UpdateTemplateDetail(ctx context.Context, in *v1.UpdateMaintainManualRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error)
+	// 选择模板
+	ChooseTemplateDetail(ctx context.Context, in *v1.ChooseTemplateDetailRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error)
+	// 项目列表
+	TemplateItemList(ctx context.Context, in *v1.TemplateItemListRequest, opts ...grpc.CallOption) (*v1.ItemListReply, error)
+}
+
+type vehicleStyleClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewVehicleStyleClient(cc *grpc.ClientConn) VehicleStyleClient {
+	return &vehicleStyleClient{cc}
+}
+
+func (c *vehicleStyleClient) BrandList(ctx context.Context, in *v1.BrandListRequest, opts ...grpc.CallOption) (*v1.BrandListReply, error) {
+	out := new(v1.BrandListReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/BrandList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) Search(ctx context.Context, in *v1.SearchRequest, opts ...grpc.CallOption) (*v1.SearchReply, error) {
+	out := new(v1.SearchReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/Search", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) UpdateSYBrand(ctx context.Context, in *v1.UpdateSYBrandRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error) {
+	out := new(v1.EmptyReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/UpdateSYBrand", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) GetMaker(ctx context.Context, in *v1.GetMakerRequest, opts ...grpc.CallOption) (*v1.GetMakerReply, error) {
+	out := new(v1.GetMakerReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/GetMaker", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) UpdateMaker(ctx context.Context, in *v1.UpdateMakerRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error) {
+	out := new(v1.EmptyReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/UpdateMaker", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) SeriesList(ctx context.Context, in *v1.SeriesListRequest, opts ...grpc.CallOption) (*v1.SeriesListReply, error) {
+	out := new(v1.SeriesListReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/SeriesList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) UpdateSeries(ctx context.Context, in *v1.UpdateSeriesRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error) {
+	out := new(v1.EmptyReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/UpdateSeries", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) StyleList(ctx context.Context, in *v1.StyleListRequest, opts ...grpc.CallOption) (*v1.StyleListReply, error) {
+	out := new(v1.StyleListReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/StyleList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) UpdateStyle(ctx context.Context, in *v1.UpdateStyleRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error) {
+	out := new(v1.EmptyReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/UpdateStyle", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) StyleInfo(ctx context.Context, in *v1.StyleInfoRequest, opts ...grpc.CallOption) (*v1.StyleInfoReply, error) {
+	out := new(v1.StyleInfoReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/StyleInfo", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) UpdateStyleInfo(ctx context.Context, in *v1.UpdateStyleInfoRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error) {
+	out := new(v1.EmptyReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/UpdateStyleInfo", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) MaintainManual(ctx context.Context, in *v1.MaintainManualRequest, opts ...grpc.CallOption) (*v1.MaintainManualReply, error) {
+	out := new(v1.MaintainManualReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/MaintainManual", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) ItemList(ctx context.Context, in *v1.ItemListRequest, opts ...grpc.CallOption) (*v1.ItemListReply, error) {
+	out := new(v1.ItemListReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/ItemList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) UpdateMaintainManual(ctx context.Context, in *v1.UpdateMaintainManualRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error) {
+	out := new(v1.EmptyReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/UpdateMaintainManual", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) MaintainManualInfo(ctx context.Context, in *v1.MaintainManualInfoRequest, opts ...grpc.CallOption) (*v1.MaintainManualInfoReply, error) {
+	out := new(v1.MaintainManualInfoReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/MaintainManualInfo", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) StyleItem(ctx context.Context, in *v1.MaintainManualRequest, opts ...grpc.CallOption) (*v1.StyleItemReply, error) {
+	out := new(v1.StyleItemReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/StyleItem", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) C2List(ctx context.Context, in *v1.C2ListRequest, opts ...grpc.CallOption) (*v1.C2ListReply, error) {
+	out := new(v1.C2ListReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/C2List", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) UpdateStyleItem(ctx context.Context, in *v1.UpdateStyleItemRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error) {
+	out := new(v1.EmptyReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/UpdateStyleItem", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) DeleteMaintainace(ctx context.Context, in *v1.DeleteMaintainaceRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error) {
+	out := new(v1.EmptyReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/DeleteMaintainace", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) ExportStyle(ctx context.Context, in *v1.ExportStyleRequest, opts ...grpc.CallOption) (*v1.ExportStyleReply, error) {
+	out := new(v1.ExportStyleReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/ExportStyle", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) ExportStyleTaskList(ctx context.Context, in *v1.EmptyReply, opts ...grpc.CallOption) (*v1.ExportStyleTaskListReply, error) {
+	out := new(v1.ExportStyleTaskListReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/ExportStyleTaskList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) DeleteExportStyleTask(ctx context.Context, in *v1.DeleteExportStyleTaskRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error) {
+	out := new(v1.EmptyReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/DeleteExportStyleTask", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) Query(ctx context.Context, in *v1.QueryRequest, opts ...grpc.CallOption) (*v1.QueryResponse, error) {
+	out := new(v1.QueryResponse)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/Query", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) DeleteStyleItem(ctx context.Context, in *v1.DeleteStyleItemRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error) {
+	out := new(v1.EmptyReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/DeleteStyleItem", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) TemplateList(ctx context.Context, in *v1.TemplateListRequest, opts ...grpc.CallOption) (*v1.TemplateListReply, error) {
+	out := new(v1.TemplateListReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/TemplateList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) TemplateDetailList(ctx context.Context, in *v1.TemplateDetailListRequest, opts ...grpc.CallOption) (*v1.TemplateDetailListReply, error) {
+	out := new(v1.TemplateDetailListReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/TemplateDetailList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) TemplateDetail(ctx context.Context, in *v1.TemplateDetailRequest, opts ...grpc.CallOption) (*v1.TemplateDetailReply, error) {
+	out := new(v1.TemplateDetailReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/TemplateDetail", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) AddTemplateDetail(ctx context.Context, in *v1.AddTemplateDetailRequest, opts ...grpc.CallOption) (*v1.AddTemplateDetailReply, error) {
+	out := new(v1.AddTemplateDetailReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/AddTemplateDetail", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) UpdateTemplateDetail(ctx context.Context, in *v1.UpdateMaintainManualRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error) {
+	out := new(v1.EmptyReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/UpdateTemplateDetail", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) ChooseTemplateDetail(ctx context.Context, in *v1.ChooseTemplateDetailRequest, opts ...grpc.CallOption) (*v1.EmptyReply, error) {
+	out := new(v1.EmptyReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/ChooseTemplateDetail", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *vehicleStyleClient) TemplateItemList(ctx context.Context, in *v1.TemplateItemListRequest, opts ...grpc.CallOption) (*v1.ItemListReply, error) {
+	out := new(v1.ItemListReply)
+	err := c.cc.Invoke(ctx, "/pb.service.VehicleStyle/TemplateItemList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// VehicleStyleServer is the server API for VehicleStyle service.
+type VehicleStyleServer interface {
+	// 品牌列表
+	BrandList(context.Context, *v1.BrandListRequest) (*v1.BrandListReply, error)
+	// 模糊搜索
+	Search(context.Context, *v1.SearchRequest) (*v1.SearchReply, error)
+	// 更新品牌信息
+	UpdateSYBrand(context.Context, *v1.UpdateSYBrandRequest) (*v1.EmptyReply, error)
+	// 获取厂商列表
+	GetMaker(context.Context, *v1.GetMakerRequest) (*v1.GetMakerReply, error)
+	// 更新厂商
+	UpdateMaker(context.Context, *v1.UpdateMakerRequest) (*v1.EmptyReply, error)
+	// 车系列表
+	SeriesList(context.Context, *v1.SeriesListRequest) (*v1.SeriesListReply, error)
+	// 更新车系
+	UpdateSeries(context.Context, *v1.UpdateSeriesRequest) (*v1.EmptyReply, error)
+	// 车型列表
+	StyleList(context.Context, *v1.StyleListRequest) (*v1.StyleListReply, error)
+	// 更新车型
+	UpdateStyle(context.Context, *v1.UpdateStyleRequest) (*v1.EmptyReply, error)
+	// 获取车辆配置信息
+	StyleInfo(context.Context, *v1.StyleInfoRequest) (*v1.StyleInfoReply, error)
+	// 更新车辆配置信息
+	UpdateStyleInfo(context.Context, *v1.UpdateStyleInfoRequest) (*v1.EmptyReply, error)
+	// 维保手册
+	MaintainManual(context.Context, *v1.MaintainManualRequest) (*v1.MaintainManualReply, error)
+	// 项目列表
+	ItemList(context.Context, *v1.ItemListRequest) (*v1.ItemListReply, error)
+	// 更新维保手册
+	UpdateMaintainManual(context.Context, *v1.UpdateMaintainManualRequest) (*v1.EmptyReply, error)
+	// 维保详情
+	MaintainManualInfo(context.Context, *v1.MaintainManualInfoRequest) (*v1.MaintainManualInfoReply, error)
+	// 配件参数
+	StyleItem(context.Context, *v1.MaintainManualRequest) (*v1.StyleItemReply, error)
+	// 获取c2列表
+	C2List(context.Context, *v1.C2ListRequest) (*v1.C2ListReply, error)
+	// 修改配件参数信息
+	UpdateStyleItem(context.Context, *v1.UpdateStyleItemRequest) (*v1.EmptyReply, error)
+	// 删除维保信息
+	DeleteMaintainace(context.Context, *v1.DeleteMaintainaceRequest) (*v1.EmptyReply, error)
+	// 车型信息导出
+	ExportStyle(context.Context, *v1.ExportStyleRequest) (*v1.ExportStyleReply, error)
+	// 车型导出列表
+	ExportStyleTaskList(context.Context, *v1.EmptyReply) (*v1.ExportStyleTaskListReply, error)
+	// 删除车型导出列表
+	DeleteExportStyleTask(context.Context, *v1.DeleteExportStyleTaskRequest) (*v1.EmptyReply, error)
+	// 通用接口查询
+	Query(context.Context, *v1.QueryRequest) (*v1.QueryResponse, error)
+	// 删除配件信息
+	DeleteStyleItem(context.Context, *v1.DeleteStyleItemRequest) (*v1.EmptyReply, error)
+	// 模板列表
+	TemplateList(context.Context, *v1.TemplateListRequest) (*v1.TemplateListReply, error)
+	// 模板详情列表
+	TemplateDetailList(context.Context, *v1.TemplateDetailListRequest) (*v1.TemplateDetailListReply, error)
+	// 模板详情
+	TemplateDetail(context.Context, *v1.TemplateDetailRequest) (*v1.TemplateDetailReply, error)
+	// 增加模板
+	AddTemplateDetail(context.Context, *v1.AddTemplateDetailRequest) (*v1.AddTemplateDetailReply, error)
+	// 修改模板
+	UpdateTemplateDetail(context.Context, *v1.UpdateMaintainManualRequest) (*v1.EmptyReply, error)
+	// 选择模板
+	ChooseTemplateDetail(context.Context, *v1.ChooseTemplateDetailRequest) (*v1.EmptyReply, error)
+	// 项目列表
+	TemplateItemList(context.Context, *v1.TemplateItemListRequest) (*v1.ItemListReply, error)
+}
+
+// UnimplementedVehicleStyleServer can be embedded to have forward compatible implementations.
+type UnimplementedVehicleStyleServer struct {
+}
+
+func (*UnimplementedVehicleStyleServer) BrandList(ctx context.Context, req *v1.BrandListRequest) (*v1.BrandListReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method BrandList not implemented")
+}
+func (*UnimplementedVehicleStyleServer) Search(ctx context.Context, req *v1.SearchRequest) (*v1.SearchReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Search not implemented")
+}
+func (*UnimplementedVehicleStyleServer) UpdateSYBrand(ctx context.Context, req *v1.UpdateSYBrandRequest) (*v1.EmptyReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateSYBrand not implemented")
+}
+func (*UnimplementedVehicleStyleServer) GetMaker(ctx context.Context, req *v1.GetMakerRequest) (*v1.GetMakerReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetMaker not implemented")
+}
+func (*UnimplementedVehicleStyleServer) UpdateMaker(ctx context.Context, req *v1.UpdateMakerRequest) (*v1.EmptyReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateMaker not implemented")
+}
+func (*UnimplementedVehicleStyleServer) SeriesList(ctx context.Context, req *v1.SeriesListRequest) (*v1.SeriesListReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SeriesList not implemented")
+}
+func (*UnimplementedVehicleStyleServer) UpdateSeries(ctx context.Context, req *v1.UpdateSeriesRequest) (*v1.EmptyReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateSeries not implemented")
+}
+func (*UnimplementedVehicleStyleServer) StyleList(ctx context.Context, req *v1.StyleListRequest) (*v1.StyleListReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method StyleList not implemented")
+}
+func (*UnimplementedVehicleStyleServer) UpdateStyle(ctx context.Context, req *v1.UpdateStyleRequest) (*v1.EmptyReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateStyle not implemented")
+}
+func (*UnimplementedVehicleStyleServer) StyleInfo(ctx context.Context, req *v1.StyleInfoRequest) (*v1.StyleInfoReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method StyleInfo not implemented")
+}
+func (*UnimplementedVehicleStyleServer) UpdateStyleInfo(ctx context.Context, req *v1.UpdateStyleInfoRequest) (*v1.EmptyReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateStyleInfo not implemented")
+}
+func (*UnimplementedVehicleStyleServer) MaintainManual(ctx context.Context, req *v1.MaintainManualRequest) (*v1.MaintainManualReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MaintainManual not implemented")
+}
+func (*UnimplementedVehicleStyleServer) ItemList(ctx context.Context, req *v1.ItemListRequest) (*v1.ItemListReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ItemList not implemented")
+}
+func (*UnimplementedVehicleStyleServer) UpdateMaintainManual(ctx context.Context, req *v1.UpdateMaintainManualRequest) (*v1.EmptyReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateMaintainManual not implemented")
+}
+func (*UnimplementedVehicleStyleServer) MaintainManualInfo(ctx context.Context, req *v1.MaintainManualInfoRequest) (*v1.MaintainManualInfoReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MaintainManualInfo not implemented")
+}
+func (*UnimplementedVehicleStyleServer) StyleItem(ctx context.Context, req *v1.MaintainManualRequest) (*v1.StyleItemReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method StyleItem not implemented")
+}
+func (*UnimplementedVehicleStyleServer) C2List(ctx context.Context, req *v1.C2ListRequest) (*v1.C2ListReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method C2List not implemented")
+}
+func (*UnimplementedVehicleStyleServer) UpdateStyleItem(ctx context.Context, req *v1.UpdateStyleItemRequest) (*v1.EmptyReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateStyleItem not implemented")
+}
+func (*UnimplementedVehicleStyleServer) DeleteMaintainace(ctx context.Context, req *v1.DeleteMaintainaceRequest) (*v1.EmptyReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeleteMaintainace not implemented")
+}
+func (*UnimplementedVehicleStyleServer) ExportStyle(ctx context.Context, req *v1.ExportStyleRequest) (*v1.ExportStyleReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ExportStyle not implemented")
+}
+func (*UnimplementedVehicleStyleServer) ExportStyleTaskList(ctx context.Context, req *v1.EmptyReply) (*v1.ExportStyleTaskListReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ExportStyleTaskList not implemented")
+}
+func (*UnimplementedVehicleStyleServer) DeleteExportStyleTask(ctx context.Context, req *v1.DeleteExportStyleTaskRequest) (*v1.EmptyReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeleteExportStyleTask not implemented")
+}
+func (*UnimplementedVehicleStyleServer) Query(ctx context.Context, req *v1.QueryRequest) (*v1.QueryResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Query not implemented")
+}
+func (*UnimplementedVehicleStyleServer) DeleteStyleItem(ctx context.Context, req *v1.DeleteStyleItemRequest) (*v1.EmptyReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeleteStyleItem not implemented")
+}
+func (*UnimplementedVehicleStyleServer) TemplateList(ctx context.Context, req *v1.TemplateListRequest) (*v1.TemplateListReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method TemplateList not implemented")
+}
+func (*UnimplementedVehicleStyleServer) TemplateDetailList(ctx context.Context, req *v1.TemplateDetailListRequest) (*v1.TemplateDetailListReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method TemplateDetailList not implemented")
+}
+func (*UnimplementedVehicleStyleServer) TemplateDetail(ctx context.Context, req *v1.TemplateDetailRequest) (*v1.TemplateDetailReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method TemplateDetail not implemented")
+}
+func (*UnimplementedVehicleStyleServer) AddTemplateDetail(ctx context.Context, req *v1.AddTemplateDetailRequest) (*v1.AddTemplateDetailReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method AddTemplateDetail not implemented")
+}
+func (*UnimplementedVehicleStyleServer) UpdateTemplateDetail(ctx context.Context, req *v1.UpdateMaintainManualRequest) (*v1.EmptyReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateTemplateDetail not implemented")
+}
+func (*UnimplementedVehicleStyleServer) ChooseTemplateDetail(ctx context.Context, req *v1.ChooseTemplateDetailRequest) (*v1.EmptyReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ChooseTemplateDetail not implemented")
+}
+func (*UnimplementedVehicleStyleServer) TemplateItemList(ctx context.Context, req *v1.TemplateItemListRequest) (*v1.ItemListReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method TemplateItemList not implemented")
+}
+
+func RegisterVehicleStyleServer(s *grpc.Server, srv VehicleStyleServer) {
+	s.RegisterService(&_VehicleStyle_serviceDesc, srv)
+}
+
+func _VehicleStyle_BrandList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.BrandListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).BrandList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/BrandList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).BrandList(ctx, req.(*v1.BrandListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_Search_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.SearchRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).Search(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/Search",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).Search(ctx, req.(*v1.SearchRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_UpdateSYBrand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.UpdateSYBrandRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).UpdateSYBrand(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/UpdateSYBrand",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).UpdateSYBrand(ctx, req.(*v1.UpdateSYBrandRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_GetMaker_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.GetMakerRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).GetMaker(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/GetMaker",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).GetMaker(ctx, req.(*v1.GetMakerRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_UpdateMaker_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.UpdateMakerRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).UpdateMaker(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/UpdateMaker",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).UpdateMaker(ctx, req.(*v1.UpdateMakerRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_SeriesList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.SeriesListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).SeriesList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/SeriesList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).SeriesList(ctx, req.(*v1.SeriesListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_UpdateSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.UpdateSeriesRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).UpdateSeries(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/UpdateSeries",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).UpdateSeries(ctx, req.(*v1.UpdateSeriesRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_StyleList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.StyleListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).StyleList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/StyleList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).StyleList(ctx, req.(*v1.StyleListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_UpdateStyle_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.UpdateStyleRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).UpdateStyle(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/UpdateStyle",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).UpdateStyle(ctx, req.(*v1.UpdateStyleRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_StyleInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.StyleInfoRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).StyleInfo(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/StyleInfo",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).StyleInfo(ctx, req.(*v1.StyleInfoRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_UpdateStyleInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.UpdateStyleInfoRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).UpdateStyleInfo(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/UpdateStyleInfo",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).UpdateStyleInfo(ctx, req.(*v1.UpdateStyleInfoRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_MaintainManual_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.MaintainManualRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).MaintainManual(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/MaintainManual",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).MaintainManual(ctx, req.(*v1.MaintainManualRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_ItemList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.ItemListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).ItemList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/ItemList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).ItemList(ctx, req.(*v1.ItemListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_UpdateMaintainManual_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.UpdateMaintainManualRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).UpdateMaintainManual(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/UpdateMaintainManual",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).UpdateMaintainManual(ctx, req.(*v1.UpdateMaintainManualRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_MaintainManualInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.MaintainManualInfoRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).MaintainManualInfo(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/MaintainManualInfo",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).MaintainManualInfo(ctx, req.(*v1.MaintainManualInfoRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_StyleItem_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.MaintainManualRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).StyleItem(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/StyleItem",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).StyleItem(ctx, req.(*v1.MaintainManualRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_C2List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.C2ListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).C2List(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/C2List",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).C2List(ctx, req.(*v1.C2ListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_UpdateStyleItem_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.UpdateStyleItemRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).UpdateStyleItem(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/UpdateStyleItem",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).UpdateStyleItem(ctx, req.(*v1.UpdateStyleItemRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_DeleteMaintainace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.DeleteMaintainaceRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).DeleteMaintainace(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/DeleteMaintainace",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).DeleteMaintainace(ctx, req.(*v1.DeleteMaintainaceRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_ExportStyle_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.ExportStyleRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).ExportStyle(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/ExportStyle",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).ExportStyle(ctx, req.(*v1.ExportStyleRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_ExportStyleTaskList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.EmptyReply)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).ExportStyleTaskList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/ExportStyleTaskList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).ExportStyleTaskList(ctx, req.(*v1.EmptyReply))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_DeleteExportStyleTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.DeleteExportStyleTaskRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).DeleteExportStyleTask(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/DeleteExportStyleTask",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).DeleteExportStyleTask(ctx, req.(*v1.DeleteExportStyleTaskRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_Query_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.QueryRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).Query(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/Query",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).Query(ctx, req.(*v1.QueryRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_DeleteStyleItem_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.DeleteStyleItemRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).DeleteStyleItem(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/DeleteStyleItem",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).DeleteStyleItem(ctx, req.(*v1.DeleteStyleItemRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_TemplateList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.TemplateListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).TemplateList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/TemplateList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).TemplateList(ctx, req.(*v1.TemplateListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_TemplateDetailList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.TemplateDetailListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).TemplateDetailList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/TemplateDetailList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).TemplateDetailList(ctx, req.(*v1.TemplateDetailListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_TemplateDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.TemplateDetailRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).TemplateDetail(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/TemplateDetail",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).TemplateDetail(ctx, req.(*v1.TemplateDetailRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_AddTemplateDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.AddTemplateDetailRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).AddTemplateDetail(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/AddTemplateDetail",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).AddTemplateDetail(ctx, req.(*v1.AddTemplateDetailRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_UpdateTemplateDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.UpdateMaintainManualRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).UpdateTemplateDetail(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/UpdateTemplateDetail",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).UpdateTemplateDetail(ctx, req.(*v1.UpdateMaintainManualRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_ChooseTemplateDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.ChooseTemplateDetailRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).ChooseTemplateDetail(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/ChooseTemplateDetail",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).ChooseTemplateDetail(ctx, req.(*v1.ChooseTemplateDetailRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _VehicleStyle_TemplateItemList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(v1.TemplateItemListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VehicleStyleServer).TemplateItemList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.service.VehicleStyle/TemplateItemList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VehicleStyleServer).TemplateItemList(ctx, req.(*v1.TemplateItemListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _VehicleStyle_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "pb.service.VehicleStyle",
+	HandlerType: (*VehicleStyleServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "BrandList",
+			Handler:    _VehicleStyle_BrandList_Handler,
+		},
+		{
+			MethodName: "Search",
+			Handler:    _VehicleStyle_Search_Handler,
+		},
+		{
+			MethodName: "UpdateSYBrand",
+			Handler:    _VehicleStyle_UpdateSYBrand_Handler,
+		},
+		{
+			MethodName: "GetMaker",
+			Handler:    _VehicleStyle_GetMaker_Handler,
+		},
+		{
+			MethodName: "UpdateMaker",
+			Handler:    _VehicleStyle_UpdateMaker_Handler,
+		},
+		{
+			MethodName: "SeriesList",
+			Handler:    _VehicleStyle_SeriesList_Handler,
+		},
+		{
+			MethodName: "UpdateSeries",
+			Handler:    _VehicleStyle_UpdateSeries_Handler,
+		},
+		{
+			MethodName: "StyleList",
+			Handler:    _VehicleStyle_StyleList_Handler,
+		},
+		{
+			MethodName: "UpdateStyle",
+			Handler:    _VehicleStyle_UpdateStyle_Handler,
+		},
+		{
+			MethodName: "StyleInfo",
+			Handler:    _VehicleStyle_StyleInfo_Handler,
+		},
+		{
+			MethodName: "UpdateStyleInfo",
+			Handler:    _VehicleStyle_UpdateStyleInfo_Handler,
+		},
+		{
+			MethodName: "MaintainManual",
+			Handler:    _VehicleStyle_MaintainManual_Handler,
+		},
+		{
+			MethodName: "ItemList",
+			Handler:    _VehicleStyle_ItemList_Handler,
+		},
+		{
+			MethodName: "UpdateMaintainManual",
+			Handler:    _VehicleStyle_UpdateMaintainManual_Handler,
+		},
+		{
+			MethodName: "MaintainManualInfo",
+			Handler:    _VehicleStyle_MaintainManualInfo_Handler,
+		},
+		{
+			MethodName: "StyleItem",
+			Handler:    _VehicleStyle_StyleItem_Handler,
+		},
+		{
+			MethodName: "C2List",
+			Handler:    _VehicleStyle_C2List_Handler,
+		},
+		{
+			MethodName: "UpdateStyleItem",
+			Handler:    _VehicleStyle_UpdateStyleItem_Handler,
+		},
+		{
+			MethodName: "DeleteMaintainace",
+			Handler:    _VehicleStyle_DeleteMaintainace_Handler,
+		},
+		{
+			MethodName: "ExportStyle",
+			Handler:    _VehicleStyle_ExportStyle_Handler,
+		},
+		{
+			MethodName: "ExportStyleTaskList",
+			Handler:    _VehicleStyle_ExportStyleTaskList_Handler,
+		},
+		{
+			MethodName: "DeleteExportStyleTask",
+			Handler:    _VehicleStyle_DeleteExportStyleTask_Handler,
+		},
+		{
+			MethodName: "Query",
+			Handler:    _VehicleStyle_Query_Handler,
+		},
+		{
+			MethodName: "DeleteStyleItem",
+			Handler:    _VehicleStyle_DeleteStyleItem_Handler,
+		},
+		{
+			MethodName: "TemplateList",
+			Handler:    _VehicleStyle_TemplateList_Handler,
+		},
+		{
+			MethodName: "TemplateDetailList",
+			Handler:    _VehicleStyle_TemplateDetailList_Handler,
+		},
+		{
+			MethodName: "TemplateDetail",
+			Handler:    _VehicleStyle_TemplateDetail_Handler,
+		},
+		{
+			MethodName: "AddTemplateDetail",
+			Handler:    _VehicleStyle_AddTemplateDetail_Handler,
+		},
+		{
+			MethodName: "UpdateTemplateDetail",
+			Handler:    _VehicleStyle_UpdateTemplateDetail_Handler,
+		},
+		{
+			MethodName: "ChooseTemplateDetail",
+			Handler:    _VehicleStyle_ChooseTemplateDetail_Handler,
+		},
+		{
+			MethodName: "TemplateItemList",
+			Handler:    _VehicleStyle_TemplateItemList_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "adm_vehicle_style.proto",
+}

+ 74 - 0
pb/adm_vehicle_style.proto

@@ -0,0 +1,74 @@
+syntax = "proto3";
+
+import "v1/vehicle_style.proto";
+import "v1/data.proto";
+
+// package声明符,用来防止不同的消息类型有命名冲突
+package pb.service;
+// 用于生成指定语言go的包名称
+option go_package = "adm-vehicle-style/pb";
+
+service VehicleStyle {
+    // 品牌列表
+    rpc BrandList (v1.BrandListRequest) returns (v1.BrandListReply) {}
+    // 模糊搜索
+    rpc Search (v1.SearchRequest) returns (v1.SearchReply) {}
+    // 更新品牌信息
+    rpc UpdateSYBrand (v1.UpdateSYBrandRequest) returns (v1.EmptyReply) {}
+    // 获取厂商列表
+    rpc GetMaker (v1.GetMakerRequest) returns (v1.GetMakerReply) {}
+    // 更新厂商
+    rpc UpdateMaker (v1.UpdateMakerRequest) returns (v1.EmptyReply) {}
+    // 车系列表
+    rpc SeriesList (v1.SeriesListRequest) returns (v1.SeriesListReply) {}
+    // 更新车系
+    rpc UpdateSeries (v1.UpdateSeriesRequest) returns (v1.EmptyReply) {}
+    // 车型列表
+    rpc StyleList (v1.StyleListRequest) returns (v1.StyleListReply) {}
+    // 更新车型
+    rpc UpdateStyle (v1.UpdateStyleRequest) returns (v1.EmptyReply) {}
+    // 获取车辆配置信息
+    rpc StyleInfo (v1.StyleInfoRequest) returns (v1.StyleInfoReply) {}
+    // 更新车辆配置信息
+    rpc UpdateStyleInfo (v1.UpdateStyleInfoRequest) returns (v1.EmptyReply) {}
+    // 维保手册
+    rpc MaintainManual(v1.MaintainManualRequest) returns (v1.MaintainManualReply){}
+    // 项目列表
+	rpc ItemList(v1.ItemListRequest) returns (v1.ItemListReply){}
+	// 更新维保手册
+	rpc UpdateMaintainManual(v1.UpdateMaintainManualRequest) returns (v1.EmptyReply) {}
+	// 维保详情
+	rpc MaintainManualInfo (v1.MaintainManualInfoRequest) returns (v1.MaintainManualInfoReply) {}
+	// 配件参数
+	rpc StyleItem (v1.MaintainManualRequest) returns (v1.StyleItemReply) {}
+	// 获取c2列表
+	rpc C2List(v1.C2ListRequest) returns (v1.C2ListReply) {}
+	// 修改配件参数信息
+	rpc UpdateStyleItem(v1.UpdateStyleItemRequest) returns (v1.EmptyReply) {}
+	// 删除维保信息
+	rpc DeleteMaintainace(v1.DeleteMaintainaceRequest) returns (v1.EmptyReply) {}
+	// 车型信息导出
+	rpc ExportStyle(v1.ExportStyleRequest) returns (v1.ExportStyleReply) {}
+	// 车型导出列表
+	rpc ExportStyleTaskList (v1.EmptyReply) returns (v1.ExportStyleTaskListReply) {}
+	// 删除车型导出列表
+	rpc DeleteExportStyleTask (v1.DeleteExportStyleTaskRequest) returns (v1.EmptyReply) {}
+	// 通用接口查询
+	rpc Query(v1.QueryRequest) returns (v1.QueryResponse) {}
+	// 删除配件信息
+	rpc DeleteStyleItem(v1.DeleteStyleItemRequest) returns (v1.EmptyReply) {}
+	// 模板列表
+	rpc TemplateList(v1.TemplateListRequest) returns (v1.TemplateListReply) {}
+	// 模板详情列表
+	rpc TemplateDetailList(v1.TemplateDetailListRequest) returns (v1.TemplateDetailListReply) {}
+	// 模板详情
+	rpc TemplateDetail(v1.TemplateDetailRequest) returns (v1.TemplateDetailReply) {}
+	// 增加模板
+	rpc AddTemplateDetail(v1.AddTemplateDetailRequest) returns (v1.AddTemplateDetailReply) {}
+	// 修改模板
+	rpc UpdateTemplateDetail(v1.UpdateMaintainManualRequest) returns (v1.EmptyReply) {}
+	// 选择模板
+	rpc ChooseTemplateDetail(v1.ChooseTemplateDetailRequest) returns (v1.EmptyReply) {}
+    // 项目列表
+	rpc TemplateItemList(v1.TemplateItemListRequest) returns (v1.ItemListReply){}
+}

+ 56 - 0
pb/setup.go

@@ -0,0 +1,56 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package pb
+
+import (
+	"adm-vehicle-style/etcd"
+	"adm-vehicle-style/parser"
+	fmt "fmt"
+	"time"
+
+	"go.etcd.io/etcd/client/v3/naming/resolver"
+
+	grpc "google.golang.org/grpc"
+	"google.golang.org/grpc/keepalive"
+)
+
+// 客户端集合
+var Data DataClient
+
+func setupDataClient(kacp keepalive.ClientParameters, conns []*grpc.ClientConn) {
+	// 根据是否为k8s来组装targets
+	serviceName := parser.Conf.Rpc.ADMData.ServiceName
+	builder, err := resolver.NewBuilder(etcd.Get())
+	if err != nil {
+		panic(err)
+	}
+	// 发起一个连接并记录连接conn,后期释放
+	if conn, err := grpc.Dial("etcd:///"+parser.Conf.Rpc.Prefix+"/"+serviceName,
+		grpc.WithResolvers(builder),
+		grpc.WithBalancerName("round_robin"),
+		grpc.WithInsecure(), grpc.WithKeepaliveParams(kacp)); err == nil {
+		Data = NewDataClient(conn)
+		conns = append(conns, conn)
+	} else {
+		fmt.Println("[rpc] dial cabinet conn err", err)
+	}
+
+	return
+}
+
+// SetupClients 创建客户端
+func SetupClients() (conns []*grpc.ClientConn) {
+	// 客户端配置参数
+	kacp := keepalive.ClientParameters{
+		// send pings every n seconds if there is no activity
+		Time: time.Duration(parser.Conf.Rpc.Keepalive.ClientTime) * time.Second,
+		// wait n second for ping ack before considering the connection dead
+		Timeout: time.Duration(parser.Conf.Rpc.Keepalive.ClientTimeout) * time.Second,
+		// send pings even without active streams
+		PermitWithoutStream: true,
+	}
+
+	setupDataClient(kacp, conns)
+	return
+}

+ 131 - 0
pb/v1/data.pb.go

@@ -0,0 +1,131 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: data.proto
+
+// package声明符,用来防止不同的消息类型有命名冲突
+
+package v1
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type QueryRequest struct {
+	Code                 string   `protobuf:"bytes,1,opt,name=code,proto3" json:"code"`
+	Params               string   `protobuf:"bytes,2,opt,name=params,proto3" json:"params"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *QueryRequest) Reset()         { *m = QueryRequest{} }
+func (m *QueryRequest) String() string { return proto.CompactTextString(m) }
+func (*QueryRequest) ProtoMessage()    {}
+func (*QueryRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_871986018790d2fd, []int{0}
+}
+
+func (m *QueryRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_QueryRequest.Unmarshal(m, b)
+}
+func (m *QueryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_QueryRequest.Marshal(b, m, deterministic)
+}
+func (m *QueryRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_QueryRequest.Merge(m, src)
+}
+func (m *QueryRequest) XXX_Size() int {
+	return xxx_messageInfo_QueryRequest.Size(m)
+}
+func (m *QueryRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_QueryRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_QueryRequest proto.InternalMessageInfo
+
+func (m *QueryRequest) GetCode() string {
+	if m != nil {
+		return m.Code
+	}
+	return ""
+}
+
+func (m *QueryRequest) GetParams() string {
+	if m != nil {
+		return m.Params
+	}
+	return ""
+}
+
+type QueryResponse struct {
+	Data                 string   `protobuf:"bytes,1,opt,name=data,proto3" json:"data"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *QueryResponse) Reset()         { *m = QueryResponse{} }
+func (m *QueryResponse) String() string { return proto.CompactTextString(m) }
+func (*QueryResponse) ProtoMessage()    {}
+func (*QueryResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_871986018790d2fd, []int{1}
+}
+
+func (m *QueryResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_QueryResponse.Unmarshal(m, b)
+}
+func (m *QueryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_QueryResponse.Marshal(b, m, deterministic)
+}
+func (m *QueryResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_QueryResponse.Merge(m, src)
+}
+func (m *QueryResponse) XXX_Size() int {
+	return xxx_messageInfo_QueryResponse.Size(m)
+}
+func (m *QueryResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_QueryResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_QueryResponse proto.InternalMessageInfo
+
+func (m *QueryResponse) GetData() string {
+	if m != nil {
+		return m.Data
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*QueryRequest)(nil), "v1.QueryRequest")
+	proto.RegisterType((*QueryResponse)(nil), "v1.QueryResponse")
+}
+
+func init() {
+	proto.RegisterFile("data.proto", fileDescriptor_871986018790d2fd)
+}
+
+var fileDescriptor_871986018790d2fd = []byte{
+	// 141 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4a, 0x49, 0x2c, 0x49,
+	0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x2a, 0x33, 0x54, 0xb2, 0xe2, 0xe2, 0x09, 0x2c,
+	0x4d, 0x2d, 0xaa, 0x0c, 0x4a, 0x2d, 0x2c, 0x4d, 0x2d, 0x2e, 0x11, 0x12, 0xe2, 0x62, 0x49, 0xce,
+	0x4f, 0x49, 0x95, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x02, 0xb3, 0x85, 0xc4, 0xb8, 0xd8, 0x0a,
+	0x12, 0x8b, 0x12, 0x73, 0x8b, 0x25, 0x98, 0xc0, 0xa2, 0x50, 0x9e, 0x92, 0x32, 0x17, 0x2f, 0x54,
+	0x6f, 0x71, 0x41, 0x7e, 0x5e, 0x71, 0x2a, 0x48, 0x33, 0xc8, 0x78, 0x98, 0x66, 0x10, 0xdb, 0x49,
+	0x32, 0x4a, 0x3c, 0x31, 0x25, 0x57, 0xb7, 0x2c, 0x35, 0x23, 0x33, 0x39, 0x27, 0x55, 0xb7, 0xb8,
+	0xa4, 0x32, 0x27, 0x55, 0xbf, 0x20, 0x49, 0xbf, 0xcc, 0x30, 0x89, 0x0d, 0xec, 0x0c, 0x63, 0x40,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0xd3, 0x97, 0xe4, 0x16, 0x94, 0x00, 0x00, 0x00,
+}

+ 16 - 0
pb/v1/data.proto

@@ -0,0 +1,16 @@
+syntax = "proto3";
+
+// package声明符,用来防止不同的消息类型有命名冲突
+package v1;
+// 用于生成指定语言go的包名称
+option go_package = "adm-vehicle-style/pb/v1";
+
+
+message QueryRequest {
+	string code = 1;
+	string params = 2;
+}
+
+message QueryResponse {
+	string data = 1;
+}

+ 7302 - 0
pb/v1/vehicle_style.pb.go

@@ -0,0 +1,7302 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: vehicle_style.proto
+
+// package声明符,用来防止不同的消息类型有命名冲突
+
+package v1
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type BrandListRequest struct {
+	// 品牌名
+	BrandName string `protobuf:"bytes,1,opt,name=brand_name,json=brandName,proto3" json:"brand_name"`
+	// 首字母
+	Initial string `protobuf:"bytes,2,opt,name=initial,proto3" json:"initial"`
+	// 是否有图片 -1 1
+	HasImg int32 `protobuf:"varint,3,opt,name=has_img,json=hasImg,proto3" json:"has_img"`
+	// 状态 -1 1
+	Status int32 `protobuf:"varint,4,opt,name=status,proto3" json:"status"`
+	// 分页
+	PageSize             int32    `protobuf:"varint,5,opt,name=page_size,json=pageSize,proto3" json:"page_size"`
+	Page                 int32    `protobuf:"varint,6,opt,name=page,proto3" json:"page"`
+	BrandId              string   `protobuf:"bytes,7,opt,name=brand_id,json=brandId,proto3" json:"brand_id"`
+	OldBrandName         string   `protobuf:"bytes,8,opt,name=old_brand_name,json=oldBrandName,proto3" json:"old_brand_name"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BrandListRequest) Reset()         { *m = BrandListRequest{} }
+func (m *BrandListRequest) String() string { return proto.CompactTextString(m) }
+func (*BrandListRequest) ProtoMessage()    {}
+func (*BrandListRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{0}
+}
+
+func (m *BrandListRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BrandListRequest.Unmarshal(m, b)
+}
+func (m *BrandListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BrandListRequest.Marshal(b, m, deterministic)
+}
+func (m *BrandListRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BrandListRequest.Merge(m, src)
+}
+func (m *BrandListRequest) XXX_Size() int {
+	return xxx_messageInfo_BrandListRequest.Size(m)
+}
+func (m *BrandListRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_BrandListRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BrandListRequest proto.InternalMessageInfo
+
+func (m *BrandListRequest) GetBrandName() string {
+	if m != nil {
+		return m.BrandName
+	}
+	return ""
+}
+
+func (m *BrandListRequest) GetInitial() string {
+	if m != nil {
+		return m.Initial
+	}
+	return ""
+}
+
+func (m *BrandListRequest) GetHasImg() int32 {
+	if m != nil {
+		return m.HasImg
+	}
+	return 0
+}
+
+func (m *BrandListRequest) GetStatus() int32 {
+	if m != nil {
+		return m.Status
+	}
+	return 0
+}
+
+func (m *BrandListRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+func (m *BrandListRequest) GetPage() int32 {
+	if m != nil {
+		return m.Page
+	}
+	return 0
+}
+
+func (m *BrandListRequest) GetBrandId() string {
+	if m != nil {
+		return m.BrandId
+	}
+	return ""
+}
+
+func (m *BrandListRequest) GetOldBrandName() string {
+	if m != nil {
+		return m.OldBrandName
+	}
+	return ""
+}
+
+type BrandList struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	Initial              string   `protobuf:"bytes,2,opt,name=initial,proto3" json:"initial"`
+	BrandName            string   `protobuf:"bytes,3,opt,name=brand_name,json=brandName,proto3" json:"brand_name"`
+	BrandId              string   `protobuf:"bytes,4,opt,name=brand_id,json=brandId,proto3" json:"brand_id"`
+	Weight               int64    `protobuf:"varint,5,opt,name=weight,proto3" json:"weight"`
+	HasImg               int64    `protobuf:"varint,6,opt,name=has_img,json=hasImg,proto3" json:"has_img"`
+	Status               int64    `protobuf:"varint,7,opt,name=status,proto3" json:"status"`
+	Image                string   `protobuf:"bytes,8,opt,name=image,proto3" json:"image"`
+	OldBrandName         string   `protobuf:"bytes,9,opt,name=old_brand_name,json=oldBrandName,proto3" json:"old_brand_name"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BrandList) Reset()         { *m = BrandList{} }
+func (m *BrandList) String() string { return proto.CompactTextString(m) }
+func (*BrandList) ProtoMessage()    {}
+func (*BrandList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{1}
+}
+
+func (m *BrandList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BrandList.Unmarshal(m, b)
+}
+func (m *BrandList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BrandList.Marshal(b, m, deterministic)
+}
+func (m *BrandList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BrandList.Merge(m, src)
+}
+func (m *BrandList) XXX_Size() int {
+	return xxx_messageInfo_BrandList.Size(m)
+}
+func (m *BrandList) XXX_DiscardUnknown() {
+	xxx_messageInfo_BrandList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BrandList proto.InternalMessageInfo
+
+func (m *BrandList) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *BrandList) GetInitial() string {
+	if m != nil {
+		return m.Initial
+	}
+	return ""
+}
+
+func (m *BrandList) GetBrandName() string {
+	if m != nil {
+		return m.BrandName
+	}
+	return ""
+}
+
+func (m *BrandList) GetBrandId() string {
+	if m != nil {
+		return m.BrandId
+	}
+	return ""
+}
+
+func (m *BrandList) GetWeight() int64 {
+	if m != nil {
+		return m.Weight
+	}
+	return 0
+}
+
+func (m *BrandList) GetHasImg() int64 {
+	if m != nil {
+		return m.HasImg
+	}
+	return 0
+}
+
+func (m *BrandList) GetStatus() int64 {
+	if m != nil {
+		return m.Status
+	}
+	return 0
+}
+
+func (m *BrandList) GetImage() string {
+	if m != nil {
+		return m.Image
+	}
+	return ""
+}
+
+func (m *BrandList) GetOldBrandName() string {
+	if m != nil {
+		return m.OldBrandName
+	}
+	return ""
+}
+
+type BrandListReply struct {
+	CurrentPage          int64        `protobuf:"varint,1,opt,name=current_page,json=currentPage,proto3" json:"current_page"`
+	PerPage              int64        `protobuf:"varint,2,opt,name=per_page,json=perPage,proto3" json:"per_page"`
+	Total                int64        `protobuf:"varint,3,opt,name=total,proto3" json:"total"`
+	FirstPage            int64        `protobuf:"varint,4,opt,name=first_page,json=firstPage,proto3" json:"first_page"`
+	LastPage             int64        `protobuf:"varint,5,opt,name=last_page,json=lastPage,proto3" json:"last_page"`
+	PrevPage             int64        `protobuf:"varint,6,opt,name=prev_page,json=prevPage,proto3" json:"prev_page"`
+	NextPage             int64        `protobuf:"varint,7,opt,name=next_page,json=nextPage,proto3" json:"next_page"`
+	List                 []*BrandList `protobuf:"bytes,8,rep,name=list,proto3" json:"list"`
+	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
+	XXX_unrecognized     []byte       `json:"-"`
+	XXX_sizecache        int32        `json:"-"`
+}
+
+func (m *BrandListReply) Reset()         { *m = BrandListReply{} }
+func (m *BrandListReply) String() string { return proto.CompactTextString(m) }
+func (*BrandListReply) ProtoMessage()    {}
+func (*BrandListReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{2}
+}
+
+func (m *BrandListReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BrandListReply.Unmarshal(m, b)
+}
+func (m *BrandListReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BrandListReply.Marshal(b, m, deterministic)
+}
+func (m *BrandListReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BrandListReply.Merge(m, src)
+}
+func (m *BrandListReply) XXX_Size() int {
+	return xxx_messageInfo_BrandListReply.Size(m)
+}
+func (m *BrandListReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_BrandListReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BrandListReply proto.InternalMessageInfo
+
+func (m *BrandListReply) GetCurrentPage() int64 {
+	if m != nil {
+		return m.CurrentPage
+	}
+	return 0
+}
+
+func (m *BrandListReply) GetPerPage() int64 {
+	if m != nil {
+		return m.PerPage
+	}
+	return 0
+}
+
+func (m *BrandListReply) GetTotal() int64 {
+	if m != nil {
+		return m.Total
+	}
+	return 0
+}
+
+func (m *BrandListReply) GetFirstPage() int64 {
+	if m != nil {
+		return m.FirstPage
+	}
+	return 0
+}
+
+func (m *BrandListReply) GetLastPage() int64 {
+	if m != nil {
+		return m.LastPage
+	}
+	return 0
+}
+
+func (m *BrandListReply) GetPrevPage() int64 {
+	if m != nil {
+		return m.PrevPage
+	}
+	return 0
+}
+
+func (m *BrandListReply) GetNextPage() int64 {
+	if m != nil {
+		return m.NextPage
+	}
+	return 0
+}
+
+func (m *BrandListReply) GetList() []*BrandList {
+	if m != nil {
+		return m.List
+	}
+	return nil
+}
+
+type SearchRequest struct {
+	// 1 品牌
+	Type                 int32    `protobuf:"varint,1,opt,name=type,proto3" json:"type"`
+	Search               string   `protobuf:"bytes,2,opt,name=search,proto3" json:"search"`
+	BrandId              string   `protobuf:"bytes,3,opt,name=brand_id,json=brandId,proto3" json:"brand_id"`
+	MakerId              string   `protobuf:"bytes,4,opt,name=maker_id,json=makerId,proto3" json:"maker_id"`
+	SeriesId             string   `protobuf:"bytes,5,opt,name=series_id,json=seriesId,proto3" json:"series_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SearchRequest) Reset()         { *m = SearchRequest{} }
+func (m *SearchRequest) String() string { return proto.CompactTextString(m) }
+func (*SearchRequest) ProtoMessage()    {}
+func (*SearchRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{3}
+}
+
+func (m *SearchRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SearchRequest.Unmarshal(m, b)
+}
+func (m *SearchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SearchRequest.Marshal(b, m, deterministic)
+}
+func (m *SearchRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SearchRequest.Merge(m, src)
+}
+func (m *SearchRequest) XXX_Size() int {
+	return xxx_messageInfo_SearchRequest.Size(m)
+}
+func (m *SearchRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_SearchRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SearchRequest proto.InternalMessageInfo
+
+func (m *SearchRequest) GetType() int32 {
+	if m != nil {
+		return m.Type
+	}
+	return 0
+}
+
+func (m *SearchRequest) GetSearch() string {
+	if m != nil {
+		return m.Search
+	}
+	return ""
+}
+
+func (m *SearchRequest) GetBrandId() string {
+	if m != nil {
+		return m.BrandId
+	}
+	return ""
+}
+
+func (m *SearchRequest) GetMakerId() string {
+	if m != nil {
+		return m.MakerId
+	}
+	return ""
+}
+
+func (m *SearchRequest) GetSeriesId() string {
+	if m != nil {
+		return m.SeriesId
+	}
+	return ""
+}
+
+type SearchList struct {
+	Id                   string   `protobuf:"bytes,1,opt,name=id,proto3" json:"id"`
+	Name                 string   `protobuf:"bytes,2,opt,name=name,proto3" json:"name"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SearchList) Reset()         { *m = SearchList{} }
+func (m *SearchList) String() string { return proto.CompactTextString(m) }
+func (*SearchList) ProtoMessage()    {}
+func (*SearchList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{4}
+}
+
+func (m *SearchList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SearchList.Unmarshal(m, b)
+}
+func (m *SearchList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SearchList.Marshal(b, m, deterministic)
+}
+func (m *SearchList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SearchList.Merge(m, src)
+}
+func (m *SearchList) XXX_Size() int {
+	return xxx_messageInfo_SearchList.Size(m)
+}
+func (m *SearchList) XXX_DiscardUnknown() {
+	xxx_messageInfo_SearchList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SearchList proto.InternalMessageInfo
+
+func (m *SearchList) GetId() string {
+	if m != nil {
+		return m.Id
+	}
+	return ""
+}
+
+func (m *SearchList) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+type SearchReply struct {
+	List                 []*SearchList `protobuf:"bytes,1,rep,name=list,proto3" json:"list"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *SearchReply) Reset()         { *m = SearchReply{} }
+func (m *SearchReply) String() string { return proto.CompactTextString(m) }
+func (*SearchReply) ProtoMessage()    {}
+func (*SearchReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{5}
+}
+
+func (m *SearchReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SearchReply.Unmarshal(m, b)
+}
+func (m *SearchReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SearchReply.Marshal(b, m, deterministic)
+}
+func (m *SearchReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SearchReply.Merge(m, src)
+}
+func (m *SearchReply) XXX_Size() int {
+	return xxx_messageInfo_SearchReply.Size(m)
+}
+func (m *SearchReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_SearchReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SearchReply proto.InternalMessageInfo
+
+func (m *SearchReply) GetList() []*SearchList {
+	if m != nil {
+		return m.List
+	}
+	return nil
+}
+
+type UpdateSYBrandRequest struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	BrandName            string   `protobuf:"bytes,2,opt,name=brand_name,json=brandName,proto3" json:"brand_name"`
+	Initial              string   `protobuf:"bytes,3,opt,name=initial,proto3" json:"initial"`
+	Weight               int64    `protobuf:"varint,4,opt,name=weight,proto3" json:"weight"`
+	Status               int64    `protobuf:"varint,5,opt,name=status,proto3" json:"status"`
+	HasImg               int64    `protobuf:"varint,6,opt,name=has_img,json=hasImg,proto3" json:"has_img"`
+	OldBrandName         string   `protobuf:"bytes,7,opt,name=old_brand_name,json=oldBrandName,proto3" json:"old_brand_name"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UpdateSYBrandRequest) Reset()         { *m = UpdateSYBrandRequest{} }
+func (m *UpdateSYBrandRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateSYBrandRequest) ProtoMessage()    {}
+func (*UpdateSYBrandRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{6}
+}
+
+func (m *UpdateSYBrandRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdateSYBrandRequest.Unmarshal(m, b)
+}
+func (m *UpdateSYBrandRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdateSYBrandRequest.Marshal(b, m, deterministic)
+}
+func (m *UpdateSYBrandRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdateSYBrandRequest.Merge(m, src)
+}
+func (m *UpdateSYBrandRequest) XXX_Size() int {
+	return xxx_messageInfo_UpdateSYBrandRequest.Size(m)
+}
+func (m *UpdateSYBrandRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdateSYBrandRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdateSYBrandRequest proto.InternalMessageInfo
+
+func (m *UpdateSYBrandRequest) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *UpdateSYBrandRequest) GetBrandName() string {
+	if m != nil {
+		return m.BrandName
+	}
+	return ""
+}
+
+func (m *UpdateSYBrandRequest) GetInitial() string {
+	if m != nil {
+		return m.Initial
+	}
+	return ""
+}
+
+func (m *UpdateSYBrandRequest) GetWeight() int64 {
+	if m != nil {
+		return m.Weight
+	}
+	return 0
+}
+
+func (m *UpdateSYBrandRequest) GetStatus() int64 {
+	if m != nil {
+		return m.Status
+	}
+	return 0
+}
+
+func (m *UpdateSYBrandRequest) GetHasImg() int64 {
+	if m != nil {
+		return m.HasImg
+	}
+	return 0
+}
+
+func (m *UpdateSYBrandRequest) GetOldBrandName() string {
+	if m != nil {
+		return m.OldBrandName
+	}
+	return ""
+}
+
+type GetMakerRequest struct {
+	BrandId              string   `protobuf:"bytes,1,opt,name=brand_id,json=brandId,proto3" json:"brand_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetMakerRequest) Reset()         { *m = GetMakerRequest{} }
+func (m *GetMakerRequest) String() string { return proto.CompactTextString(m) }
+func (*GetMakerRequest) ProtoMessage()    {}
+func (*GetMakerRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{7}
+}
+
+func (m *GetMakerRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetMakerRequest.Unmarshal(m, b)
+}
+func (m *GetMakerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetMakerRequest.Marshal(b, m, deterministic)
+}
+func (m *GetMakerRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetMakerRequest.Merge(m, src)
+}
+func (m *GetMakerRequest) XXX_Size() int {
+	return xxx_messageInfo_GetMakerRequest.Size(m)
+}
+func (m *GetMakerRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetMakerRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetMakerRequest proto.InternalMessageInfo
+
+func (m *GetMakerRequest) GetBrandId() string {
+	if m != nil {
+		return m.BrandId
+	}
+	return ""
+}
+
+type MakerList struct {
+	BrandId              string   `protobuf:"bytes,1,opt,name=brand_id,json=brandId,proto3" json:"brand_id"`
+	MakerId              string   `protobuf:"bytes,2,opt,name=maker_id,json=makerId,proto3" json:"maker_id"`
+	Maker                string   `protobuf:"bytes,3,opt,name=maker,proto3" json:"maker"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MakerList) Reset()         { *m = MakerList{} }
+func (m *MakerList) String() string { return proto.CompactTextString(m) }
+func (*MakerList) ProtoMessage()    {}
+func (*MakerList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{8}
+}
+
+func (m *MakerList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MakerList.Unmarshal(m, b)
+}
+func (m *MakerList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MakerList.Marshal(b, m, deterministic)
+}
+func (m *MakerList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MakerList.Merge(m, src)
+}
+func (m *MakerList) XXX_Size() int {
+	return xxx_messageInfo_MakerList.Size(m)
+}
+func (m *MakerList) XXX_DiscardUnknown() {
+	xxx_messageInfo_MakerList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MakerList proto.InternalMessageInfo
+
+func (m *MakerList) GetBrandId() string {
+	if m != nil {
+		return m.BrandId
+	}
+	return ""
+}
+
+func (m *MakerList) GetMakerId() string {
+	if m != nil {
+		return m.MakerId
+	}
+	return ""
+}
+
+func (m *MakerList) GetMaker() string {
+	if m != nil {
+		return m.Maker
+	}
+	return ""
+}
+
+type GetMakerReply struct {
+	List                 []*MakerList `protobuf:"bytes,1,rep,name=list,proto3" json:"list"`
+	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
+	XXX_unrecognized     []byte       `json:"-"`
+	XXX_sizecache        int32        `json:"-"`
+}
+
+func (m *GetMakerReply) Reset()         { *m = GetMakerReply{} }
+func (m *GetMakerReply) String() string { return proto.CompactTextString(m) }
+func (*GetMakerReply) ProtoMessage()    {}
+func (*GetMakerReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{9}
+}
+
+func (m *GetMakerReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetMakerReply.Unmarshal(m, b)
+}
+func (m *GetMakerReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetMakerReply.Marshal(b, m, deterministic)
+}
+func (m *GetMakerReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetMakerReply.Merge(m, src)
+}
+func (m *GetMakerReply) XXX_Size() int {
+	return xxx_messageInfo_GetMakerReply.Size(m)
+}
+func (m *GetMakerReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetMakerReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetMakerReply proto.InternalMessageInfo
+
+func (m *GetMakerReply) GetList() []*MakerList {
+	if m != nil {
+		return m.List
+	}
+	return nil
+}
+
+type UpdateMakerRequest struct {
+	MakerId              string   `protobuf:"bytes,2,opt,name=maker_id,json=makerId,proto3" json:"maker_id"`
+	Maker                string   `protobuf:"bytes,3,opt,name=maker,proto3" json:"maker"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UpdateMakerRequest) Reset()         { *m = UpdateMakerRequest{} }
+func (m *UpdateMakerRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateMakerRequest) ProtoMessage()    {}
+func (*UpdateMakerRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{10}
+}
+
+func (m *UpdateMakerRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdateMakerRequest.Unmarshal(m, b)
+}
+func (m *UpdateMakerRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdateMakerRequest.Marshal(b, m, deterministic)
+}
+func (m *UpdateMakerRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdateMakerRequest.Merge(m, src)
+}
+func (m *UpdateMakerRequest) XXX_Size() int {
+	return xxx_messageInfo_UpdateMakerRequest.Size(m)
+}
+func (m *UpdateMakerRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdateMakerRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdateMakerRequest proto.InternalMessageInfo
+
+func (m *UpdateMakerRequest) GetMakerId() string {
+	if m != nil {
+		return m.MakerId
+	}
+	return ""
+}
+
+func (m *UpdateMakerRequest) GetMaker() string {
+	if m != nil {
+		return m.Maker
+	}
+	return ""
+}
+
+type EmptyReply struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EmptyReply) Reset()         { *m = EmptyReply{} }
+func (m *EmptyReply) String() string { return proto.CompactTextString(m) }
+func (*EmptyReply) ProtoMessage()    {}
+func (*EmptyReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{11}
+}
+
+func (m *EmptyReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EmptyReply.Unmarshal(m, b)
+}
+func (m *EmptyReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EmptyReply.Marshal(b, m, deterministic)
+}
+func (m *EmptyReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EmptyReply.Merge(m, src)
+}
+func (m *EmptyReply) XXX_Size() int {
+	return xxx_messageInfo_EmptyReply.Size(m)
+}
+func (m *EmptyReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_EmptyReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EmptyReply proto.InternalMessageInfo
+
+type SeriesListRequest struct {
+	// 品牌名
+	BrandName string `protobuf:"bytes,1,opt,name=brand_name,json=brandName,proto3" json:"brand_name"`
+	// 车系名
+	SeriesName string `protobuf:"bytes,2,opt,name=series_name,json=seriesName,proto3" json:"series_name"`
+	// 是否有图片 -1 1
+	HasImg int32 `protobuf:"varint,3,opt,name=has_img,json=hasImg,proto3" json:"has_img"`
+	// 状态 -1 1
+	Status int32 `protobuf:"varint,4,opt,name=status,proto3" json:"status"`
+	// 分页
+	PageSize             int32    `protobuf:"varint,5,opt,name=page_size,json=pageSize,proto3" json:"page_size"`
+	Page                 int32    `protobuf:"varint,6,opt,name=page,proto3" json:"page"`
+	BrandId              string   `protobuf:"bytes,7,opt,name=brand_id,json=brandId,proto3" json:"brand_id"`
+	SeriesId             string   `protobuf:"bytes,8,opt,name=series_id,json=seriesId,proto3" json:"series_id"`
+	OldSeriesName        string   `protobuf:"bytes,9,opt,name=old_series_name,json=oldSeriesName,proto3" json:"old_series_name"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SeriesListRequest) Reset()         { *m = SeriesListRequest{} }
+func (m *SeriesListRequest) String() string { return proto.CompactTextString(m) }
+func (*SeriesListRequest) ProtoMessage()    {}
+func (*SeriesListRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{12}
+}
+
+func (m *SeriesListRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SeriesListRequest.Unmarshal(m, b)
+}
+func (m *SeriesListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SeriesListRequest.Marshal(b, m, deterministic)
+}
+func (m *SeriesListRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SeriesListRequest.Merge(m, src)
+}
+func (m *SeriesListRequest) XXX_Size() int {
+	return xxx_messageInfo_SeriesListRequest.Size(m)
+}
+func (m *SeriesListRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_SeriesListRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SeriesListRequest proto.InternalMessageInfo
+
+func (m *SeriesListRequest) GetBrandName() string {
+	if m != nil {
+		return m.BrandName
+	}
+	return ""
+}
+
+func (m *SeriesListRequest) GetSeriesName() string {
+	if m != nil {
+		return m.SeriesName
+	}
+	return ""
+}
+
+func (m *SeriesListRequest) GetHasImg() int32 {
+	if m != nil {
+		return m.HasImg
+	}
+	return 0
+}
+
+func (m *SeriesListRequest) GetStatus() int32 {
+	if m != nil {
+		return m.Status
+	}
+	return 0
+}
+
+func (m *SeriesListRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+func (m *SeriesListRequest) GetPage() int32 {
+	if m != nil {
+		return m.Page
+	}
+	return 0
+}
+
+func (m *SeriesListRequest) GetBrandId() string {
+	if m != nil {
+		return m.BrandId
+	}
+	return ""
+}
+
+func (m *SeriesListRequest) GetSeriesId() string {
+	if m != nil {
+		return m.SeriesId
+	}
+	return ""
+}
+
+func (m *SeriesListRequest) GetOldSeriesName() string {
+	if m != nil {
+		return m.OldSeriesName
+	}
+	return ""
+}
+
+type SeriesList struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	BrandName            string   `protobuf:"bytes,2,opt,name=brand_name,json=brandName,proto3" json:"brand_name"`
+	SeriesId             string   `protobuf:"bytes,3,opt,name=series_id,json=seriesId,proto3" json:"series_id"`
+	Maker                string   `protobuf:"bytes,4,opt,name=maker,proto3" json:"maker"`
+	SeriesName           string   `protobuf:"bytes,5,opt,name=series_name,json=seriesName,proto3" json:"series_name"`
+	Status               int64    `protobuf:"varint,6,opt,name=status,proto3" json:"status"`
+	Image                string   `protobuf:"bytes,7,opt,name=image,proto3" json:"image"`
+	BrandId              string   `protobuf:"bytes,8,opt,name=brand_id,json=brandId,proto3" json:"brand_id"`
+	OldSeriesName        string   `protobuf:"bytes,9,opt,name=old_series_name,json=oldSeriesName,proto3" json:"old_series_name"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SeriesList) Reset()         { *m = SeriesList{} }
+func (m *SeriesList) String() string { return proto.CompactTextString(m) }
+func (*SeriesList) ProtoMessage()    {}
+func (*SeriesList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{13}
+}
+
+func (m *SeriesList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SeriesList.Unmarshal(m, b)
+}
+func (m *SeriesList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SeriesList.Marshal(b, m, deterministic)
+}
+func (m *SeriesList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SeriesList.Merge(m, src)
+}
+func (m *SeriesList) XXX_Size() int {
+	return xxx_messageInfo_SeriesList.Size(m)
+}
+func (m *SeriesList) XXX_DiscardUnknown() {
+	xxx_messageInfo_SeriesList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SeriesList proto.InternalMessageInfo
+
+func (m *SeriesList) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *SeriesList) GetBrandName() string {
+	if m != nil {
+		return m.BrandName
+	}
+	return ""
+}
+
+func (m *SeriesList) GetSeriesId() string {
+	if m != nil {
+		return m.SeriesId
+	}
+	return ""
+}
+
+func (m *SeriesList) GetMaker() string {
+	if m != nil {
+		return m.Maker
+	}
+	return ""
+}
+
+func (m *SeriesList) GetSeriesName() string {
+	if m != nil {
+		return m.SeriesName
+	}
+	return ""
+}
+
+func (m *SeriesList) GetStatus() int64 {
+	if m != nil {
+		return m.Status
+	}
+	return 0
+}
+
+func (m *SeriesList) GetImage() string {
+	if m != nil {
+		return m.Image
+	}
+	return ""
+}
+
+func (m *SeriesList) GetBrandId() string {
+	if m != nil {
+		return m.BrandId
+	}
+	return ""
+}
+
+func (m *SeriesList) GetOldSeriesName() string {
+	if m != nil {
+		return m.OldSeriesName
+	}
+	return ""
+}
+
+type SeriesListReply struct {
+	CurrentPage          int64         `protobuf:"varint,1,opt,name=current_page,json=currentPage,proto3" json:"current_page"`
+	PerPage              int64         `protobuf:"varint,2,opt,name=per_page,json=perPage,proto3" json:"per_page"`
+	Total                int64         `protobuf:"varint,3,opt,name=total,proto3" json:"total"`
+	FirstPage            int64         `protobuf:"varint,4,opt,name=first_page,json=firstPage,proto3" json:"first_page"`
+	LastPage             int64         `protobuf:"varint,5,opt,name=last_page,json=lastPage,proto3" json:"last_page"`
+	PrevPage             int64         `protobuf:"varint,6,opt,name=prev_page,json=prevPage,proto3" json:"prev_page"`
+	NextPage             int64         `protobuf:"varint,7,opt,name=next_page,json=nextPage,proto3" json:"next_page"`
+	List                 []*SeriesList `protobuf:"bytes,8,rep,name=list,proto3" json:"list"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *SeriesListReply) Reset()         { *m = SeriesListReply{} }
+func (m *SeriesListReply) String() string { return proto.CompactTextString(m) }
+func (*SeriesListReply) ProtoMessage()    {}
+func (*SeriesListReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{14}
+}
+
+func (m *SeriesListReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SeriesListReply.Unmarshal(m, b)
+}
+func (m *SeriesListReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SeriesListReply.Marshal(b, m, deterministic)
+}
+func (m *SeriesListReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SeriesListReply.Merge(m, src)
+}
+func (m *SeriesListReply) XXX_Size() int {
+	return xxx_messageInfo_SeriesListReply.Size(m)
+}
+func (m *SeriesListReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_SeriesListReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SeriesListReply proto.InternalMessageInfo
+
+func (m *SeriesListReply) GetCurrentPage() int64 {
+	if m != nil {
+		return m.CurrentPage
+	}
+	return 0
+}
+
+func (m *SeriesListReply) GetPerPage() int64 {
+	if m != nil {
+		return m.PerPage
+	}
+	return 0
+}
+
+func (m *SeriesListReply) GetTotal() int64 {
+	if m != nil {
+		return m.Total
+	}
+	return 0
+}
+
+func (m *SeriesListReply) GetFirstPage() int64 {
+	if m != nil {
+		return m.FirstPage
+	}
+	return 0
+}
+
+func (m *SeriesListReply) GetLastPage() int64 {
+	if m != nil {
+		return m.LastPage
+	}
+	return 0
+}
+
+func (m *SeriesListReply) GetPrevPage() int64 {
+	if m != nil {
+		return m.PrevPage
+	}
+	return 0
+}
+
+func (m *SeriesListReply) GetNextPage() int64 {
+	if m != nil {
+		return m.NextPage
+	}
+	return 0
+}
+
+func (m *SeriesListReply) GetList() []*SeriesList {
+	if m != nil {
+		return m.List
+	}
+	return nil
+}
+
+type UpdateSeriesRequest struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	SeriesName           string   `protobuf:"bytes,2,opt,name=series_name,json=seriesName,proto3" json:"series_name"`
+	Maker                string   `protobuf:"bytes,3,opt,name=maker,proto3" json:"maker"`
+	Status               int64    `protobuf:"varint,4,opt,name=status,proto3" json:"status"`
+	HasImg               int64    `protobuf:"varint,5,opt,name=has_img,json=hasImg,proto3" json:"has_img"`
+	OldSeriesName        string   `protobuf:"bytes,6,opt,name=old_series_name,json=oldSeriesName,proto3" json:"old_series_name"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UpdateSeriesRequest) Reset()         { *m = UpdateSeriesRequest{} }
+func (m *UpdateSeriesRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateSeriesRequest) ProtoMessage()    {}
+func (*UpdateSeriesRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{15}
+}
+
+func (m *UpdateSeriesRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdateSeriesRequest.Unmarshal(m, b)
+}
+func (m *UpdateSeriesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdateSeriesRequest.Marshal(b, m, deterministic)
+}
+func (m *UpdateSeriesRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdateSeriesRequest.Merge(m, src)
+}
+func (m *UpdateSeriesRequest) XXX_Size() int {
+	return xxx_messageInfo_UpdateSeriesRequest.Size(m)
+}
+func (m *UpdateSeriesRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdateSeriesRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdateSeriesRequest proto.InternalMessageInfo
+
+func (m *UpdateSeriesRequest) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *UpdateSeriesRequest) GetSeriesName() string {
+	if m != nil {
+		return m.SeriesName
+	}
+	return ""
+}
+
+func (m *UpdateSeriesRequest) GetMaker() string {
+	if m != nil {
+		return m.Maker
+	}
+	return ""
+}
+
+func (m *UpdateSeriesRequest) GetStatus() int64 {
+	if m != nil {
+		return m.Status
+	}
+	return 0
+}
+
+func (m *UpdateSeriesRequest) GetHasImg() int64 {
+	if m != nil {
+		return m.HasImg
+	}
+	return 0
+}
+
+func (m *UpdateSeriesRequest) GetOldSeriesName() string {
+	if m != nil {
+		return m.OldSeriesName
+	}
+	return ""
+}
+
+type StyleListRequest struct {
+	// 品牌名
+	BrandName string `protobuf:"bytes,1,opt,name=brand_name,json=brandName,proto3" json:"brand_name"`
+	// 车系名
+	SeriesName string `protobuf:"bytes,2,opt,name=series_name,json=seriesName,proto3" json:"series_name"`
+	// 是否有图片 -1 1
+	HasManual int32 `protobuf:"varint,3,opt,name=has_manual,json=hasManual,proto3" json:"has_manual"`
+	// 状态 -1 1
+	Status int32 `protobuf:"varint,4,opt,name=status,proto3" json:"status"`
+	// 分页
+	PageSize int32 `protobuf:"varint,5,opt,name=page_size,json=pageSize,proto3" json:"page_size"`
+	Page     int32 `protobuf:"varint,6,opt,name=page,proto3" json:"page"`
+	// 厂商
+	Maker string `protobuf:"bytes,7,opt,name=maker,proto3" json:"maker"`
+	// 年份
+	ModelYear            int64    `protobuf:"varint,8,opt,name=model_year,json=modelYear,proto3" json:"model_year"`
+	StyleName            string   `protobuf:"bytes,9,opt,name=style_name,json=styleName,proto3" json:"style_name"`
+	BrandId              string   `protobuf:"bytes,10,opt,name=brand_id,json=brandId,proto3" json:"brand_id"`
+	SeriesId             string   `protobuf:"bytes,11,opt,name=series_id,json=seriesId,proto3" json:"series_id"`
+	StyleId              string   `protobuf:"bytes,12,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StyleListRequest) Reset()         { *m = StyleListRequest{} }
+func (m *StyleListRequest) String() string { return proto.CompactTextString(m) }
+func (*StyleListRequest) ProtoMessage()    {}
+func (*StyleListRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{16}
+}
+
+func (m *StyleListRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleListRequest.Unmarshal(m, b)
+}
+func (m *StyleListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleListRequest.Marshal(b, m, deterministic)
+}
+func (m *StyleListRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleListRequest.Merge(m, src)
+}
+func (m *StyleListRequest) XXX_Size() int {
+	return xxx_messageInfo_StyleListRequest.Size(m)
+}
+func (m *StyleListRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleListRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleListRequest proto.InternalMessageInfo
+
+func (m *StyleListRequest) GetBrandName() string {
+	if m != nil {
+		return m.BrandName
+	}
+	return ""
+}
+
+func (m *StyleListRequest) GetSeriesName() string {
+	if m != nil {
+		return m.SeriesName
+	}
+	return ""
+}
+
+func (m *StyleListRequest) GetHasManual() int32 {
+	if m != nil {
+		return m.HasManual
+	}
+	return 0
+}
+
+func (m *StyleListRequest) GetStatus() int32 {
+	if m != nil {
+		return m.Status
+	}
+	return 0
+}
+
+func (m *StyleListRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+func (m *StyleListRequest) GetPage() int32 {
+	if m != nil {
+		return m.Page
+	}
+	return 0
+}
+
+func (m *StyleListRequest) GetMaker() string {
+	if m != nil {
+		return m.Maker
+	}
+	return ""
+}
+
+func (m *StyleListRequest) GetModelYear() int64 {
+	if m != nil {
+		return m.ModelYear
+	}
+	return 0
+}
+
+func (m *StyleListRequest) GetStyleName() string {
+	if m != nil {
+		return m.StyleName
+	}
+	return ""
+}
+
+func (m *StyleListRequest) GetBrandId() string {
+	if m != nil {
+		return m.BrandId
+	}
+	return ""
+}
+
+func (m *StyleListRequest) GetSeriesId() string {
+	if m != nil {
+		return m.SeriesId
+	}
+	return ""
+}
+
+func (m *StyleListRequest) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+type StyleList struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	StyleId              string   `protobuf:"bytes,2,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	BrandName            string   `protobuf:"bytes,3,opt,name=brand_name,json=brandName,proto3" json:"brand_name"`
+	Maker                string   `protobuf:"bytes,4,opt,name=maker,proto3" json:"maker"`
+	SeriesName           string   `protobuf:"bytes,5,opt,name=series_name,json=seriesName,proto3" json:"series_name"`
+	StyleName            string   `protobuf:"bytes,6,opt,name=style_name,json=styleName,proto3" json:"style_name"`
+	Status               int64    `protobuf:"varint,7,opt,name=status,proto3" json:"status"`
+	MaintainId           int64    `protobuf:"varint,8,opt,name=maintain_id,json=maintainId,proto3" json:"maintain_id"`
+	SeriesId             string   `protobuf:"bytes,9,opt,name=series_id,json=seriesId,proto3" json:"series_id"`
+	BrandId              string   `protobuf:"bytes,10,opt,name=brand_id,json=brandId,proto3" json:"brand_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StyleList) Reset()         { *m = StyleList{} }
+func (m *StyleList) String() string { return proto.CompactTextString(m) }
+func (*StyleList) ProtoMessage()    {}
+func (*StyleList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{17}
+}
+
+func (m *StyleList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleList.Unmarshal(m, b)
+}
+func (m *StyleList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleList.Marshal(b, m, deterministic)
+}
+func (m *StyleList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleList.Merge(m, src)
+}
+func (m *StyleList) XXX_Size() int {
+	return xxx_messageInfo_StyleList.Size(m)
+}
+func (m *StyleList) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleList proto.InternalMessageInfo
+
+func (m *StyleList) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *StyleList) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+func (m *StyleList) GetBrandName() string {
+	if m != nil {
+		return m.BrandName
+	}
+	return ""
+}
+
+func (m *StyleList) GetMaker() string {
+	if m != nil {
+		return m.Maker
+	}
+	return ""
+}
+
+func (m *StyleList) GetSeriesName() string {
+	if m != nil {
+		return m.SeriesName
+	}
+	return ""
+}
+
+func (m *StyleList) GetStyleName() string {
+	if m != nil {
+		return m.StyleName
+	}
+	return ""
+}
+
+func (m *StyleList) GetStatus() int64 {
+	if m != nil {
+		return m.Status
+	}
+	return 0
+}
+
+func (m *StyleList) GetMaintainId() int64 {
+	if m != nil {
+		return m.MaintainId
+	}
+	return 0
+}
+
+func (m *StyleList) GetSeriesId() string {
+	if m != nil {
+		return m.SeriesId
+	}
+	return ""
+}
+
+func (m *StyleList) GetBrandId() string {
+	if m != nil {
+		return m.BrandId
+	}
+	return ""
+}
+
+type StyleListReply struct {
+	CurrentPage          int64        `protobuf:"varint,1,opt,name=current_page,json=currentPage,proto3" json:"current_page"`
+	PerPage              int64        `protobuf:"varint,2,opt,name=per_page,json=perPage,proto3" json:"per_page"`
+	Total                int64        `protobuf:"varint,3,opt,name=total,proto3" json:"total"`
+	FirstPage            int64        `protobuf:"varint,4,opt,name=first_page,json=firstPage,proto3" json:"first_page"`
+	LastPage             int64        `protobuf:"varint,5,opt,name=last_page,json=lastPage,proto3" json:"last_page"`
+	PrevPage             int64        `protobuf:"varint,6,opt,name=prev_page,json=prevPage,proto3" json:"prev_page"`
+	NextPage             int64        `protobuf:"varint,7,opt,name=next_page,json=nextPage,proto3" json:"next_page"`
+	List                 []*StyleList `protobuf:"bytes,8,rep,name=list,proto3" json:"list"`
+	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
+	XXX_unrecognized     []byte       `json:"-"`
+	XXX_sizecache        int32        `json:"-"`
+}
+
+func (m *StyleListReply) Reset()         { *m = StyleListReply{} }
+func (m *StyleListReply) String() string { return proto.CompactTextString(m) }
+func (*StyleListReply) ProtoMessage()    {}
+func (*StyleListReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{18}
+}
+
+func (m *StyleListReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleListReply.Unmarshal(m, b)
+}
+func (m *StyleListReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleListReply.Marshal(b, m, deterministic)
+}
+func (m *StyleListReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleListReply.Merge(m, src)
+}
+func (m *StyleListReply) XXX_Size() int {
+	return xxx_messageInfo_StyleListReply.Size(m)
+}
+func (m *StyleListReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleListReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleListReply proto.InternalMessageInfo
+
+func (m *StyleListReply) GetCurrentPage() int64 {
+	if m != nil {
+		return m.CurrentPage
+	}
+	return 0
+}
+
+func (m *StyleListReply) GetPerPage() int64 {
+	if m != nil {
+		return m.PerPage
+	}
+	return 0
+}
+
+func (m *StyleListReply) GetTotal() int64 {
+	if m != nil {
+		return m.Total
+	}
+	return 0
+}
+
+func (m *StyleListReply) GetFirstPage() int64 {
+	if m != nil {
+		return m.FirstPage
+	}
+	return 0
+}
+
+func (m *StyleListReply) GetLastPage() int64 {
+	if m != nil {
+		return m.LastPage
+	}
+	return 0
+}
+
+func (m *StyleListReply) GetPrevPage() int64 {
+	if m != nil {
+		return m.PrevPage
+	}
+	return 0
+}
+
+func (m *StyleListReply) GetNextPage() int64 {
+	if m != nil {
+		return m.NextPage
+	}
+	return 0
+}
+
+func (m *StyleListReply) GetList() []*StyleList {
+	if m != nil {
+		return m.List
+	}
+	return nil
+}
+
+type UpdateStyleRequest struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	StyleName            string   `protobuf:"bytes,2,opt,name=style_name,json=styleName,proto3" json:"style_name"`
+	Status               int32    `protobuf:"varint,3,opt,name=status,proto3" json:"status"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UpdateStyleRequest) Reset()         { *m = UpdateStyleRequest{} }
+func (m *UpdateStyleRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateStyleRequest) ProtoMessage()    {}
+func (*UpdateStyleRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{19}
+}
+
+func (m *UpdateStyleRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdateStyleRequest.Unmarshal(m, b)
+}
+func (m *UpdateStyleRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdateStyleRequest.Marshal(b, m, deterministic)
+}
+func (m *UpdateStyleRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdateStyleRequest.Merge(m, src)
+}
+func (m *UpdateStyleRequest) XXX_Size() int {
+	return xxx_messageInfo_UpdateStyleRequest.Size(m)
+}
+func (m *UpdateStyleRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdateStyleRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdateStyleRequest proto.InternalMessageInfo
+
+func (m *UpdateStyleRequest) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *UpdateStyleRequest) GetStyleName() string {
+	if m != nil {
+		return m.StyleName
+	}
+	return ""
+}
+
+func (m *UpdateStyleRequest) GetStatus() int32 {
+	if m != nil {
+		return m.Status
+	}
+	return 0
+}
+
+type StyleInfoRequest struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StyleInfoRequest) Reset()         { *m = StyleInfoRequest{} }
+func (m *StyleInfoRequest) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoRequest) ProtoMessage()    {}
+func (*StyleInfoRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{20}
+}
+
+func (m *StyleInfoRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoRequest.Unmarshal(m, b)
+}
+func (m *StyleInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoRequest.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoRequest.Merge(m, src)
+}
+func (m *StyleInfoRequest) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoRequest.Size(m)
+}
+func (m *StyleInfoRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoRequest proto.InternalMessageInfo
+
+func (m *StyleInfoRequest) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+type StyleInfoReply struct {
+	Aircondition         *StyleInfoReply_Aircondition `protobuf:"bytes,1,opt,name=aircondition,proto3" json:"aircondition"`
+	Basic                *StyleInfoReply_Basic        `protobuf:"bytes,2,opt,name=basic,proto3" json:"basic"`
+	Body                 *StyleInfoReply_Body         `protobuf:"bytes,3,opt,name=body,proto3" json:"body"`
+	Chassis              *StyleInfoReply_Chassis      `protobuf:"bytes,4,opt,name=chassis,proto3" json:"chassis"`
+	Control              *StyleInfoReply_Control      `protobuf:"bytes,5,opt,name=control,proto3" json:"control"`
+	Electric             *StyleInfoReply_Electric     `protobuf:"bytes,6,opt,name=electric,proto3" json:"electric"`
+	Engine               *StyleInfoReply_Engine       `protobuf:"bytes,7,opt,name=engine,proto3" json:"engine"`
+	External             *StyleInfoReply_External     `protobuf:"bytes,8,opt,name=external,proto3" json:"external"`
+	Gearbox              *StyleInfoReply_Gearbox      `protobuf:"bytes,9,opt,name=gearbox,proto3" json:"gearbox"`
+	Intelligent          *StyleInfoReply_Intelligent  `protobuf:"bytes,10,opt,name=intelligent,proto3" json:"intelligent"`
+	Internal             *StyleInfoReply_Internal     `protobuf:"bytes,11,opt,name=internal,proto3" json:"internal"`
+	Light                *StyleInfoReply_Light        `protobuf:"bytes,12,opt,name=light,proto3" json:"light"`
+	Media                *StyleInfoReply_Media        `protobuf:"bytes,13,opt,name=media,proto3" json:"media"`
+	Optional             *StyleInfoReply_Optional     `protobuf:"bytes,14,opt,name=optional,proto3" json:"optional"`
+	Rearview             *StyleInfoReply_Rearview     `protobuf:"bytes,15,opt,name=rearview,proto3" json:"rearview"`
+	Safety               *StyleInfoReply_Safety       `protobuf:"bytes,16,opt,name=safety,proto3" json:"safety"`
+	Seat                 *StyleInfoReply_Seat         `protobuf:"bytes,17,opt,name=seat,proto3" json:"seat"`
+	Wheelbrake           *StyleInfoReply_Wheelbrake   `protobuf:"bytes,18,opt,name=wheelbrake,proto3" json:"wheelbrake"`
+	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
+	XXX_unrecognized     []byte                       `json:"-"`
+	XXX_sizecache        int32                        `json:"-"`
+}
+
+func (m *StyleInfoReply) Reset()         { *m = StyleInfoReply{} }
+func (m *StyleInfoReply) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply) ProtoMessage()    {}
+func (*StyleInfoReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21}
+}
+
+func (m *StyleInfoReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply.Unmarshal(m, b)
+}
+func (m *StyleInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply.Merge(m, src)
+}
+func (m *StyleInfoReply) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply.Size(m)
+}
+func (m *StyleInfoReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply proto.InternalMessageInfo
+
+func (m *StyleInfoReply) GetAircondition() *StyleInfoReply_Aircondition {
+	if m != nil {
+		return m.Aircondition
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetBasic() *StyleInfoReply_Basic {
+	if m != nil {
+		return m.Basic
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetBody() *StyleInfoReply_Body {
+	if m != nil {
+		return m.Body
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetChassis() *StyleInfoReply_Chassis {
+	if m != nil {
+		return m.Chassis
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetControl() *StyleInfoReply_Control {
+	if m != nil {
+		return m.Control
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetElectric() *StyleInfoReply_Electric {
+	if m != nil {
+		return m.Electric
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetEngine() *StyleInfoReply_Engine {
+	if m != nil {
+		return m.Engine
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetExternal() *StyleInfoReply_External {
+	if m != nil {
+		return m.External
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetGearbox() *StyleInfoReply_Gearbox {
+	if m != nil {
+		return m.Gearbox
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetIntelligent() *StyleInfoReply_Intelligent {
+	if m != nil {
+		return m.Intelligent
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetInternal() *StyleInfoReply_Internal {
+	if m != nil {
+		return m.Internal
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetLight() *StyleInfoReply_Light {
+	if m != nil {
+		return m.Light
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetMedia() *StyleInfoReply_Media {
+	if m != nil {
+		return m.Media
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetOptional() *StyleInfoReply_Optional {
+	if m != nil {
+		return m.Optional
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetRearview() *StyleInfoReply_Rearview {
+	if m != nil {
+		return m.Rearview
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetSafety() *StyleInfoReply_Safety {
+	if m != nil {
+		return m.Safety
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetSeat() *StyleInfoReply_Seat {
+	if m != nil {
+		return m.Seat
+	}
+	return nil
+}
+
+func (m *StyleInfoReply) GetWheelbrake() *StyleInfoReply_Wheelbrake {
+	if m != nil {
+		return m.Wheelbrake
+	}
+	return nil
+}
+
+type StyleInfoReply_Aircondition struct {
+	AirconditionControlType       string   `protobuf:"bytes,1,opt,name=aircondition_control_type,json=airconditionControlType,proto3" json:"aircondition_control_type"`
+	CarAirPurifier                string   `protobuf:"bytes,2,opt,name=car_air_purifier,json=carAirPurifier,proto3" json:"car_air_purifier"`
+	FragranceSystem               string   `protobuf:"bytes,3,opt,name=fragrance_system,json=fragranceSystem,proto3" json:"fragrance_system"`
+	NegativeIonGenerator          string   `protobuf:"bytes,4,opt,name=negative_ion_generator,json=negativeIonGenerator,proto3" json:"negative_ion_generator"`
+	Pm25Device                    string   `protobuf:"bytes,5,opt,name=pm25_device,json=pm25Device,proto3" json:"pm25_device"`
+	RearIndependentAirConditioner string   `protobuf:"bytes,6,opt,name=rear_independent_air_conditioner,json=rearIndependentAirConditioner,proto3" json:"rear_independent_air_conditioner"`
+	RearSeatAirOutlet             string   `protobuf:"bytes,7,opt,name=rear_seat_air_outlet,json=rearSeatAirOutlet,proto3" json:"rear_seat_air_outlet"`
+	Refrigerator                  string   `protobuf:"bytes,8,opt,name=refrigerator,proto3" json:"refrigerator"`
+	TemperatureZoneControl        string   `protobuf:"bytes,9,opt,name=temperature_zone_control,json=temperatureZoneControl,proto3" json:"temperature_zone_control"`
+	XXX_NoUnkeyedLiteral          struct{} `json:"-"`
+	XXX_unrecognized              []byte   `json:"-"`
+	XXX_sizecache                 int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Aircondition) Reset()         { *m = StyleInfoReply_Aircondition{} }
+func (m *StyleInfoReply_Aircondition) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Aircondition) ProtoMessage()    {}
+func (*StyleInfoReply_Aircondition) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 0}
+}
+
+func (m *StyleInfoReply_Aircondition) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Aircondition.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Aircondition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Aircondition.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Aircondition) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Aircondition.Merge(m, src)
+}
+func (m *StyleInfoReply_Aircondition) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Aircondition.Size(m)
+}
+func (m *StyleInfoReply_Aircondition) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Aircondition.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Aircondition proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Aircondition) GetAirconditionControlType() string {
+	if m != nil {
+		return m.AirconditionControlType
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Aircondition) GetCarAirPurifier() string {
+	if m != nil {
+		return m.CarAirPurifier
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Aircondition) GetFragranceSystem() string {
+	if m != nil {
+		return m.FragranceSystem
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Aircondition) GetNegativeIonGenerator() string {
+	if m != nil {
+		return m.NegativeIonGenerator
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Aircondition) GetPm25Device() string {
+	if m != nil {
+		return m.Pm25Device
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Aircondition) GetRearIndependentAirConditioner() string {
+	if m != nil {
+		return m.RearIndependentAirConditioner
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Aircondition) GetRearSeatAirOutlet() string {
+	if m != nil {
+		return m.RearSeatAirOutlet
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Aircondition) GetRefrigerator() string {
+	if m != nil {
+		return m.Refrigerator
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Aircondition) GetTemperatureZoneControl() string {
+	if m != nil {
+		return m.TemperatureZoneControl
+	}
+	return ""
+}
+
+type StyleInfoReply_Basic struct {
+	Alternator                     string   `protobuf:"bytes,1,opt,name=alternator,proto3" json:"alternator"`
+	BrakingDistanceMeasure         string   `protobuf:"bytes,2,opt,name=braking_distance_measure,json=brakingDistanceMeasure,proto3" json:"braking_distance_measure"`
+	BrandName                      string   `protobuf:"bytes,3,opt,name=brand_name,json=brandName,proto3" json:"brand_name"`
+	EmissionStandard               string   `protobuf:"bytes,4,opt,name=emission_standard,json=emissionStandard,proto3" json:"emission_standard"`
+	Engine                         string   `protobuf:"bytes,5,opt,name=engine,proto3" json:"engine"`
+	FastChargeAmount               string   `protobuf:"bytes,6,opt,name=fast_charge_amount,json=fastChargeAmount,proto3" json:"fast_charge_amount"`
+	FastChargingTime               string   `protobuf:"bytes,7,opt,name=fast_charging_time,json=fastChargingTime,proto3" json:"fast_charging_time"`
+	FuelTypeDetail                 string   `protobuf:"bytes,8,opt,name=fuel_type_detail,json=fuelTypeDetail,proto3" json:"fuel_type_detail"`
+	GearboxDesc                    string   `protobuf:"bytes,9,opt,name=gearbox_desc,json=gearboxDesc,proto3" json:"gearbox_desc"`
+	HundredAccelerate              string   `protobuf:"bytes,10,opt,name=hundred_accelerate,json=hundredAccelerate,proto3" json:"hundred_accelerate"`
+	HundredAccelerateMeasure       string   `protobuf:"bytes,11,opt,name=hundred_accelerate_measure,json=hundredAccelerateMeasure,proto3" json:"hundred_accelerate_measure"`
+	Level                          string   `protobuf:"bytes,12,opt,name=level,proto3" json:"level"`
+	Lwh                            string   `protobuf:"bytes,13,opt,name=lwh,proto3" json:"lwh"`
+	Maker                          string   `protobuf:"bytes,14,opt,name=maker,proto3" json:"maker"`
+	MaximumPower                   string   `protobuf:"bytes,15,opt,name=maximum_power,json=maximumPower,proto3" json:"maximum_power"`
+	MaximumSimulationMilage        string   `protobuf:"bytes,16,opt,name=maximum_simulation_milage,json=maximumSimulationMilage,proto3" json:"maximum_simulation_milage"`
+	MaximumSimulationMilageMeasure string   `protobuf:"bytes,17,opt,name=maximum_simulation_milage_measure,json=maximumSimulationMilageMeasure,proto3" json:"maximum_simulation_milage_measure"`
+	MaximumSpeed                   string   `protobuf:"bytes,18,opt,name=maximum_speed,json=maximumSpeed,proto3" json:"maximum_speed"`
+	MaximumTorque                  string   `protobuf:"bytes,19,opt,name=maximum_torque,json=maximumTorque,proto3" json:"maximum_torque"`
+	ModelYear                      string   `protobuf:"bytes,20,opt,name=model_year,json=modelYear,proto3" json:"model_year"`
+	OilWearComrehensive            string   `protobuf:"bytes,21,opt,name=oil_wear_comrehensive,json=oilWearComrehensive,proto3" json:"oil_wear_comrehensive"`
+	OilWearMeasure                 string   `protobuf:"bytes,22,opt,name=oil_wear_measure,json=oilWearMeasure,proto3" json:"oil_wear_measure"`
+	Price                          string   `protobuf:"bytes,23,opt,name=price,proto3" json:"price"`
+	PriceYuan                      string   `protobuf:"bytes,24,opt,name=price_yuan,json=priceYuan,proto3" json:"price_yuan"`
+	SeriesId                       string   `protobuf:"bytes,25,opt,name=series_id,json=seriesId,proto3" json:"series_id"`
+	SeriesImg                      string   `protobuf:"bytes,26,opt,name=series_img,json=seriesImg,proto3" json:"series_img"`
+	SeriesName                     string   `protobuf:"bytes,27,opt,name=series_name,json=seriesName,proto3" json:"series_name"`
+	SlowChargingTime               string   `protobuf:"bytes,28,opt,name=slow_charging_time,json=slowChargingTime,proto3" json:"slow_charging_time"`
+	StyleId                        string   `protobuf:"bytes,29,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	StyleName                      string   `protobuf:"bytes,30,opt,name=style_name,json=styleName,proto3" json:"style_name"`
+	SubLevel                       string   `protobuf:"bytes,31,opt,name=sub_level,json=subLevel,proto3" json:"sub_level"`
+	VehicleStructure               string   `protobuf:"bytes,32,opt,name=vehicle_structure,json=vehicleStructure,proto3" json:"vehicle_structure"`
+	VehicleWarranty                string   `protobuf:"bytes,33,opt,name=vehicle_warranty,json=vehicleWarranty,proto3" json:"vehicle_warranty"`
+	BrandId                        string   `protobuf:"bytes,34,opt,name=brand_id,json=brandId,proto3" json:"brand_id"`
+	XXX_NoUnkeyedLiteral           struct{} `json:"-"`
+	XXX_unrecognized               []byte   `json:"-"`
+	XXX_sizecache                  int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Basic) Reset()         { *m = StyleInfoReply_Basic{} }
+func (m *StyleInfoReply_Basic) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Basic) ProtoMessage()    {}
+func (*StyleInfoReply_Basic) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 1}
+}
+
+func (m *StyleInfoReply_Basic) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Basic.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Basic) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Basic.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Basic) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Basic.Merge(m, src)
+}
+func (m *StyleInfoReply_Basic) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Basic.Size(m)
+}
+func (m *StyleInfoReply_Basic) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Basic.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Basic proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Basic) GetAlternator() string {
+	if m != nil {
+		return m.Alternator
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetBrakingDistanceMeasure() string {
+	if m != nil {
+		return m.BrakingDistanceMeasure
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetBrandName() string {
+	if m != nil {
+		return m.BrandName
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetEmissionStandard() string {
+	if m != nil {
+		return m.EmissionStandard
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetEngine() string {
+	if m != nil {
+		return m.Engine
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetFastChargeAmount() string {
+	if m != nil {
+		return m.FastChargeAmount
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetFastChargingTime() string {
+	if m != nil {
+		return m.FastChargingTime
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetFuelTypeDetail() string {
+	if m != nil {
+		return m.FuelTypeDetail
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetGearboxDesc() string {
+	if m != nil {
+		return m.GearboxDesc
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetHundredAccelerate() string {
+	if m != nil {
+		return m.HundredAccelerate
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetHundredAccelerateMeasure() string {
+	if m != nil {
+		return m.HundredAccelerateMeasure
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetLevel() string {
+	if m != nil {
+		return m.Level
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetLwh() string {
+	if m != nil {
+		return m.Lwh
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetMaker() string {
+	if m != nil {
+		return m.Maker
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetMaximumPower() string {
+	if m != nil {
+		return m.MaximumPower
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetMaximumSimulationMilage() string {
+	if m != nil {
+		return m.MaximumSimulationMilage
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetMaximumSimulationMilageMeasure() string {
+	if m != nil {
+		return m.MaximumSimulationMilageMeasure
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetMaximumSpeed() string {
+	if m != nil {
+		return m.MaximumSpeed
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetMaximumTorque() string {
+	if m != nil {
+		return m.MaximumTorque
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetModelYear() string {
+	if m != nil {
+		return m.ModelYear
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetOilWearComrehensive() string {
+	if m != nil {
+		return m.OilWearComrehensive
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetOilWearMeasure() string {
+	if m != nil {
+		return m.OilWearMeasure
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetPrice() string {
+	if m != nil {
+		return m.Price
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetPriceYuan() string {
+	if m != nil {
+		return m.PriceYuan
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetSeriesId() string {
+	if m != nil {
+		return m.SeriesId
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetSeriesImg() string {
+	if m != nil {
+		return m.SeriesImg
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetSeriesName() string {
+	if m != nil {
+		return m.SeriesName
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetSlowChargingTime() string {
+	if m != nil {
+		return m.SlowChargingTime
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetStyleName() string {
+	if m != nil {
+		return m.StyleName
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetSubLevel() string {
+	if m != nil {
+		return m.SubLevel
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetVehicleStructure() string {
+	if m != nil {
+		return m.VehicleStructure
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetVehicleWarranty() string {
+	if m != nil {
+		return m.VehicleWarranty
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Basic) GetBrandId() string {
+	if m != nil {
+		return m.BrandId
+	}
+	return ""
+}
+
+type StyleInfoReply_Body struct {
+	BackWheelDistance      string   `protobuf:"bytes,1,opt,name=back_wheel_distance,json=backWheelDistance,proto3" json:"back_wheel_distance"`
+	DoorNumber             string   `protobuf:"bytes,2,opt,name=door_number,json=doorNumber,proto3" json:"door_number"`
+	FrontWheelDistance     string   `protobuf:"bytes,3,opt,name=front_wheel_distance,json=frontWheelDistance,proto3" json:"front_wheel_distance"`
+	High                   string   `protobuf:"bytes,4,opt,name=high,proto3" json:"high"`
+	Long                   string   `protobuf:"bytes,5,opt,name=long,proto3" json:"long"`
+	MinimumGroundClearance string   `protobuf:"bytes,6,opt,name=minimum_ground_clearance,json=minimumGroundClearance,proto3" json:"minimum_ground_clearance"`
+	OilboxVolume           string   `protobuf:"bytes,7,opt,name=oilbox_volume,json=oilboxVolume,proto3" json:"oilbox_volume"`
+	SeatNumber             string   `protobuf:"bytes,8,opt,name=seat_number,json=seatNumber,proto3" json:"seat_number"`
+	TrunkVolume            string   `protobuf:"bytes,9,opt,name=trunk_volume,json=trunkVolume,proto3" json:"trunk_volume"`
+	UnladenMass            string   `protobuf:"bytes,10,opt,name=unladen_mass,json=unladenMass,proto3" json:"unladen_mass"`
+	Wheelbase              string   `protobuf:"bytes,11,opt,name=wheelbase,proto3" json:"wheelbase"`
+	Wide                   string   `protobuf:"bytes,12,opt,name=wide,proto3" json:"wide"`
+	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
+	XXX_unrecognized       []byte   `json:"-"`
+	XXX_sizecache          int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Body) Reset()         { *m = StyleInfoReply_Body{} }
+func (m *StyleInfoReply_Body) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Body) ProtoMessage()    {}
+func (*StyleInfoReply_Body) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 2}
+}
+
+func (m *StyleInfoReply_Body) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Body.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Body) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Body.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Body) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Body.Merge(m, src)
+}
+func (m *StyleInfoReply_Body) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Body.Size(m)
+}
+func (m *StyleInfoReply_Body) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Body.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Body proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Body) GetBackWheelDistance() string {
+	if m != nil {
+		return m.BackWheelDistance
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Body) GetDoorNumber() string {
+	if m != nil {
+		return m.DoorNumber
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Body) GetFrontWheelDistance() string {
+	if m != nil {
+		return m.FrontWheelDistance
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Body) GetHigh() string {
+	if m != nil {
+		return m.High
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Body) GetLong() string {
+	if m != nil {
+		return m.Long
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Body) GetMinimumGroundClearance() string {
+	if m != nil {
+		return m.MinimumGroundClearance
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Body) GetOilboxVolume() string {
+	if m != nil {
+		return m.OilboxVolume
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Body) GetSeatNumber() string {
+	if m != nil {
+		return m.SeatNumber
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Body) GetTrunkVolume() string {
+	if m != nil {
+		return m.TrunkVolume
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Body) GetUnladenMass() string {
+	if m != nil {
+		return m.UnladenMass
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Body) GetWheelbase() string {
+	if m != nil {
+		return m.Wheelbase
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Body) GetWide() string {
+	if m != nil {
+		return m.Wide
+	}
+	return ""
+}
+
+type StyleInfoReply_Chassis struct {
+	AssistType           string   `protobuf:"bytes,1,opt,name=assist_type,json=assistType,proto3" json:"assist_type"`
+	BackSuspentionType   string   `protobuf:"bytes,2,opt,name=back_suspention_type,json=backSuspentionType,proto3" json:"back_suspention_type"`
+	BodyStructure        string   `protobuf:"bytes,3,opt,name=body_structure,json=bodyStructure,proto3" json:"body_structure"`
+	DriveType            string   `protobuf:"bytes,4,opt,name=drive_type,json=driveType,proto3" json:"drive_type"`
+	FrontSuspentionType  string   `protobuf:"bytes,5,opt,name=front_suspention_type,json=frontSuspentionType,proto3" json:"front_suspention_type"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Chassis) Reset()         { *m = StyleInfoReply_Chassis{} }
+func (m *StyleInfoReply_Chassis) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Chassis) ProtoMessage()    {}
+func (*StyleInfoReply_Chassis) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 3}
+}
+
+func (m *StyleInfoReply_Chassis) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Chassis.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Chassis) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Chassis.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Chassis) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Chassis.Merge(m, src)
+}
+func (m *StyleInfoReply_Chassis) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Chassis.Size(m)
+}
+func (m *StyleInfoReply_Chassis) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Chassis.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Chassis proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Chassis) GetAssistType() string {
+	if m != nil {
+		return m.AssistType
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Chassis) GetBackSuspentionType() string {
+	if m != nil {
+		return m.BackSuspentionType
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Chassis) GetBodyStructure() string {
+	if m != nil {
+		return m.BodyStructure
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Chassis) GetDriveType() string {
+	if m != nil {
+		return m.DriveType
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Chassis) GetFrontSuspentionType() string {
+	if m != nil {
+		return m.FrontSuspentionType
+	}
+	return ""
+}
+
+type StyleInfoReply_Control struct {
+	AirSuspension                   string   `protobuf:"bytes,1,opt,name=air_suspension,json=airSuspension,proto3" json:"air_suspension"`
+	AscentAssist                    string   `protobuf:"bytes,2,opt,name=ascent_assist,json=ascentAssist,proto3" json:"ascent_assist"`
+	AutoHold                        string   `protobuf:"bytes,3,opt,name=auto_hold,json=autoHold,proto3" json:"auto_hold"`
+	AutomaticDrivingAssistance      string   `protobuf:"bytes,4,opt,name=automatic_driving_assistance,json=automaticDrivingAssistance,proto3" json:"automatic_driving_assistance"`
+	AutomaticParking                string   `protobuf:"bytes,5,opt,name=automatic_parking,json=automaticParking,proto3" json:"automatic_parking"`
+	BackParkingRador                string   `protobuf:"bytes,6,opt,name=back_parking_rador,json=backParkingRador,proto3" json:"back_parking_rador"`
+	CentralDiffLock                 string   `protobuf:"bytes,7,opt,name=central_diff_lock,json=centralDiffLock,proto3" json:"central_diff_lock"`
+	CruiseSystem                    string   `protobuf:"bytes,8,opt,name=cruise_system,json=cruiseSystem,proto3" json:"cruise_system"`
+	DrivingModeSelection            string   `protobuf:"bytes,9,opt,name=driving_mode_selection,json=drivingModeSelection,proto3" json:"driving_mode_selection"`
+	EInductionSuspension            string   `protobuf:"bytes,10,opt,name=e_induction_suspension,json=eInductionSuspension,proto3" json:"e_induction_suspension"`
+	Edl                             string   `protobuf:"bytes,11,opt,name=edl,proto3" json:"edl"`
+	EngineStartStopTechnology       string   `protobuf:"bytes,12,opt,name=engine_start_stop_technology,json=engineStartStopTechnology,proto3" json:"engine_start_stop_technology"`
+	FrontParkingRador               string   `protobuf:"bytes,13,opt,name=front_parking_rador,json=frontParkingRador,proto3" json:"front_parking_rador"`
+	Hdc                             string   `protobuf:"bytes,14,opt,name=hdc,proto3" json:"hdc"`
+	OverallActiveSteeringSystem     string   `protobuf:"bytes,15,opt,name=overall_active_steering_system,json=overallActiveSteeringSystem,proto3" json:"overall_active_steering_system"`
+	ReverseVehicleSideWarningSystem string   `protobuf:"bytes,16,opt,name=reverse_vehicle_side_warning_system,json=reverseVehicleSideWarningSystem,proto3" json:"reverse_vehicle_side_warning_system"`
+	VariableSteeringRatio           string   `protobuf:"bytes,17,opt,name=variable_steering_ratio,json=variableSteeringRatio,proto3" json:"variable_steering_ratio"`
+	VariableSuspension              string   `protobuf:"bytes,18,opt,name=variable_suspension,json=variableSuspension,proto3" json:"variable_suspension"`
+	WadeSensingSystem               string   `protobuf:"bytes,19,opt,name=wade_sensing_system,json=wadeSensingSystem,proto3" json:"wade_sensing_system"`
+	XXX_NoUnkeyedLiteral            struct{} `json:"-"`
+	XXX_unrecognized                []byte   `json:"-"`
+	XXX_sizecache                   int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Control) Reset()         { *m = StyleInfoReply_Control{} }
+func (m *StyleInfoReply_Control) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Control) ProtoMessage()    {}
+func (*StyleInfoReply_Control) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 4}
+}
+
+func (m *StyleInfoReply_Control) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Control.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Control) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Control.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Control) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Control.Merge(m, src)
+}
+func (m *StyleInfoReply_Control) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Control.Size(m)
+}
+func (m *StyleInfoReply_Control) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Control.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Control proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Control) GetAirSuspension() string {
+	if m != nil {
+		return m.AirSuspension
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetAscentAssist() string {
+	if m != nil {
+		return m.AscentAssist
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetAutoHold() string {
+	if m != nil {
+		return m.AutoHold
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetAutomaticDrivingAssistance() string {
+	if m != nil {
+		return m.AutomaticDrivingAssistance
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetAutomaticParking() string {
+	if m != nil {
+		return m.AutomaticParking
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetBackParkingRador() string {
+	if m != nil {
+		return m.BackParkingRador
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetCentralDiffLock() string {
+	if m != nil {
+		return m.CentralDiffLock
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetCruiseSystem() string {
+	if m != nil {
+		return m.CruiseSystem
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetDrivingModeSelection() string {
+	if m != nil {
+		return m.DrivingModeSelection
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetEInductionSuspension() string {
+	if m != nil {
+		return m.EInductionSuspension
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetEdl() string {
+	if m != nil {
+		return m.Edl
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetEngineStartStopTechnology() string {
+	if m != nil {
+		return m.EngineStartStopTechnology
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetFrontParkingRador() string {
+	if m != nil {
+		return m.FrontParkingRador
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetHdc() string {
+	if m != nil {
+		return m.Hdc
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetOverallActiveSteeringSystem() string {
+	if m != nil {
+		return m.OverallActiveSteeringSystem
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetReverseVehicleSideWarningSystem() string {
+	if m != nil {
+		return m.ReverseVehicleSideWarningSystem
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetVariableSteeringRatio() string {
+	if m != nil {
+		return m.VariableSteeringRatio
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetVariableSuspension() string {
+	if m != nil {
+		return m.VariableSuspension
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Control) GetWadeSensingSystem() string {
+	if m != nil {
+		return m.WadeSensingSystem
+	}
+	return ""
+}
+
+type StyleInfoReply_Electric struct {
+	BackElectricMaximumPower      string   `protobuf:"bytes,1,opt,name=back_electric_maximum_power,json=backElectricMaximumPower,proto3" json:"back_electric_maximum_power"`
+	BackElectricTorque            string   `protobuf:"bytes,2,opt,name=back_electric_torque,json=backElectricTorque,proto3" json:"back_electric_torque"`
+	BatteryEnergy                 string   `protobuf:"bytes,3,opt,name=battery_energy,json=batteryEnergy,proto3" json:"battery_energy"`
+	BatteryPackWarranty           string   `protobuf:"bytes,4,opt,name=battery_pack_warranty,json=batteryPackWarranty,proto3" json:"battery_pack_warranty"`
+	BatteryType                   string   `protobuf:"bytes,5,opt,name=battery_type,json=batteryType,proto3" json:"battery_type"`
+	FrontElectricMaximumPower     string   `protobuf:"bytes,6,opt,name=front_electric_maximum_power,json=frontElectricMaximumPower,proto3" json:"front_electric_maximum_power"`
+	FrontElectricTorque           string   `protobuf:"bytes,7,opt,name=front_electric_torque,json=frontElectricTorque,proto3" json:"front_electric_torque"`
+	HundredElectricityConsumption string   `protobuf:"bytes,8,opt,name=hundred_electricity_consumption,json=hundredElectricityConsumption,proto3" json:"hundred_electricity_consumption"`
+	MaximumSimulationMilage       string   `protobuf:"bytes,9,opt,name=maximum_simulation_milage,json=maximumSimulationMilage,proto3" json:"maximum_simulation_milage"`
+	MotorLayout                   string   `protobuf:"bytes,10,opt,name=motor_layout,json=motorLayout,proto3" json:"motor_layout"`
+	MotorNumber                   string   `protobuf:"bytes,11,opt,name=motor_number,json=motorNumber,proto3" json:"motor_number"`
+	MotorType                     string   `protobuf:"bytes,12,opt,name=motor_type,json=motorType,proto3" json:"motor_type"`
+	SystemIntegratedPower         string   `protobuf:"bytes,13,opt,name=system_integrated_power,json=systemIntegratedPower,proto3" json:"system_integrated_power"`
+	SystemIntegratedTorque        string   `protobuf:"bytes,14,opt,name=system_integrated_torque,json=systemIntegratedTorque,proto3" json:"system_integrated_torque"`
+	TotalMotorPower               string   `protobuf:"bytes,15,opt,name=total_motor_power,json=totalMotorPower,proto3" json:"total_motor_power"`
+	TotalMotorTorque              string   `protobuf:"bytes,16,opt,name=total_motor_torque,json=totalMotorTorque,proto3" json:"total_motor_torque"`
+	XXX_NoUnkeyedLiteral          struct{} `json:"-"`
+	XXX_unrecognized              []byte   `json:"-"`
+	XXX_sizecache                 int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Electric) Reset()         { *m = StyleInfoReply_Electric{} }
+func (m *StyleInfoReply_Electric) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Electric) ProtoMessage()    {}
+func (*StyleInfoReply_Electric) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 5}
+}
+
+func (m *StyleInfoReply_Electric) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Electric.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Electric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Electric.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Electric) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Electric.Merge(m, src)
+}
+func (m *StyleInfoReply_Electric) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Electric.Size(m)
+}
+func (m *StyleInfoReply_Electric) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Electric.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Electric proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Electric) GetBackElectricMaximumPower() string {
+	if m != nil {
+		return m.BackElectricMaximumPower
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetBackElectricTorque() string {
+	if m != nil {
+		return m.BackElectricTorque
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetBatteryEnergy() string {
+	if m != nil {
+		return m.BatteryEnergy
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetBatteryPackWarranty() string {
+	if m != nil {
+		return m.BatteryPackWarranty
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetBatteryType() string {
+	if m != nil {
+		return m.BatteryType
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetFrontElectricMaximumPower() string {
+	if m != nil {
+		return m.FrontElectricMaximumPower
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetFrontElectricTorque() string {
+	if m != nil {
+		return m.FrontElectricTorque
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetHundredElectricityConsumption() string {
+	if m != nil {
+		return m.HundredElectricityConsumption
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetMaximumSimulationMilage() string {
+	if m != nil {
+		return m.MaximumSimulationMilage
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetMotorLayout() string {
+	if m != nil {
+		return m.MotorLayout
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetMotorNumber() string {
+	if m != nil {
+		return m.MotorNumber
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetMotorType() string {
+	if m != nil {
+		return m.MotorType
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetSystemIntegratedPower() string {
+	if m != nil {
+		return m.SystemIntegratedPower
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetSystemIntegratedTorque() string {
+	if m != nil {
+		return m.SystemIntegratedTorque
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetTotalMotorPower() string {
+	if m != nil {
+		return m.TotalMotorPower
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Electric) GetTotalMotorTorque() string {
+	if m != nil {
+		return m.TotalMotorTorque
+	}
+	return ""
+}
+
+type StyleInfoReply_Engine struct {
+	AirIntakForm         string   `protobuf:"bytes,1,opt,name=air_intak_form,json=airIntakForm,proto3" json:"air_intak_form"`
+	CylinderArrangement  string   `protobuf:"bytes,2,opt,name=cylinder_arrangement,json=cylinderArrangement,proto3" json:"cylinder_arrangement"`
+	CylinderDiameter     string   `protobuf:"bytes,3,opt,name=cylinder_diameter,json=cylinderDiameter,proto3" json:"cylinder_diameter"`
+	CylinderHeadMaterial string   `protobuf:"bytes,4,opt,name=cylinder_head_material,json=cylinderHeadMaterial,proto3" json:"cylinder_head_material"`
+	CylinderMaterial     string   `protobuf:"bytes,5,opt,name=cylinder_material,json=cylinderMaterial,proto3" json:"cylinder_material"`
+	CylinderNumber       string   `protobuf:"bytes,6,opt,name=cylinder_number,json=cylinderNumber,proto3" json:"cylinder_number"`
+	CylinderValveNumber  string   `protobuf:"bytes,7,opt,name=cylinder_valve_number,json=cylinderValveNumber,proto3" json:"cylinder_valve_number"`
+	Displacement         string   `protobuf:"bytes,8,opt,name=displacement,proto3" json:"displacement"`
+	DisplacementL        string   `protobuf:"bytes,9,opt,name=displacement_l,json=displacementL,proto3" json:"displacement_l"`
+	EngineTechnology     string   `protobuf:"bytes,10,opt,name=engine_technology,json=engineTechnology,proto3" json:"engine_technology"`
+	EngineType           string   `protobuf:"bytes,11,opt,name=engine_type,json=engineType,proto3" json:"engine_type"`
+	FuelLable            string   `protobuf:"bytes,12,opt,name=fuel_lable,json=fuelLable,proto3" json:"fuel_lable"`
+	FuelTypeDetail       string   `protobuf:"bytes,13,opt,name=fuel_type_detail,json=fuelTypeDetail,proto3" json:"fuel_type_detail"`
+	MaximumHorsepower    string   `protobuf:"bytes,14,opt,name=maximum_horsepower,json=maximumHorsepower,proto3" json:"maximum_horsepower"`
+	MaximumPowerRpm      string   `protobuf:"bytes,15,opt,name=maximum_power_rpm,json=maximumPowerRpm,proto3" json:"maximum_power_rpm"`
+	OilSupplyMode        string   `protobuf:"bytes,16,opt,name=oil_supply_mode,json=oilSupplyMode,proto3" json:"oil_supply_mode"`
+	PistonStroke         string   `protobuf:"bytes,17,opt,name=piston_stroke,json=pistonStroke,proto3" json:"piston_stroke"`
+	ReductionRatio       string   `protobuf:"bytes,18,opt,name=reduction_ratio,json=reductionRatio,proto3" json:"reduction_ratio"`
+	Rpm                  string   `protobuf:"bytes,19,opt,name=rpm,proto3" json:"rpm"`
+	ValveMechanism       string   `protobuf:"bytes,20,opt,name=valve_mechanism,json=valveMechanism,proto3" json:"valve_mechanism"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Engine) Reset()         { *m = StyleInfoReply_Engine{} }
+func (m *StyleInfoReply_Engine) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Engine) ProtoMessage()    {}
+func (*StyleInfoReply_Engine) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 6}
+}
+
+func (m *StyleInfoReply_Engine) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Engine.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Engine) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Engine.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Engine) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Engine.Merge(m, src)
+}
+func (m *StyleInfoReply_Engine) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Engine.Size(m)
+}
+func (m *StyleInfoReply_Engine) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Engine.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Engine proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Engine) GetAirIntakForm() string {
+	if m != nil {
+		return m.AirIntakForm
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetCylinderArrangement() string {
+	if m != nil {
+		return m.CylinderArrangement
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetCylinderDiameter() string {
+	if m != nil {
+		return m.CylinderDiameter
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetCylinderHeadMaterial() string {
+	if m != nil {
+		return m.CylinderHeadMaterial
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetCylinderMaterial() string {
+	if m != nil {
+		return m.CylinderMaterial
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetCylinderNumber() string {
+	if m != nil {
+		return m.CylinderNumber
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetCylinderValveNumber() string {
+	if m != nil {
+		return m.CylinderValveNumber
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetDisplacement() string {
+	if m != nil {
+		return m.Displacement
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetDisplacementL() string {
+	if m != nil {
+		return m.DisplacementL
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetEngineTechnology() string {
+	if m != nil {
+		return m.EngineTechnology
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetEngineType() string {
+	if m != nil {
+		return m.EngineType
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetFuelLable() string {
+	if m != nil {
+		return m.FuelLable
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetFuelTypeDetail() string {
+	if m != nil {
+		return m.FuelTypeDetail
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetMaximumHorsepower() string {
+	if m != nil {
+		return m.MaximumHorsepower
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetMaximumPowerRpm() string {
+	if m != nil {
+		return m.MaximumPowerRpm
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetOilSupplyMode() string {
+	if m != nil {
+		return m.OilSupplyMode
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetPistonStroke() string {
+	if m != nil {
+		return m.PistonStroke
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetReductionRatio() string {
+	if m != nil {
+		return m.ReductionRatio
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetRpm() string {
+	if m != nil {
+		return m.Rpm
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Engine) GetValveMechanism() string {
+	if m != nil {
+		return m.ValveMechanism
+	}
+	return ""
+}
+
+type StyleInfoReply_External struct {
+	ActiveIntakeGrille                 string   `protobuf:"bytes,1,opt,name=active_intake_grille,json=activeIntakeGrille,proto3" json:"active_intake_grille"`
+	BatteryPreHeating                  string   `protobuf:"bytes,2,opt,name=battery_pre_heating,json=batteryPreHeating,proto3" json:"battery_pre_heating"`
+	CentralControlLock                 string   `protobuf:"bytes,3,opt,name=central_control_lock,json=centralControlLock,proto3" json:"central_control_lock"`
+	ElectricTrunk                      string   `protobuf:"bytes,4,opt,name=electric_trunk,json=electricTrunk,proto3" json:"electric_trunk"`
+	ElectronicAntiTheft                string   `protobuf:"bytes,5,opt,name=electronic_anti_theft,json=electronicAntiTheft,proto3" json:"electronic_anti_theft"`
+	Eosd                               string   `protobuf:"bytes,6,opt,name=eosd,proto3" json:"eosd"`
+	FramelessDesignDoor                string   `protobuf:"bytes,7,opt,name=frameless_design_door,json=framelessDesignDoor,proto3" json:"frameless_design_door"`
+	HideElectricDoorHandle             string   `protobuf:"bytes,8,opt,name=hide_electric_door_handle,json=hideElectricDoorHandle,proto3" json:"hide_electric_door_handle"`
+	InductiveTrunk                     string   `protobuf:"bytes,9,opt,name=inductive_trunk,json=inductiveTrunk,proto3" json:"inductive_trunk"`
+	KeyType                            string   `protobuf:"bytes,10,opt,name=key_type,json=keyType,proto3" json:"key_type"`
+	KeylessEntrySystem                 string   `protobuf:"bytes,11,opt,name=keyless_entry_system,json=keylessEntrySystem,proto3" json:"keyless_entry_system"`
+	KeylessStartSystem                 string   `protobuf:"bytes,12,opt,name=keyless_start_system,json=keylessStartSystem,proto3" json:"keyless_start_system"`
+	OutsidePedal                       string   `protobuf:"bytes,13,opt,name=outside_pedal,json=outsidePedal,proto3" json:"outside_pedal"`
+	RearCompartmentPositionMemory      string   `protobuf:"bytes,14,opt,name=rear_compartment_position_memory,json=rearCompartmentPositionMemory,proto3" json:"rear_compartment_position_memory"`
+	RemoteStart                        string   `protobuf:"bytes,15,opt,name=remote_start,json=remoteStart,proto3" json:"remote_start"`
+	RimMaterial                        string   `protobuf:"bytes,16,opt,name=rim_material,json=rimMaterial,proto3" json:"rim_material"`
+	RoofLuggageRack                    string   `protobuf:"bytes,17,opt,name=roof_luggage_rack,json=roofLuggageRack,proto3" json:"roof_luggage_rack"`
+	SideSlidingDoor                    string   `protobuf:"bytes,18,opt,name=side_sliding_door,json=sideSlidingDoor,proto3" json:"side_sliding_door"`
+	SkylightType                       string   `protobuf:"bytes,19,opt,name=skylight_type,json=skylightType,proto3" json:"skylight_type"`
+	SportsAppearanceKit                string   `protobuf:"bytes,20,opt,name=sports_appearance_kit,json=sportsAppearanceKit,proto3" json:"sports_appearance_kit"`
+	Tail                               string   `protobuf:"bytes,21,opt,name=tail,proto3" json:"tail"`
+	TheTailgateGlassOpensIndependently string   `protobuf:"bytes,22,opt,name=the_tailgate_glass_opens_independently,json=theTailgateGlassOpensIndependently,proto3" json:"the_tailgate_glass_opens_independently"`
+	XXX_NoUnkeyedLiteral               struct{} `json:"-"`
+	XXX_unrecognized                   []byte   `json:"-"`
+	XXX_sizecache                      int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_External) Reset()         { *m = StyleInfoReply_External{} }
+func (m *StyleInfoReply_External) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_External) ProtoMessage()    {}
+func (*StyleInfoReply_External) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 7}
+}
+
+func (m *StyleInfoReply_External) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_External.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_External) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_External.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_External) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_External.Merge(m, src)
+}
+func (m *StyleInfoReply_External) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_External.Size(m)
+}
+func (m *StyleInfoReply_External) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_External.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_External proto.InternalMessageInfo
+
+func (m *StyleInfoReply_External) GetActiveIntakeGrille() string {
+	if m != nil {
+		return m.ActiveIntakeGrille
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetBatteryPreHeating() string {
+	if m != nil {
+		return m.BatteryPreHeating
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetCentralControlLock() string {
+	if m != nil {
+		return m.CentralControlLock
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetElectricTrunk() string {
+	if m != nil {
+		return m.ElectricTrunk
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetElectronicAntiTheft() string {
+	if m != nil {
+		return m.ElectronicAntiTheft
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetEosd() string {
+	if m != nil {
+		return m.Eosd
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetFramelessDesignDoor() string {
+	if m != nil {
+		return m.FramelessDesignDoor
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetHideElectricDoorHandle() string {
+	if m != nil {
+		return m.HideElectricDoorHandle
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetInductiveTrunk() string {
+	if m != nil {
+		return m.InductiveTrunk
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetKeyType() string {
+	if m != nil {
+		return m.KeyType
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetKeylessEntrySystem() string {
+	if m != nil {
+		return m.KeylessEntrySystem
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetKeylessStartSystem() string {
+	if m != nil {
+		return m.KeylessStartSystem
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetOutsidePedal() string {
+	if m != nil {
+		return m.OutsidePedal
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetRearCompartmentPositionMemory() string {
+	if m != nil {
+		return m.RearCompartmentPositionMemory
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetRemoteStart() string {
+	if m != nil {
+		return m.RemoteStart
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetRimMaterial() string {
+	if m != nil {
+		return m.RimMaterial
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetRoofLuggageRack() string {
+	if m != nil {
+		return m.RoofLuggageRack
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetSideSlidingDoor() string {
+	if m != nil {
+		return m.SideSlidingDoor
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetSkylightType() string {
+	if m != nil {
+		return m.SkylightType
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetSportsAppearanceKit() string {
+	if m != nil {
+		return m.SportsAppearanceKit
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetTail() string {
+	if m != nil {
+		return m.Tail
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_External) GetTheTailgateGlassOpensIndependently() string {
+	if m != nil {
+		return m.TheTailgateGlassOpensIndependently
+	}
+	return ""
+}
+
+type StyleInfoReply_Gearbox struct {
+	GearNumber           string   `protobuf:"bytes,1,opt,name=gear_number,json=gearNumber,proto3" json:"gear_number"`
+	GearboxDesc          string   `protobuf:"bytes,2,opt,name=gearbox_desc,json=gearboxDesc,proto3" json:"gearbox_desc"`
+	GearboxType          string   `protobuf:"bytes,3,opt,name=gearbox_type,json=gearboxType,proto3" json:"gearbox_type"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Gearbox) Reset()         { *m = StyleInfoReply_Gearbox{} }
+func (m *StyleInfoReply_Gearbox) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Gearbox) ProtoMessage()    {}
+func (*StyleInfoReply_Gearbox) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 8}
+}
+
+func (m *StyleInfoReply_Gearbox) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Gearbox.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Gearbox) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Gearbox.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Gearbox) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Gearbox.Merge(m, src)
+}
+func (m *StyleInfoReply_Gearbox) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Gearbox.Size(m)
+}
+func (m *StyleInfoReply_Gearbox) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Gearbox.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Gearbox proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Gearbox) GetGearNumber() string {
+	if m != nil {
+		return m.GearNumber
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Gearbox) GetGearboxDesc() string {
+	if m != nil {
+		return m.GearboxDesc
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Gearbox) GetGearboxType() string {
+	if m != nil {
+		return m.GearboxType
+	}
+	return ""
+}
+
+type StyleInfoReply_Intelligent struct {
+	AuxiliaryDrivingChip         string   `protobuf:"bytes,1,opt,name=auxiliary_driving_chip,json=auxiliaryDrivingChip,proto3" json:"auxiliary_driving_chip"`
+	ChipComputingPower           string   `protobuf:"bytes,2,opt,name=chip_computing_power,json=chipComputingPower,proto3" json:"chip_computing_power"`
+	NumberOfCameras              string   `protobuf:"bytes,3,opt,name=number_of_cameras,json=numberOfCameras,proto3" json:"number_of_cameras"`
+	NumberOfLidars               string   `protobuf:"bytes,4,opt,name=number_of_lidars,json=numberOfLidars,proto3" json:"number_of_lidars"`
+	NumberOfMillimeterWaveRadars string   `protobuf:"bytes,5,opt,name=number_of_millimeter_wave_radars,json=numberOfMillimeterWaveRadars,proto3" json:"number_of_millimeter_wave_radars"`
+	NumberOfUltrasonicRadars     string   `protobuf:"bytes,6,opt,name=number_of_ultrasonic_radars,json=numberOfUltrasonicRadars,proto3" json:"number_of_ultrasonic_radars"`
+	XXX_NoUnkeyedLiteral         struct{} `json:"-"`
+	XXX_unrecognized             []byte   `json:"-"`
+	XXX_sizecache                int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Intelligent) Reset()         { *m = StyleInfoReply_Intelligent{} }
+func (m *StyleInfoReply_Intelligent) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Intelligent) ProtoMessage()    {}
+func (*StyleInfoReply_Intelligent) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 9}
+}
+
+func (m *StyleInfoReply_Intelligent) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Intelligent.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Intelligent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Intelligent.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Intelligent) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Intelligent.Merge(m, src)
+}
+func (m *StyleInfoReply_Intelligent) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Intelligent.Size(m)
+}
+func (m *StyleInfoReply_Intelligent) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Intelligent.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Intelligent proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Intelligent) GetAuxiliaryDrivingChip() string {
+	if m != nil {
+		return m.AuxiliaryDrivingChip
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Intelligent) GetChipComputingPower() string {
+	if m != nil {
+		return m.ChipComputingPower
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Intelligent) GetNumberOfCameras() string {
+	if m != nil {
+		return m.NumberOfCameras
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Intelligent) GetNumberOfLidars() string {
+	if m != nil {
+		return m.NumberOfLidars
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Intelligent) GetNumberOfMillimeterWaveRadars() string {
+	if m != nil {
+		return m.NumberOfMillimeterWaveRadars
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Intelligent) GetNumberOfUltrasonicRadars() string {
+	if m != nil {
+		return m.NumberOfUltrasonicRadars
+	}
+	return ""
+}
+
+type StyleInfoReply_Internal struct {
+	ActiveNoiseReduction         string   `protobuf:"bytes,1,opt,name=active_noise_reduction,json=activeNoiseReduction,proto3" json:"active_noise_reduction"`
+	CarDrivingRecorder           string   `protobuf:"bytes,2,opt,name=car_driving_recorder,json=carDrivingRecorder,proto3" json:"car_driving_recorder"`
+	DrivingComputerDisplay       string   `protobuf:"bytes,3,opt,name=driving_computer_display,json=drivingComputerDisplay,proto3" json:"driving_computer_display"`
+	ElectricallyAdjustablePedal  string   `protobuf:"bytes,4,opt,name=electrically_adjustable_pedal,json=electricallyAdjustablePedal,proto3" json:"electrically_adjustable_pedal"`
+	FullLcdDashboard             string   `protobuf:"bytes,5,opt,name=full_lcd_dashboard,json=fullLcdDashboard,proto3" json:"full_lcd_dashboard"`
+	FullLcdDashboardSize         string   `protobuf:"bytes,6,opt,name=full_lcd_dashboard_size,json=fullLcdDashboardSize,proto3" json:"full_lcd_dashboard_size"`
+	HudRisingNumberDisplay       string   `protobuf:"bytes,7,opt,name=hud_rising_number_display,json=hudRisingNumberDisplay,proto3" json:"hud_rising_number_display"`
+	MobilePhoneWirelessCharging  string   `protobuf:"bytes,8,opt,name=mobile_phone_wireless_charging,json=mobilePhoneWirelessCharging,proto3" json:"mobile_phone_wireless_charging"`
+	MultiFunctionalSteeringWheel string   `protobuf:"bytes,9,opt,name=multi_functional_steering_wheel,json=multiFunctionalSteeringWheel,proto3" json:"multi_functional_steering_wheel"`
+	SteeringWheelAdjustment      string   `protobuf:"bytes,10,opt,name=steering_wheel_adjustment,json=steeringWheelAdjustment,proto3" json:"steering_wheel_adjustment"`
+	SteeringWheelHeating         string   `protobuf:"bytes,11,opt,name=steering_wheel_heating,json=steeringWheelHeating,proto3" json:"steering_wheel_heating"`
+	SteeringWheelMaterial        string   `protobuf:"bytes,12,opt,name=steering_wheel_material,json=steeringWheelMaterial,proto3" json:"steering_wheel_material"`
+	SteeringWheelRemember        string   `protobuf:"bytes,13,opt,name=steering_wheel_remember,json=steeringWheelRemember,proto3" json:"steering_wheel_remember"`
+	SteeringWheelShift           string   `protobuf:"bytes,14,opt,name=steering_wheel_shift,json=steeringWheelShift,proto3" json:"steering_wheel_shift"`
+	XXX_NoUnkeyedLiteral         struct{} `json:"-"`
+	XXX_unrecognized             []byte   `json:"-"`
+	XXX_sizecache                int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Internal) Reset()         { *m = StyleInfoReply_Internal{} }
+func (m *StyleInfoReply_Internal) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Internal) ProtoMessage()    {}
+func (*StyleInfoReply_Internal) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 10}
+}
+
+func (m *StyleInfoReply_Internal) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Internal.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Internal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Internal.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Internal) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Internal.Merge(m, src)
+}
+func (m *StyleInfoReply_Internal) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Internal.Size(m)
+}
+func (m *StyleInfoReply_Internal) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Internal.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Internal proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Internal) GetActiveNoiseReduction() string {
+	if m != nil {
+		return m.ActiveNoiseReduction
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Internal) GetCarDrivingRecorder() string {
+	if m != nil {
+		return m.CarDrivingRecorder
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Internal) GetDrivingComputerDisplay() string {
+	if m != nil {
+		return m.DrivingComputerDisplay
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Internal) GetElectricallyAdjustablePedal() string {
+	if m != nil {
+		return m.ElectricallyAdjustablePedal
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Internal) GetFullLcdDashboard() string {
+	if m != nil {
+		return m.FullLcdDashboard
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Internal) GetFullLcdDashboardSize() string {
+	if m != nil {
+		return m.FullLcdDashboardSize
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Internal) GetHudRisingNumberDisplay() string {
+	if m != nil {
+		return m.HudRisingNumberDisplay
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Internal) GetMobilePhoneWirelessCharging() string {
+	if m != nil {
+		return m.MobilePhoneWirelessCharging
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Internal) GetMultiFunctionalSteeringWheel() string {
+	if m != nil {
+		return m.MultiFunctionalSteeringWheel
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Internal) GetSteeringWheelAdjustment() string {
+	if m != nil {
+		return m.SteeringWheelAdjustment
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Internal) GetSteeringWheelHeating() string {
+	if m != nil {
+		return m.SteeringWheelHeating
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Internal) GetSteeringWheelMaterial() string {
+	if m != nil {
+		return m.SteeringWheelMaterial
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Internal) GetSteeringWheelRemember() string {
+	if m != nil {
+		return m.SteeringWheelRemember
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Internal) GetSteeringWheelShift() string {
+	if m != nil {
+		return m.SteeringWheelShift
+	}
+	return ""
+}
+
+type StyleInfoReply_Light struct {
+	AdaptiveFarNear      string   `protobuf:"bytes,1,opt,name=adaptive_far_near,json=adaptiveFarNear,proto3" json:"adaptive_far_near"`
+	Atmosphere           string   `protobuf:"bytes,2,opt,name=atmosphere,proto3" json:"atmosphere"`
+	AutoHead             string   `protobuf:"bytes,3,opt,name=auto_head,json=autoHead,proto3" json:"auto_head"`
+	Clean                string   `protobuf:"bytes,4,opt,name=clean,proto3" json:"clean"`
+	Daytime              string   `protobuf:"bytes,5,opt,name=daytime,proto3" json:"daytime"`
+	Far                  string   `protobuf:"bytes,6,opt,name=far,proto3" json:"far"`
+	Fog                  string   `protobuf:"bytes,7,opt,name=fog,proto3" json:"fog"`
+	HeadlampDelayOff     string   `protobuf:"bytes,8,opt,name=headlamp_delay_off,json=headlampDelayOff,proto3" json:"headlamp_delay_off"`
+	HeadlampRainFogMode  string   `protobuf:"bytes,9,opt,name=headlamp_rain_fog_mode,json=headlampRainFogMode,proto3" json:"headlamp_rain_fog_mode"`
+	HeightAdjustable     string   `protobuf:"bytes,10,opt,name=height_adjustable,json=heightAdjustable,proto3" json:"height_adjustable"`
+	LightingFeatures     string   `protobuf:"bytes,11,opt,name=lighting_features,json=lightingFeatures,proto3" json:"lighting_features"`
+	Near                 string   `protobuf:"bytes,12,opt,name=near,proto3" json:"near"`
+	SideTurn             string   `protobuf:"bytes,13,opt,name=side_turn,json=sideTurn,proto3" json:"side_turn"`
+	SteeringAssistLamp   string   `protobuf:"bytes,14,opt,name=steering_assist_lamp,json=steeringAssistLamp,proto3" json:"steering_assist_lamp"`
+	TouchReadingLamp     string   `protobuf:"bytes,15,opt,name=touch_reading_lamp,json=touchReadingLamp,proto3" json:"touch_reading_lamp"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Light) Reset()         { *m = StyleInfoReply_Light{} }
+func (m *StyleInfoReply_Light) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Light) ProtoMessage()    {}
+func (*StyleInfoReply_Light) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 11}
+}
+
+func (m *StyleInfoReply_Light) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Light.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Light) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Light.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Light) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Light.Merge(m, src)
+}
+func (m *StyleInfoReply_Light) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Light.Size(m)
+}
+func (m *StyleInfoReply_Light) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Light.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Light proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Light) GetAdaptiveFarNear() string {
+	if m != nil {
+		return m.AdaptiveFarNear
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetAtmosphere() string {
+	if m != nil {
+		return m.Atmosphere
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetAutoHead() string {
+	if m != nil {
+		return m.AutoHead
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetClean() string {
+	if m != nil {
+		return m.Clean
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetDaytime() string {
+	if m != nil {
+		return m.Daytime
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetFar() string {
+	if m != nil {
+		return m.Far
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetFog() string {
+	if m != nil {
+		return m.Fog
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetHeadlampDelayOff() string {
+	if m != nil {
+		return m.HeadlampDelayOff
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetHeadlampRainFogMode() string {
+	if m != nil {
+		return m.HeadlampRainFogMode
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetHeightAdjustable() string {
+	if m != nil {
+		return m.HeightAdjustable
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetLightingFeatures() string {
+	if m != nil {
+		return m.LightingFeatures
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetNear() string {
+	if m != nil {
+		return m.Near
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetSideTurn() string {
+	if m != nil {
+		return m.SideTurn
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetSteeringAssistLamp() string {
+	if m != nil {
+		return m.SteeringAssistLamp
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Light) GetTouchReadingLamp() string {
+	if m != nil {
+		return m.TouchReadingLamp
+	}
+	return ""
+}
+
+type StyleInfoReply_Media struct {
+	BackLcd                             string   `protobuf:"bytes,1,opt,name=back_lcd,json=backLcd,proto3" json:"back_lcd"`
+	CarInternet                         string   `protobuf:"bytes,2,opt,name=car_internet,json=carInternet,proto3" json:"car_internet"`
+	CarPhone                            string   `protobuf:"bytes,3,opt,name=car_phone,json=carPhone,proto3" json:"car_phone"`
+	CarTv                               string   `protobuf:"bytes,4,opt,name=car_tv,json=carTv,proto3" json:"car_tv"`
+	CdDvd                               string   `protobuf:"bytes,5,opt,name=cd_dvd,json=cdDvd,proto3" json:"cd_dvd"`
+	CenterConsoleLargeScreenSize        string   `protobuf:"bytes,6,opt,name=center_console_large_screen_size,json=centerConsoleLargeScreenSize,proto3" json:"center_console_large_screen_size"`
+	CentralColourScreen                 string   `protobuf:"bytes,7,opt,name=central_colour_screen,json=centralColourScreen,proto3" json:"central_colour_screen"`
+	CentralLcdSplitScreen               string   `protobuf:"bytes,8,opt,name=central_lcd_split_screen,json=centralLcdSplitScreen,proto3" json:"central_lcd_split_screen"`
+	ChargingInterface                   string   `protobuf:"bytes,9,opt,name=charging_interface,json=chargingInterface,proto3" json:"charging_interface"`
+	FaceRecognition                     string   `protobuf:"bytes,10,opt,name=face_recognition,json=faceRecognition,proto3" json:"face_recognition"`
+	GestureControl                      string   `protobuf:"bytes,11,opt,name=gesture_control,json=gestureControl,proto3" json:"gesture_control"`
+	Gps                                 string   `protobuf:"bytes,12,opt,name=gps,proto3" json:"gps"`
+	InterfaceOf12V                      string   `protobuf:"bytes,13,opt,name=interface_of12v,json=interfaceOf12v,proto3" json:"interface_of12v"`
+	MobileInternet                      string   `protobuf:"bytes,14,opt,name=mobile_internet,json=mobileInternet,proto3" json:"mobile_internet"`
+	NavigationTrafficInformationDisplay string   `protobuf:"bytes,15,opt,name=navigation_traffic_information_display,json=navigationTrafficInformationDisplay,proto3" json:"navigation_traffic_information_display"`
+	NumberOfInterfaces                  string   `protobuf:"bytes,16,opt,name=number_of_interfaces,json=numberOfInterfaces,proto3" json:"number_of_interfaces"`
+	Ota                                 string   `protobuf:"bytes,17,opt,name=ota,proto3" json:"ota"`
+	PowerOf220V                         string   `protobuf:"bytes,18,opt,name=power_of220v,json=powerOf220v,proto3" json:"power_of220v"`
+	RearControlMultimedia               string   `protobuf:"bytes,19,opt,name=rear_control_multimedia,json=rearControlMultimedia,proto3" json:"rear_control_multimedia"`
+	RoadRescueCall                      string   `protobuf:"bytes,20,opt,name=road_rescue_call,json=roadRescueCall,proto3" json:"road_rescue_call"`
+	SpeakerBrand                        string   `protobuf:"bytes,21,opt,name=speaker_brand,json=speakerBrand,proto3" json:"speaker_brand"`
+	SpeakerNumber                       string   `protobuf:"bytes,22,opt,name=speaker_number,json=speakerNumber,proto3" json:"speaker_number"`
+	VoiceControl                        string   `protobuf:"bytes,23,opt,name=voice_control,json=voiceControl,proto3" json:"voice_control"`
+	XXX_NoUnkeyedLiteral                struct{} `json:"-"`
+	XXX_unrecognized                    []byte   `json:"-"`
+	XXX_sizecache                       int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Media) Reset()         { *m = StyleInfoReply_Media{} }
+func (m *StyleInfoReply_Media) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Media) ProtoMessage()    {}
+func (*StyleInfoReply_Media) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 12}
+}
+
+func (m *StyleInfoReply_Media) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Media.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Media) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Media.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Media) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Media.Merge(m, src)
+}
+func (m *StyleInfoReply_Media) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Media.Size(m)
+}
+func (m *StyleInfoReply_Media) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Media.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Media proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Media) GetBackLcd() string {
+	if m != nil {
+		return m.BackLcd
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetCarInternet() string {
+	if m != nil {
+		return m.CarInternet
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetCarPhone() string {
+	if m != nil {
+		return m.CarPhone
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetCarTv() string {
+	if m != nil {
+		return m.CarTv
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetCdDvd() string {
+	if m != nil {
+		return m.CdDvd
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetCenterConsoleLargeScreenSize() string {
+	if m != nil {
+		return m.CenterConsoleLargeScreenSize
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetCentralColourScreen() string {
+	if m != nil {
+		return m.CentralColourScreen
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetCentralLcdSplitScreen() string {
+	if m != nil {
+		return m.CentralLcdSplitScreen
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetChargingInterface() string {
+	if m != nil {
+		return m.ChargingInterface
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetFaceRecognition() string {
+	if m != nil {
+		return m.FaceRecognition
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetGestureControl() string {
+	if m != nil {
+		return m.GestureControl
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetGps() string {
+	if m != nil {
+		return m.Gps
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetInterfaceOf12V() string {
+	if m != nil {
+		return m.InterfaceOf12V
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetMobileInternet() string {
+	if m != nil {
+		return m.MobileInternet
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetNavigationTrafficInformationDisplay() string {
+	if m != nil {
+		return m.NavigationTrafficInformationDisplay
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetNumberOfInterfaces() string {
+	if m != nil {
+		return m.NumberOfInterfaces
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetOta() string {
+	if m != nil {
+		return m.Ota
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetPowerOf220V() string {
+	if m != nil {
+		return m.PowerOf220V
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetRearControlMultimedia() string {
+	if m != nil {
+		return m.RearControlMultimedia
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetRoadRescueCall() string {
+	if m != nil {
+		return m.RoadRescueCall
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetSpeakerBrand() string {
+	if m != nil {
+		return m.SpeakerBrand
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetSpeakerNumber() string {
+	if m != nil {
+		return m.SpeakerNumber
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Media) GetVoiceControl() string {
+	if m != nil {
+		return m.VoiceControl
+	}
+	return ""
+}
+
+type StyleInfoReply_Optional struct {
+	BodyColour           string   `protobuf:"bytes,1,opt,name=body_colour,json=bodyColour,proto3" json:"body_colour"`
+	InteriorColor        string   `protobuf:"bytes,2,opt,name=interior_color,json=interiorColor,proto3" json:"interior_color"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Optional) Reset()         { *m = StyleInfoReply_Optional{} }
+func (m *StyleInfoReply_Optional) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Optional) ProtoMessage()    {}
+func (*StyleInfoReply_Optional) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 13}
+}
+
+func (m *StyleInfoReply_Optional) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Optional.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Optional) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Optional.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Optional) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Optional.Merge(m, src)
+}
+func (m *StyleInfoReply_Optional) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Optional.Size(m)
+}
+func (m *StyleInfoReply_Optional) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Optional.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Optional proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Optional) GetBodyColour() string {
+	if m != nil {
+		return m.BodyColour
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Optional) GetInteriorColor() string {
+	if m != nil {
+		return m.InteriorColor
+	}
+	return ""
+}
+
+type StyleInfoReply_Rearview struct {
+	AntiPinchHand                  string   `protobuf:"bytes,1,opt,name=anti_pinch_hand,json=antiPinchHand,proto3" json:"anti_pinch_hand"`
+	BackElectricWindow             string   `protobuf:"bytes,2,opt,name=back_electric_window,json=backElectricWindow,proto3" json:"back_electric_window"`
+	BackSidePrivacy                string   `protobuf:"bytes,3,opt,name=back_side_privacy,json=backSidePrivacy,proto3" json:"back_side_privacy"`
+	BackSideSunshade               string   `protobuf:"bytes,4,opt,name=back_side_sunshade,json=backSideSunshade,proto3" json:"back_side_sunshade"`
+	BackSunshade                   string   `protobuf:"bytes,5,opt,name=back_sunshade,json=backSunshade,proto3" json:"back_sunshade"`
+	BackWiper                      string   `protobuf:"bytes,6,opt,name=back_wiper,json=backWiper,proto3" json:"back_wiper"`
+	Cosmetic                       string   `protobuf:"bytes,7,opt,name=cosmetic,proto3" json:"cosmetic"`
+	ExteriorRearviewMirrorFunction string   `protobuf:"bytes,8,opt,name=exterior_rearview_mirror_function,json=exteriorRearviewMirrorFunction,proto3" json:"exterior_rearview_mirror_function"`
+	FrontElectricWindow            string   `protobuf:"bytes,9,opt,name=front_electric_window,json=frontElectricWindow,proto3" json:"front_electric_window"`
+	FrontWiper                     string   `protobuf:"bytes,10,opt,name=front_wiper,json=frontWiper,proto3" json:"front_wiper"`
+	HeatableSprayNozzle            string   `protobuf:"bytes,11,opt,name=heatable_spray_nozzle,json=heatableSprayNozzle,proto3" json:"heatable_spray_nozzle"`
+	InteriorRearviewMirrorFunction string   `protobuf:"bytes,12,opt,name=interior_rearview_mirror_function,json=interiorRearviewMirrorFunction,proto3" json:"interior_rearview_mirror_function"`
+	MultilayerSoundInsulationGlass string   `protobuf:"bytes,13,opt,name=multilayer_sound_insulation_glass,json=multilayerSoundInsulationGlass,proto3" json:"multilayer_sound_insulation_glass"`
+	WindowOneKey                   string   `protobuf:"bytes,14,opt,name=window_one_key,json=windowOneKey,proto3" json:"window_one_key"`
+	XXX_NoUnkeyedLiteral           struct{} `json:"-"`
+	XXX_unrecognized               []byte   `json:"-"`
+	XXX_sizecache                  int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Rearview) Reset()         { *m = StyleInfoReply_Rearview{} }
+func (m *StyleInfoReply_Rearview) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Rearview) ProtoMessage()    {}
+func (*StyleInfoReply_Rearview) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 14}
+}
+
+func (m *StyleInfoReply_Rearview) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Rearview.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Rearview) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Rearview.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Rearview) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Rearview.Merge(m, src)
+}
+func (m *StyleInfoReply_Rearview) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Rearview.Size(m)
+}
+func (m *StyleInfoReply_Rearview) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Rearview.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Rearview proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Rearview) GetAntiPinchHand() string {
+	if m != nil {
+		return m.AntiPinchHand
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Rearview) GetBackElectricWindow() string {
+	if m != nil {
+		return m.BackElectricWindow
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Rearview) GetBackSidePrivacy() string {
+	if m != nil {
+		return m.BackSidePrivacy
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Rearview) GetBackSideSunshade() string {
+	if m != nil {
+		return m.BackSideSunshade
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Rearview) GetBackSunshade() string {
+	if m != nil {
+		return m.BackSunshade
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Rearview) GetBackWiper() string {
+	if m != nil {
+		return m.BackWiper
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Rearview) GetCosmetic() string {
+	if m != nil {
+		return m.Cosmetic
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Rearview) GetExteriorRearviewMirrorFunction() string {
+	if m != nil {
+		return m.ExteriorRearviewMirrorFunction
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Rearview) GetFrontElectricWindow() string {
+	if m != nil {
+		return m.FrontElectricWindow
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Rearview) GetFrontWiper() string {
+	if m != nil {
+		return m.FrontWiper
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Rearview) GetHeatableSprayNozzle() string {
+	if m != nil {
+		return m.HeatableSprayNozzle
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Rearview) GetInteriorRearviewMirrorFunction() string {
+	if m != nil {
+		return m.InteriorRearviewMirrorFunction
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Rearview) GetMultilayerSoundInsulationGlass() string {
+	if m != nil {
+		return m.MultilayerSoundInsulationGlass
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Rearview) GetWindowOneKey() string {
+	if m != nil {
+		return m.WindowOneKey
+	}
+	return ""
+}
+
+type StyleInfoReply_Safety struct {
+	Abs                         string   `protobuf:"bytes,1,opt,name=abs,proto3" json:"abs"`
+	ActiveBrake                 string   `protobuf:"bytes,2,opt,name=active_brake,json=activeBrake,proto3" json:"active_brake"`
+	AsrTcsTrc                   string   `protobuf:"bytes,3,opt,name=asr_tcs_trc,json=asrTcsTrc,proto3" json:"asr_tcs_trc"`
+	AuxiliarySeatAirbag         string   `protobuf:"bytes,4,opt,name=auxiliary_seat_airbag,json=auxiliarySeatAirbag,proto3" json:"auxiliary_seat_airbag"`
+	BackBeltAirbag              string   `protobuf:"bytes,5,opt,name=back_belt_airbag,json=backBeltAirbag,proto3" json:"back_belt_airbag"`
+	BackHeadAirbag              string   `protobuf:"bytes,6,opt,name=back_head_airbag,json=backHeadAirbag,proto3" json:"back_head_airbag"`
+	BackSideAirbag              string   `protobuf:"bytes,7,opt,name=back_side_airbag,json=backSideAirbag,proto3" json:"back_side_airbag"`
+	EbaBasBa                    string   `protobuf:"bytes,8,opt,name=eba_bas_ba,json=ebaBasBa,proto3" json:"eba_bas_ba"`
+	EbdCbc                      string   `protobuf:"bytes,9,opt,name=ebd_cbc,json=ebdCbc,proto3" json:"ebd_cbc"`
+	Esp                         string   `protobuf:"bytes,10,opt,name=esp,proto3" json:"esp"`
+	FatigueDrivingWarning       string   `protobuf:"bytes,11,opt,name=fatigue_driving_warning,json=fatigueDrivingWarning,proto3" json:"fatigue_driving_warning"`
+	FontHeadAirbag              string   `protobuf:"bytes,12,opt,name=font_head_airbag,json=fontHeadAirbag,proto3" json:"font_head_airbag"`
+	FrontMiddleAirbag           string   `protobuf:"bytes,13,opt,name=front_middle_airbag,json=frontMiddleAirbag,proto3" json:"front_middle_airbag"`
+	FrontSideAirbag             string   `protobuf:"bytes,14,opt,name=front_side_airbag,json=frontSideAirbag,proto3" json:"front_side_airbag"`
+	IsoFix                      string   `protobuf:"bytes,15,opt,name=iso_fix,json=isoFix,proto3" json:"iso_fix"`
+	KneeAirbag                  string   `protobuf:"bytes,16,opt,name=knee_airbag,json=kneeAirbag,proto3" json:"knee_airbag"`
+	LaneDepartureWarningSystem  string   `protobuf:"bytes,17,opt,name=lane_departure_warning_system,json=laneDepartureWarningSystem,proto3" json:"lane_departure_warning_system"`
+	LaneKeeping                 string   `protobuf:"bytes,18,opt,name=lane_keeping,json=laneKeeping,proto3" json:"lane_keeping"`
+	MainSeatAirbag              string   `protobuf:"bytes,19,opt,name=main_seat_airbag,json=mainSeatAirbag,proto3" json:"main_seat_airbag"`
+	NightVision                 string   `protobuf:"bytes,20,opt,name=night_vision,json=nightVision,proto3" json:"night_vision"`
+	ParallelAuxiliary           string   `protobuf:"bytes,21,opt,name=parallel_auxiliary,json=parallelAuxiliary,proto3" json:"parallel_auxiliary"`
+	PassengerSeatCushionAirbag  string   `protobuf:"bytes,22,opt,name=passenger_seat_cushion_airbag,json=passengerSeatCushionAirbag,proto3" json:"passenger_seat_cushion_airbag"`
+	PassivePedestrianProtection string   `protobuf:"bytes,23,opt,name=passive_pedestrian_protection,json=passivePedestrianProtection,proto3" json:"passive_pedestrian_protection"`
+	RearCentralAirbag           string   `protobuf:"bytes,24,opt,name=rear_central_airbag,json=rearCentralAirbag,proto3" json:"rear_central_airbag"`
+	RearSeatAntiSlideAirbag     string   `protobuf:"bytes,25,opt,name=rear_seat_anti_slide_airbag,json=rearSeatAntiSlideAirbag,proto3" json:"rear_seat_anti_slide_airbag"`
+	RoadTrafficSignRecognition  string   `protobuf:"bytes,26,opt,name=road_traffic_sign_recognition,json=roadTrafficSignRecognition,proto3" json:"road_traffic_sign_recognition"`
+	RunFlatTire                 string   `protobuf:"bytes,27,opt,name=run_flat_tire,json=runFlatTire,proto3" json:"run_flat_tire"`
+	SeatBeltWarning             string   `protobuf:"bytes,28,opt,name=seat_belt_warning,json=seatBeltWarning,proto3" json:"seat_belt_warning"`
+	TirePresureMonitor          string   `protobuf:"bytes,29,opt,name=tire_presure_monitor,json=tirePresureMonitor,proto3" json:"tire_presure_monitor"`
+	XXX_NoUnkeyedLiteral        struct{} `json:"-"`
+	XXX_unrecognized            []byte   `json:"-"`
+	XXX_sizecache               int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Safety) Reset()         { *m = StyleInfoReply_Safety{} }
+func (m *StyleInfoReply_Safety) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Safety) ProtoMessage()    {}
+func (*StyleInfoReply_Safety) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 15}
+}
+
+func (m *StyleInfoReply_Safety) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Safety.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Safety) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Safety.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Safety) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Safety.Merge(m, src)
+}
+func (m *StyleInfoReply_Safety) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Safety.Size(m)
+}
+func (m *StyleInfoReply_Safety) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Safety.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Safety proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Safety) GetAbs() string {
+	if m != nil {
+		return m.Abs
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetActiveBrake() string {
+	if m != nil {
+		return m.ActiveBrake
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetAsrTcsTrc() string {
+	if m != nil {
+		return m.AsrTcsTrc
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetAuxiliarySeatAirbag() string {
+	if m != nil {
+		return m.AuxiliarySeatAirbag
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetBackBeltAirbag() string {
+	if m != nil {
+		return m.BackBeltAirbag
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetBackHeadAirbag() string {
+	if m != nil {
+		return m.BackHeadAirbag
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetBackSideAirbag() string {
+	if m != nil {
+		return m.BackSideAirbag
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetEbaBasBa() string {
+	if m != nil {
+		return m.EbaBasBa
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetEbdCbc() string {
+	if m != nil {
+		return m.EbdCbc
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetEsp() string {
+	if m != nil {
+		return m.Esp
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetFatigueDrivingWarning() string {
+	if m != nil {
+		return m.FatigueDrivingWarning
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetFontHeadAirbag() string {
+	if m != nil {
+		return m.FontHeadAirbag
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetFrontMiddleAirbag() string {
+	if m != nil {
+		return m.FrontMiddleAirbag
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetFrontSideAirbag() string {
+	if m != nil {
+		return m.FrontSideAirbag
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetIsoFix() string {
+	if m != nil {
+		return m.IsoFix
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetKneeAirbag() string {
+	if m != nil {
+		return m.KneeAirbag
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetLaneDepartureWarningSystem() string {
+	if m != nil {
+		return m.LaneDepartureWarningSystem
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetLaneKeeping() string {
+	if m != nil {
+		return m.LaneKeeping
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetMainSeatAirbag() string {
+	if m != nil {
+		return m.MainSeatAirbag
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetNightVision() string {
+	if m != nil {
+		return m.NightVision
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetParallelAuxiliary() string {
+	if m != nil {
+		return m.ParallelAuxiliary
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetPassengerSeatCushionAirbag() string {
+	if m != nil {
+		return m.PassengerSeatCushionAirbag
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetPassivePedestrianProtection() string {
+	if m != nil {
+		return m.PassivePedestrianProtection
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetRearCentralAirbag() string {
+	if m != nil {
+		return m.RearCentralAirbag
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetRearSeatAntiSlideAirbag() string {
+	if m != nil {
+		return m.RearSeatAntiSlideAirbag
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetRoadTrafficSignRecognition() string {
+	if m != nil {
+		return m.RoadTrafficSignRecognition
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetRunFlatTire() string {
+	if m != nil {
+		return m.RunFlatTire
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetSeatBeltWarning() string {
+	if m != nil {
+		return m.SeatBeltWarning
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Safety) GetTirePresureMonitor() string {
+	if m != nil {
+		return m.TirePresureMonitor
+	}
+	return ""
+}
+
+type StyleInfoReply_Seat struct {
+	AuxiliaryAdjustableButton   string   `protobuf:"bytes,1,opt,name=auxiliary_adjustable_button,json=auxiliaryAdjustableButton,proto3" json:"auxiliary_adjustable_button"`
+	AuxiliaryElectricAdust      string   `protobuf:"bytes,2,opt,name=auxiliary_electric_adust,json=auxiliaryElectricAdust,proto3" json:"auxiliary_electric_adust"`
+	AuxiliarySeatAdjustmentMode string   `protobuf:"bytes,3,opt,name=auxiliary_seat_adjustment_mode,json=auxiliarySeatAdjustmentMode,proto3" json:"auxiliary_seat_adjustment_mode"`
+	BackCupHolder               string   `protobuf:"bytes,4,opt,name=back_cup_holder,json=backCupHolder,proto3" json:"back_cup_holder"`
+	BackDownType                string   `protobuf:"bytes,5,opt,name=back_down_type,json=backDownType,proto3" json:"back_down_type"`
+	BackFoldTable               string   `protobuf:"bytes,6,opt,name=back_fold_table,json=backFoldTable,proto3" json:"back_fold_table"`
+	BackHandrail                string   `protobuf:"bytes,7,opt,name=back_handrail,json=backHandrail,proto3" json:"back_handrail"`
+	ElectricSeatRemeber         string   `protobuf:"bytes,8,opt,name=electric_seat_remeber,json=electricSeatRemeber,proto3" json:"electric_seat_remeber"`
+	FrontHandrail               string   `protobuf:"bytes,9,opt,name=front_handrail,json=frontHandrail,proto3" json:"front_handrail"`
+	FrontSeatFunction           string   `protobuf:"bytes,10,opt,name=front_seat_function,json=frontSeatFunction,proto3" json:"front_seat_function"`
+	HeatingCoolingCupHolder     string   `protobuf:"bytes,11,opt,name=heating_cooling_cup_holder,json=heatingCoolingCupHolder,proto3" json:"heating_cooling_cup_holder"`
+	MainElectricAdust           string   `protobuf:"bytes,12,opt,name=main_electric_adust,json=mainElectricAdust,proto3" json:"main_electric_adust"`
+	MainSeatAdjustmentMode      string   `protobuf:"bytes,13,opt,name=main_seat_adjustment_mode,json=mainSeatAdjustmentMode,proto3" json:"main_seat_adjustment_mode"`
+	RearSeatElectricAdjustment  string   `protobuf:"bytes,14,opt,name=rear_seat_electric_adjustment,json=rearSeatElectricAdjustment,proto3" json:"rear_seat_electric_adjustment"`
+	RearSeatFunction            string   `protobuf:"bytes,15,opt,name=rear_seat_function,json=rearSeatFunction,proto3" json:"rear_seat_function"`
+	RearSeatPowerDown           string   `protobuf:"bytes,16,opt,name=rear_seat_power_down,json=rearSeatPowerDown,proto3" json:"rear_seat_power_down"`
+	SeatLayoutForm              string   `protobuf:"bytes,17,opt,name=seat_layout_form,json=seatLayoutForm,proto3" json:"seat_layout_form"`
+	SeatMaterial                string   `protobuf:"bytes,18,opt,name=seat_material,json=seatMaterial,proto3" json:"seat_material"`
+	SecondIndependent           string   `protobuf:"bytes,19,opt,name=second_independent,json=secondIndependent,proto3" json:"second_independent"`
+	SecondRowSeatAdjustment     string   `protobuf:"bytes,20,opt,name=second_row_seat_adjustment,json=secondRowSeatAdjustment,proto3" json:"second_row_seat_adjustment"`
+	SportSeat                   string   `protobuf:"bytes,21,opt,name=sport_seat,json=sportSeat,proto3" json:"sport_seat"`
+	XXX_NoUnkeyedLiteral        struct{} `json:"-"`
+	XXX_unrecognized            []byte   `json:"-"`
+	XXX_sizecache               int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Seat) Reset()         { *m = StyleInfoReply_Seat{} }
+func (m *StyleInfoReply_Seat) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Seat) ProtoMessage()    {}
+func (*StyleInfoReply_Seat) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 16}
+}
+
+func (m *StyleInfoReply_Seat) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Seat.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Seat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Seat.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Seat) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Seat.Merge(m, src)
+}
+func (m *StyleInfoReply_Seat) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Seat.Size(m)
+}
+func (m *StyleInfoReply_Seat) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Seat.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Seat proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Seat) GetAuxiliaryAdjustableButton() string {
+	if m != nil {
+		return m.AuxiliaryAdjustableButton
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetAuxiliaryElectricAdust() string {
+	if m != nil {
+		return m.AuxiliaryElectricAdust
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetAuxiliarySeatAdjustmentMode() string {
+	if m != nil {
+		return m.AuxiliarySeatAdjustmentMode
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetBackCupHolder() string {
+	if m != nil {
+		return m.BackCupHolder
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetBackDownType() string {
+	if m != nil {
+		return m.BackDownType
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetBackFoldTable() string {
+	if m != nil {
+		return m.BackFoldTable
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetBackHandrail() string {
+	if m != nil {
+		return m.BackHandrail
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetElectricSeatRemeber() string {
+	if m != nil {
+		return m.ElectricSeatRemeber
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetFrontHandrail() string {
+	if m != nil {
+		return m.FrontHandrail
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetFrontSeatFunction() string {
+	if m != nil {
+		return m.FrontSeatFunction
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetHeatingCoolingCupHolder() string {
+	if m != nil {
+		return m.HeatingCoolingCupHolder
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetMainElectricAdust() string {
+	if m != nil {
+		return m.MainElectricAdust
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetMainSeatAdjustmentMode() string {
+	if m != nil {
+		return m.MainSeatAdjustmentMode
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetRearSeatElectricAdjustment() string {
+	if m != nil {
+		return m.RearSeatElectricAdjustment
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetRearSeatFunction() string {
+	if m != nil {
+		return m.RearSeatFunction
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetRearSeatPowerDown() string {
+	if m != nil {
+		return m.RearSeatPowerDown
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetSeatLayoutForm() string {
+	if m != nil {
+		return m.SeatLayoutForm
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetSeatMaterial() string {
+	if m != nil {
+		return m.SeatMaterial
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetSecondIndependent() string {
+	if m != nil {
+		return m.SecondIndependent
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetSecondRowSeatAdjustment() string {
+	if m != nil {
+		return m.SecondRowSeatAdjustment
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Seat) GetSportSeat() string {
+	if m != nil {
+		return m.SportSeat
+	}
+	return ""
+}
+
+type StyleInfoReply_Wheelbrake struct {
+	BackBrakeType           string   `protobuf:"bytes,1,opt,name=back_brake_type,json=backBrakeType,proto3" json:"back_brake_type"`
+	BackWheelSpecification  string   `protobuf:"bytes,2,opt,name=back_wheel_specification,json=backWheelSpecification,proto3" json:"back_wheel_specification"`
+	FrontBrakeType          string   `protobuf:"bytes,3,opt,name=front_brake_type,json=frontBrakeType,proto3" json:"front_brake_type"`
+	FrontWheelSpecification string   `protobuf:"bytes,4,opt,name=front_wheel_specification,json=frontWheelSpecification,proto3" json:"front_wheel_specification"`
+	ParkingBrakeType        string   `protobuf:"bytes,5,opt,name=parking_brake_type,json=parkingBrakeType,proto3" json:"parking_brake_type"`
+	SpareWheelSpecification string   `protobuf:"bytes,6,opt,name=spare_wheel_specification,json=spareWheelSpecification,proto3" json:"spare_wheel_specification"`
+	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
+	XXX_unrecognized        []byte   `json:"-"`
+	XXX_sizecache           int32    `json:"-"`
+}
+
+func (m *StyleInfoReply_Wheelbrake) Reset()         { *m = StyleInfoReply_Wheelbrake{} }
+func (m *StyleInfoReply_Wheelbrake) String() string { return proto.CompactTextString(m) }
+func (*StyleInfoReply_Wheelbrake) ProtoMessage()    {}
+func (*StyleInfoReply_Wheelbrake) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{21, 17}
+}
+
+func (m *StyleInfoReply_Wheelbrake) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleInfoReply_Wheelbrake.Unmarshal(m, b)
+}
+func (m *StyleInfoReply_Wheelbrake) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleInfoReply_Wheelbrake.Marshal(b, m, deterministic)
+}
+func (m *StyleInfoReply_Wheelbrake) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleInfoReply_Wheelbrake.Merge(m, src)
+}
+func (m *StyleInfoReply_Wheelbrake) XXX_Size() int {
+	return xxx_messageInfo_StyleInfoReply_Wheelbrake.Size(m)
+}
+func (m *StyleInfoReply_Wheelbrake) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleInfoReply_Wheelbrake.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleInfoReply_Wheelbrake proto.InternalMessageInfo
+
+func (m *StyleInfoReply_Wheelbrake) GetBackBrakeType() string {
+	if m != nil {
+		return m.BackBrakeType
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Wheelbrake) GetBackWheelSpecification() string {
+	if m != nil {
+		return m.BackWheelSpecification
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Wheelbrake) GetFrontBrakeType() string {
+	if m != nil {
+		return m.FrontBrakeType
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Wheelbrake) GetFrontWheelSpecification() string {
+	if m != nil {
+		return m.FrontWheelSpecification
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Wheelbrake) GetParkingBrakeType() string {
+	if m != nil {
+		return m.ParkingBrakeType
+	}
+	return ""
+}
+
+func (m *StyleInfoReply_Wheelbrake) GetSpareWheelSpecification() string {
+	if m != nil {
+		return m.SpareWheelSpecification
+	}
+	return ""
+}
+
+type UpdateStyleInfoRequest struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	Data                 string   `protobuf:"bytes,2,opt,name=data,proto3" json:"data"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UpdateStyleInfoRequest) Reset()         { *m = UpdateStyleInfoRequest{} }
+func (m *UpdateStyleInfoRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateStyleInfoRequest) ProtoMessage()    {}
+func (*UpdateStyleInfoRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{22}
+}
+
+func (m *UpdateStyleInfoRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdateStyleInfoRequest.Unmarshal(m, b)
+}
+func (m *UpdateStyleInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdateStyleInfoRequest.Marshal(b, m, deterministic)
+}
+func (m *UpdateStyleInfoRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdateStyleInfoRequest.Merge(m, src)
+}
+func (m *UpdateStyleInfoRequest) XXX_Size() int {
+	return xxx_messageInfo_UpdateStyleInfoRequest.Size(m)
+}
+func (m *UpdateStyleInfoRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdateStyleInfoRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdateStyleInfoRequest proto.InternalMessageInfo
+
+func (m *UpdateStyleInfoRequest) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *UpdateStyleInfoRequest) GetData() string {
+	if m != nil {
+		return m.Data
+	}
+	return ""
+}
+
+type MaintainManualRequest struct {
+	StyleId              string   `protobuf:"bytes,1,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MaintainManualRequest) Reset()         { *m = MaintainManualRequest{} }
+func (m *MaintainManualRequest) String() string { return proto.CompactTextString(m) }
+func (*MaintainManualRequest) ProtoMessage()    {}
+func (*MaintainManualRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{23}
+}
+
+func (m *MaintainManualRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MaintainManualRequest.Unmarshal(m, b)
+}
+func (m *MaintainManualRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MaintainManualRequest.Marshal(b, m, deterministic)
+}
+func (m *MaintainManualRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MaintainManualRequest.Merge(m, src)
+}
+func (m *MaintainManualRequest) XXX_Size() int {
+	return xxx_messageInfo_MaintainManualRequest.Size(m)
+}
+func (m *MaintainManualRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MaintainManualRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MaintainManualRequest proto.InternalMessageInfo
+
+func (m *MaintainManualRequest) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+type MaintainItem struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	Item                 string   `protobuf:"bytes,2,opt,name=item,proto3" json:"item"`
+	StartMile            int64    `protobuf:"varint,3,opt,name=start_mile,json=startMile,proto3" json:"start_mile"`
+	StartDate            int64    `protobuf:"varint,4,opt,name=start_date,json=startDate,proto3" json:"start_date"`
+	MileCycle            int64    `protobuf:"varint,5,opt,name=mile_cycle,json=mileCycle,proto3" json:"mile_cycle"`
+	DateCycle            int64    `protobuf:"varint,6,opt,name=date_cycle,json=dateCycle,proto3" json:"date_cycle"`
+	StyleId              string   `protobuf:"bytes,7,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	ItemId               int64    `protobuf:"varint,8,opt,name=item_id,json=itemId,proto3" json:"item_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MaintainItem) Reset()         { *m = MaintainItem{} }
+func (m *MaintainItem) String() string { return proto.CompactTextString(m) }
+func (*MaintainItem) ProtoMessage()    {}
+func (*MaintainItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{24}
+}
+
+func (m *MaintainItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MaintainItem.Unmarshal(m, b)
+}
+func (m *MaintainItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MaintainItem.Marshal(b, m, deterministic)
+}
+func (m *MaintainItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MaintainItem.Merge(m, src)
+}
+func (m *MaintainItem) XXX_Size() int {
+	return xxx_messageInfo_MaintainItem.Size(m)
+}
+func (m *MaintainItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_MaintainItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MaintainItem proto.InternalMessageInfo
+
+func (m *MaintainItem) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *MaintainItem) GetItem() string {
+	if m != nil {
+		return m.Item
+	}
+	return ""
+}
+
+func (m *MaintainItem) GetStartMile() int64 {
+	if m != nil {
+		return m.StartMile
+	}
+	return 0
+}
+
+func (m *MaintainItem) GetStartDate() int64 {
+	if m != nil {
+		return m.StartDate
+	}
+	return 0
+}
+
+func (m *MaintainItem) GetMileCycle() int64 {
+	if m != nil {
+		return m.MileCycle
+	}
+	return 0
+}
+
+func (m *MaintainItem) GetDateCycle() int64 {
+	if m != nil {
+		return m.DateCycle
+	}
+	return 0
+}
+
+func (m *MaintainItem) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+func (m *MaintainItem) GetItemId() int64 {
+	if m != nil {
+		return m.ItemId
+	}
+	return 0
+}
+
+type MaintainManualReply struct {
+	// 保养
+	Maintainance []*MaintainItem `protobuf:"bytes,1,rep,name=maintainance,proto3" json:"maintainance"`
+	// 维修
+	Repair []*MaintainItem `protobuf:"bytes,2,rep,name=repair,proto3" json:"repair"`
+	// 清洗
+	Wash                 []*MaintainItem `protobuf:"bytes,3,rep,name=wash,proto3" json:"wash"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *MaintainManualReply) Reset()         { *m = MaintainManualReply{} }
+func (m *MaintainManualReply) String() string { return proto.CompactTextString(m) }
+func (*MaintainManualReply) ProtoMessage()    {}
+func (*MaintainManualReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{25}
+}
+
+func (m *MaintainManualReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MaintainManualReply.Unmarshal(m, b)
+}
+func (m *MaintainManualReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MaintainManualReply.Marshal(b, m, deterministic)
+}
+func (m *MaintainManualReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MaintainManualReply.Merge(m, src)
+}
+func (m *MaintainManualReply) XXX_Size() int {
+	return xxx_messageInfo_MaintainManualReply.Size(m)
+}
+func (m *MaintainManualReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_MaintainManualReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MaintainManualReply proto.InternalMessageInfo
+
+func (m *MaintainManualReply) GetMaintainance() []*MaintainItem {
+	if m != nil {
+		return m.Maintainance
+	}
+	return nil
+}
+
+func (m *MaintainManualReply) GetRepair() []*MaintainItem {
+	if m != nil {
+		return m.Repair
+	}
+	return nil
+}
+
+func (m *MaintainManualReply) GetWash() []*MaintainItem {
+	if m != nil {
+		return m.Wash
+	}
+	return nil
+}
+
+type ItemListRequest struct {
+	ItemType             int64    `protobuf:"varint,1,opt,name=item_type,json=itemType,proto3" json:"item_type"`
+	StyleId              string   `protobuf:"bytes,2,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ItemListRequest) Reset()         { *m = ItemListRequest{} }
+func (m *ItemListRequest) String() string { return proto.CompactTextString(m) }
+func (*ItemListRequest) ProtoMessage()    {}
+func (*ItemListRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{26}
+}
+
+func (m *ItemListRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ItemListRequest.Unmarshal(m, b)
+}
+func (m *ItemListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ItemListRequest.Marshal(b, m, deterministic)
+}
+func (m *ItemListRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ItemListRequest.Merge(m, src)
+}
+func (m *ItemListRequest) XXX_Size() int {
+	return xxx_messageInfo_ItemListRequest.Size(m)
+}
+func (m *ItemListRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ItemListRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ItemListRequest proto.InternalMessageInfo
+
+func (m *ItemListRequest) GetItemType() int64 {
+	if m != nil {
+		return m.ItemType
+	}
+	return 0
+}
+
+func (m *ItemListRequest) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+type ItemListReply struct {
+	List                 []*ItemListReply_Item `protobuf:"bytes,1,rep,name=list,proto3" json:"list"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ItemListReply) Reset()         { *m = ItemListReply{} }
+func (m *ItemListReply) String() string { return proto.CompactTextString(m) }
+func (*ItemListReply) ProtoMessage()    {}
+func (*ItemListReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{27}
+}
+
+func (m *ItemListReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ItemListReply.Unmarshal(m, b)
+}
+func (m *ItemListReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ItemListReply.Marshal(b, m, deterministic)
+}
+func (m *ItemListReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ItemListReply.Merge(m, src)
+}
+func (m *ItemListReply) XXX_Size() int {
+	return xxx_messageInfo_ItemListReply.Size(m)
+}
+func (m *ItemListReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_ItemListReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ItemListReply proto.InternalMessageInfo
+
+func (m *ItemListReply) GetList() []*ItemListReply_Item {
+	if m != nil {
+		return m.List
+	}
+	return nil
+}
+
+type ItemListReply_Item struct {
+	ItemId               int64    `protobuf:"varint,1,opt,name=item_id,json=itemId,proto3" json:"item_id"`
+	ItemName             string   `protobuf:"bytes,2,opt,name=item_name,json=itemName,proto3" json:"item_name"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ItemListReply_Item) Reset()         { *m = ItemListReply_Item{} }
+func (m *ItemListReply_Item) String() string { return proto.CompactTextString(m) }
+func (*ItemListReply_Item) ProtoMessage()    {}
+func (*ItemListReply_Item) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{27, 0}
+}
+
+func (m *ItemListReply_Item) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ItemListReply_Item.Unmarshal(m, b)
+}
+func (m *ItemListReply_Item) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ItemListReply_Item.Marshal(b, m, deterministic)
+}
+func (m *ItemListReply_Item) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ItemListReply_Item.Merge(m, src)
+}
+func (m *ItemListReply_Item) XXX_Size() int {
+	return xxx_messageInfo_ItemListReply_Item.Size(m)
+}
+func (m *ItemListReply_Item) XXX_DiscardUnknown() {
+	xxx_messageInfo_ItemListReply_Item.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ItemListReply_Item proto.InternalMessageInfo
+
+func (m *ItemListReply_Item) GetItemId() int64 {
+	if m != nil {
+		return m.ItemId
+	}
+	return 0
+}
+
+func (m *ItemListReply_Item) GetItemName() string {
+	if m != nil {
+		return m.ItemName
+	}
+	return ""
+}
+
+type UpdateMaintainManualRequest struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	ItemId               int64    `protobuf:"varint,2,opt,name=item_id,json=itemId,proto3" json:"item_id"`
+	StartMile            int64    `protobuf:"varint,3,opt,name=start_mile,json=startMile,proto3" json:"start_mile"`
+	StartDate            int64    `protobuf:"varint,4,opt,name=start_date,json=startDate,proto3" json:"start_date"`
+	MileCycle            int64    `protobuf:"varint,5,opt,name=mile_cycle,json=mileCycle,proto3" json:"mile_cycle"`
+	DateCycle            int64    `protobuf:"varint,6,opt,name=date_cycle,json=dateCycle,proto3" json:"date_cycle"`
+	StyleId              string   `protobuf:"bytes,7,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	Name                 string   `protobuf:"bytes,8,opt,name=name,proto3" json:"name"`
+	Tid                  int64    `protobuf:"varint,9,opt,name=tid,proto3" json:"tid"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UpdateMaintainManualRequest) Reset()         { *m = UpdateMaintainManualRequest{} }
+func (m *UpdateMaintainManualRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateMaintainManualRequest) ProtoMessage()    {}
+func (*UpdateMaintainManualRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{28}
+}
+
+func (m *UpdateMaintainManualRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdateMaintainManualRequest.Unmarshal(m, b)
+}
+func (m *UpdateMaintainManualRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdateMaintainManualRequest.Marshal(b, m, deterministic)
+}
+func (m *UpdateMaintainManualRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdateMaintainManualRequest.Merge(m, src)
+}
+func (m *UpdateMaintainManualRequest) XXX_Size() int {
+	return xxx_messageInfo_UpdateMaintainManualRequest.Size(m)
+}
+func (m *UpdateMaintainManualRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdateMaintainManualRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdateMaintainManualRequest proto.InternalMessageInfo
+
+func (m *UpdateMaintainManualRequest) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *UpdateMaintainManualRequest) GetItemId() int64 {
+	if m != nil {
+		return m.ItemId
+	}
+	return 0
+}
+
+func (m *UpdateMaintainManualRequest) GetStartMile() int64 {
+	if m != nil {
+		return m.StartMile
+	}
+	return 0
+}
+
+func (m *UpdateMaintainManualRequest) GetStartDate() int64 {
+	if m != nil {
+		return m.StartDate
+	}
+	return 0
+}
+
+func (m *UpdateMaintainManualRequest) GetMileCycle() int64 {
+	if m != nil {
+		return m.MileCycle
+	}
+	return 0
+}
+
+func (m *UpdateMaintainManualRequest) GetDateCycle() int64 {
+	if m != nil {
+		return m.DateCycle
+	}
+	return 0
+}
+
+func (m *UpdateMaintainManualRequest) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+func (m *UpdateMaintainManualRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *UpdateMaintainManualRequest) GetTid() int64 {
+	if m != nil {
+		return m.Tid
+	}
+	return 0
+}
+
+type MaintainManualInfoRequest struct {
+	StyleId              string   `protobuf:"bytes,1,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MaintainManualInfoRequest) Reset()         { *m = MaintainManualInfoRequest{} }
+func (m *MaintainManualInfoRequest) String() string { return proto.CompactTextString(m) }
+func (*MaintainManualInfoRequest) ProtoMessage()    {}
+func (*MaintainManualInfoRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{29}
+}
+
+func (m *MaintainManualInfoRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MaintainManualInfoRequest.Unmarshal(m, b)
+}
+func (m *MaintainManualInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MaintainManualInfoRequest.Marshal(b, m, deterministic)
+}
+func (m *MaintainManualInfoRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MaintainManualInfoRequest.Merge(m, src)
+}
+func (m *MaintainManualInfoRequest) XXX_Size() int {
+	return xxx_messageInfo_MaintainManualInfoRequest.Size(m)
+}
+func (m *MaintainManualInfoRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MaintainManualInfoRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MaintainManualInfoRequest proto.InternalMessageInfo
+
+func (m *MaintainManualInfoRequest) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+type MaintainManualInfoReply struct {
+	Wash                 []*MaintainManualInfoReply_Wash         `protobuf:"bytes,1,rep,name=wash,proto3" json:"wash"`
+	Repair               []*MaintainManualInfoReply_Repair       `protobuf:"bytes,2,rep,name=repair,proto3" json:"repair"`
+	MaintainItem         []*MaintainManualInfoReply_MaintainItem `protobuf:"bytes,3,rep,name=maintain_item,json=maintainItem,proto3" json:"maintain_item"`
+	Maintain             []*MaintainManualInfoReply_Maintain     `protobuf:"bytes,4,rep,name=maintain,proto3" json:"maintain"`
+	Cycle                *MaintainManualInfoReply_Cycle          `protobuf:"bytes,5,opt,name=cycle,proto3" json:"cycle"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *MaintainManualInfoReply) Reset()         { *m = MaintainManualInfoReply{} }
+func (m *MaintainManualInfoReply) String() string { return proto.CompactTextString(m) }
+func (*MaintainManualInfoReply) ProtoMessage()    {}
+func (*MaintainManualInfoReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{30}
+}
+
+func (m *MaintainManualInfoReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MaintainManualInfoReply.Unmarshal(m, b)
+}
+func (m *MaintainManualInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MaintainManualInfoReply.Marshal(b, m, deterministic)
+}
+func (m *MaintainManualInfoReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MaintainManualInfoReply.Merge(m, src)
+}
+func (m *MaintainManualInfoReply) XXX_Size() int {
+	return xxx_messageInfo_MaintainManualInfoReply.Size(m)
+}
+func (m *MaintainManualInfoReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_MaintainManualInfoReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MaintainManualInfoReply proto.InternalMessageInfo
+
+func (m *MaintainManualInfoReply) GetWash() []*MaintainManualInfoReply_Wash {
+	if m != nil {
+		return m.Wash
+	}
+	return nil
+}
+
+func (m *MaintainManualInfoReply) GetRepair() []*MaintainManualInfoReply_Repair {
+	if m != nil {
+		return m.Repair
+	}
+	return nil
+}
+
+func (m *MaintainManualInfoReply) GetMaintainItem() []*MaintainManualInfoReply_MaintainItem {
+	if m != nil {
+		return m.MaintainItem
+	}
+	return nil
+}
+
+func (m *MaintainManualInfoReply) GetMaintain() []*MaintainManualInfoReply_Maintain {
+	if m != nil {
+		return m.Maintain
+	}
+	return nil
+}
+
+func (m *MaintainManualInfoReply) GetCycle() *MaintainManualInfoReply_Cycle {
+	if m != nil {
+		return m.Cycle
+	}
+	return nil
+}
+
+type MaintainManualInfoReply_Wash struct {
+	Cycle                uint32   `protobuf:"varint,1,opt,name=cycle,proto3" json:"cycle"`
+	ItemName             string   `protobuf:"bytes,2,opt,name=item_name,json=itemName,proto3" json:"item_name"`
+	ItemId               uint32   `protobuf:"varint,3,opt,name=item_id,json=itemId,proto3" json:"item_id"`
+	StartMile            int64    `protobuf:"varint,4,opt,name=start_mile,json=startMile,proto3" json:"start_mile"`
+	StartDate            int64    `protobuf:"varint,5,opt,name=start_date,json=startDate,proto3" json:"start_date"`
+	MileCycle            int64    `protobuf:"varint,6,opt,name=mile_cycle,json=mileCycle,proto3" json:"mile_cycle"`
+	DateCycle            int64    `protobuf:"varint,7,opt,name=date_cycle,json=dateCycle,proto3" json:"date_cycle"`
+	StyleId              string   `protobuf:"bytes,8,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MaintainManualInfoReply_Wash) Reset()         { *m = MaintainManualInfoReply_Wash{} }
+func (m *MaintainManualInfoReply_Wash) String() string { return proto.CompactTextString(m) }
+func (*MaintainManualInfoReply_Wash) ProtoMessage()    {}
+func (*MaintainManualInfoReply_Wash) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{30, 0}
+}
+
+func (m *MaintainManualInfoReply_Wash) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MaintainManualInfoReply_Wash.Unmarshal(m, b)
+}
+func (m *MaintainManualInfoReply_Wash) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MaintainManualInfoReply_Wash.Marshal(b, m, deterministic)
+}
+func (m *MaintainManualInfoReply_Wash) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MaintainManualInfoReply_Wash.Merge(m, src)
+}
+func (m *MaintainManualInfoReply_Wash) XXX_Size() int {
+	return xxx_messageInfo_MaintainManualInfoReply_Wash.Size(m)
+}
+func (m *MaintainManualInfoReply_Wash) XXX_DiscardUnknown() {
+	xxx_messageInfo_MaintainManualInfoReply_Wash.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MaintainManualInfoReply_Wash proto.InternalMessageInfo
+
+func (m *MaintainManualInfoReply_Wash) GetCycle() uint32 {
+	if m != nil {
+		return m.Cycle
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Wash) GetItemName() string {
+	if m != nil {
+		return m.ItemName
+	}
+	return ""
+}
+
+func (m *MaintainManualInfoReply_Wash) GetItemId() uint32 {
+	if m != nil {
+		return m.ItemId
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Wash) GetStartMile() int64 {
+	if m != nil {
+		return m.StartMile
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Wash) GetStartDate() int64 {
+	if m != nil {
+		return m.StartDate
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Wash) GetMileCycle() int64 {
+	if m != nil {
+		return m.MileCycle
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Wash) GetDateCycle() int64 {
+	if m != nil {
+		return m.DateCycle
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Wash) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+type MaintainManualInfoReply_Repair struct {
+	Cycle                uint32   `protobuf:"varint,1,opt,name=cycle,proto3" json:"cycle"`
+	ItemName             string   `protobuf:"bytes,2,opt,name=item_name,json=itemName,proto3" json:"item_name"`
+	ItemId               uint32   `protobuf:"varint,3,opt,name=item_id,json=itemId,proto3" json:"item_id"`
+	StartMile            int64    `protobuf:"varint,4,opt,name=start_mile,json=startMile,proto3" json:"start_mile"`
+	StartDate            int64    `protobuf:"varint,5,opt,name=start_date,json=startDate,proto3" json:"start_date"`
+	MileCycle            int64    `protobuf:"varint,6,opt,name=mile_cycle,json=mileCycle,proto3" json:"mile_cycle"`
+	DateCycle            int64    `protobuf:"varint,7,opt,name=date_cycle,json=dateCycle,proto3" json:"date_cycle"`
+	StyleId              string   `protobuf:"bytes,8,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MaintainManualInfoReply_Repair) Reset()         { *m = MaintainManualInfoReply_Repair{} }
+func (m *MaintainManualInfoReply_Repair) String() string { return proto.CompactTextString(m) }
+func (*MaintainManualInfoReply_Repair) ProtoMessage()    {}
+func (*MaintainManualInfoReply_Repair) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{30, 1}
+}
+
+func (m *MaintainManualInfoReply_Repair) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MaintainManualInfoReply_Repair.Unmarshal(m, b)
+}
+func (m *MaintainManualInfoReply_Repair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MaintainManualInfoReply_Repair.Marshal(b, m, deterministic)
+}
+func (m *MaintainManualInfoReply_Repair) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MaintainManualInfoReply_Repair.Merge(m, src)
+}
+func (m *MaintainManualInfoReply_Repair) XXX_Size() int {
+	return xxx_messageInfo_MaintainManualInfoReply_Repair.Size(m)
+}
+func (m *MaintainManualInfoReply_Repair) XXX_DiscardUnknown() {
+	xxx_messageInfo_MaintainManualInfoReply_Repair.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MaintainManualInfoReply_Repair proto.InternalMessageInfo
+
+func (m *MaintainManualInfoReply_Repair) GetCycle() uint32 {
+	if m != nil {
+		return m.Cycle
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Repair) GetItemName() string {
+	if m != nil {
+		return m.ItemName
+	}
+	return ""
+}
+
+func (m *MaintainManualInfoReply_Repair) GetItemId() uint32 {
+	if m != nil {
+		return m.ItemId
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Repair) GetStartMile() int64 {
+	if m != nil {
+		return m.StartMile
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Repair) GetStartDate() int64 {
+	if m != nil {
+		return m.StartDate
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Repair) GetMileCycle() int64 {
+	if m != nil {
+		return m.MileCycle
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Repair) GetDateCycle() int64 {
+	if m != nil {
+		return m.DateCycle
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Repair) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+type MaintainManualInfoReply_MaintainItem struct {
+	ItemName             string   `protobuf:"bytes,1,opt,name=item_name,json=itemName,proto3" json:"item_name"`
+	ItemId               uint32   `protobuf:"varint,2,opt,name=item_id,json=itemId,proto3" json:"item_id"`
+	StartMile            int64    `protobuf:"varint,3,opt,name=start_mile,json=startMile,proto3" json:"start_mile"`
+	StartDate            int64    `protobuf:"varint,4,opt,name=start_date,json=startDate,proto3" json:"start_date"`
+	MileCycle            int64    `protobuf:"varint,5,opt,name=mile_cycle,json=mileCycle,proto3" json:"mile_cycle"`
+	DateCycle            int64    `protobuf:"varint,6,opt,name=date_cycle,json=dateCycle,proto3" json:"date_cycle"`
+	StyleId              string   `protobuf:"bytes,7,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MaintainManualInfoReply_MaintainItem) Reset()         { *m = MaintainManualInfoReply_MaintainItem{} }
+func (m *MaintainManualInfoReply_MaintainItem) String() string { return proto.CompactTextString(m) }
+func (*MaintainManualInfoReply_MaintainItem) ProtoMessage()    {}
+func (*MaintainManualInfoReply_MaintainItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{30, 2}
+}
+
+func (m *MaintainManualInfoReply_MaintainItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MaintainManualInfoReply_MaintainItem.Unmarshal(m, b)
+}
+func (m *MaintainManualInfoReply_MaintainItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MaintainManualInfoReply_MaintainItem.Marshal(b, m, deterministic)
+}
+func (m *MaintainManualInfoReply_MaintainItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MaintainManualInfoReply_MaintainItem.Merge(m, src)
+}
+func (m *MaintainManualInfoReply_MaintainItem) XXX_Size() int {
+	return xxx_messageInfo_MaintainManualInfoReply_MaintainItem.Size(m)
+}
+func (m *MaintainManualInfoReply_MaintainItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_MaintainManualInfoReply_MaintainItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MaintainManualInfoReply_MaintainItem proto.InternalMessageInfo
+
+func (m *MaintainManualInfoReply_MaintainItem) GetItemName() string {
+	if m != nil {
+		return m.ItemName
+	}
+	return ""
+}
+
+func (m *MaintainManualInfoReply_MaintainItem) GetItemId() uint32 {
+	if m != nil {
+		return m.ItemId
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_MaintainItem) GetStartMile() int64 {
+	if m != nil {
+		return m.StartMile
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_MaintainItem) GetStartDate() int64 {
+	if m != nil {
+		return m.StartDate
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_MaintainItem) GetMileCycle() int64 {
+	if m != nil {
+		return m.MileCycle
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_MaintainItem) GetDateCycle() int64 {
+	if m != nil {
+		return m.DateCycle
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_MaintainItem) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+type MaintainManualInfoReply_Items struct {
+	Level                uint32   `protobuf:"varint,1,opt,name=level,proto3" json:"level"`
+	ItemName             string   `protobuf:"bytes,2,opt,name=item_name,json=itemName,proto3" json:"item_name"`
+	ItemId               uint32   `protobuf:"varint,3,opt,name=item_id,json=itemId,proto3" json:"item_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MaintainManualInfoReply_Items) Reset()         { *m = MaintainManualInfoReply_Items{} }
+func (m *MaintainManualInfoReply_Items) String() string { return proto.CompactTextString(m) }
+func (*MaintainManualInfoReply_Items) ProtoMessage()    {}
+func (*MaintainManualInfoReply_Items) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{30, 3}
+}
+
+func (m *MaintainManualInfoReply_Items) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MaintainManualInfoReply_Items.Unmarshal(m, b)
+}
+func (m *MaintainManualInfoReply_Items) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MaintainManualInfoReply_Items.Marshal(b, m, deterministic)
+}
+func (m *MaintainManualInfoReply_Items) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MaintainManualInfoReply_Items.Merge(m, src)
+}
+func (m *MaintainManualInfoReply_Items) XXX_Size() int {
+	return xxx_messageInfo_MaintainManualInfoReply_Items.Size(m)
+}
+func (m *MaintainManualInfoReply_Items) XXX_DiscardUnknown() {
+	xxx_messageInfo_MaintainManualInfoReply_Items.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MaintainManualInfoReply_Items proto.InternalMessageInfo
+
+func (m *MaintainManualInfoReply_Items) GetLevel() uint32 {
+	if m != nil {
+		return m.Level
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Items) GetItemName() string {
+	if m != nil {
+		return m.ItemName
+	}
+	return ""
+}
+
+func (m *MaintainManualInfoReply_Items) GetItemId() uint32 {
+	if m != nil {
+		return m.ItemId
+	}
+	return 0
+}
+
+type MaintainManualInfoReply_Maintain struct {
+	Age                  uint32                           `protobuf:"varint,1,opt,name=age,proto3" json:"age"`
+	Mile                 uint32                           `protobuf:"varint,2,opt,name=mile,proto3" json:"mile"`
+	Items                []*MaintainManualInfoReply_Items `protobuf:"bytes,3,rep,name=items,proto3" json:"items"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *MaintainManualInfoReply_Maintain) Reset()         { *m = MaintainManualInfoReply_Maintain{} }
+func (m *MaintainManualInfoReply_Maintain) String() string { return proto.CompactTextString(m) }
+func (*MaintainManualInfoReply_Maintain) ProtoMessage()    {}
+func (*MaintainManualInfoReply_Maintain) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{30, 4}
+}
+
+func (m *MaintainManualInfoReply_Maintain) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MaintainManualInfoReply_Maintain.Unmarshal(m, b)
+}
+func (m *MaintainManualInfoReply_Maintain) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MaintainManualInfoReply_Maintain.Marshal(b, m, deterministic)
+}
+func (m *MaintainManualInfoReply_Maintain) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MaintainManualInfoReply_Maintain.Merge(m, src)
+}
+func (m *MaintainManualInfoReply_Maintain) XXX_Size() int {
+	return xxx_messageInfo_MaintainManualInfoReply_Maintain.Size(m)
+}
+func (m *MaintainManualInfoReply_Maintain) XXX_DiscardUnknown() {
+	xxx_messageInfo_MaintainManualInfoReply_Maintain.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MaintainManualInfoReply_Maintain proto.InternalMessageInfo
+
+func (m *MaintainManualInfoReply_Maintain) GetAge() uint32 {
+	if m != nil {
+		return m.Age
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Maintain) GetMile() uint32 {
+	if m != nil {
+		return m.Mile
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Maintain) GetItems() []*MaintainManualInfoReply_Items {
+	if m != nil {
+		return m.Items
+	}
+	return nil
+}
+
+type MaintainManualInfoReply_Cycle struct {
+	StartMile            int64    `protobuf:"varint,1,opt,name=start_mile,json=startMile,proto3" json:"start_mile"`
+	StartDate            int64    `protobuf:"varint,2,opt,name=start_date,json=startDate,proto3" json:"start_date"`
+	MileCycle            int64    `protobuf:"varint,3,opt,name=mile_cycle,json=mileCycle,proto3" json:"mile_cycle"`
+	DateCycle            int64    `protobuf:"varint,4,opt,name=date_cycle,json=dateCycle,proto3" json:"date_cycle"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MaintainManualInfoReply_Cycle) Reset()         { *m = MaintainManualInfoReply_Cycle{} }
+func (m *MaintainManualInfoReply_Cycle) String() string { return proto.CompactTextString(m) }
+func (*MaintainManualInfoReply_Cycle) ProtoMessage()    {}
+func (*MaintainManualInfoReply_Cycle) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{30, 5}
+}
+
+func (m *MaintainManualInfoReply_Cycle) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MaintainManualInfoReply_Cycle.Unmarshal(m, b)
+}
+func (m *MaintainManualInfoReply_Cycle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MaintainManualInfoReply_Cycle.Marshal(b, m, deterministic)
+}
+func (m *MaintainManualInfoReply_Cycle) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MaintainManualInfoReply_Cycle.Merge(m, src)
+}
+func (m *MaintainManualInfoReply_Cycle) XXX_Size() int {
+	return xxx_messageInfo_MaintainManualInfoReply_Cycle.Size(m)
+}
+func (m *MaintainManualInfoReply_Cycle) XXX_DiscardUnknown() {
+	xxx_messageInfo_MaintainManualInfoReply_Cycle.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MaintainManualInfoReply_Cycle proto.InternalMessageInfo
+
+func (m *MaintainManualInfoReply_Cycle) GetStartMile() int64 {
+	if m != nil {
+		return m.StartMile
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Cycle) GetStartDate() int64 {
+	if m != nil {
+		return m.StartDate
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Cycle) GetMileCycle() int64 {
+	if m != nil {
+		return m.MileCycle
+	}
+	return 0
+}
+
+func (m *MaintainManualInfoReply_Cycle) GetDateCycle() int64 {
+	if m != nil {
+		return m.DateCycle
+	}
+	return 0
+}
+
+type StyleItem struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	C2Name               string   `protobuf:"bytes,2,opt,name=c2_name,json=c2Name,proto3" json:"c2_name"`
+	C2Id                 int64    `protobuf:"varint,3,opt,name=c2_id,json=c2Id,proto3" json:"c2_id"`
+	Useage               string   `protobuf:"bytes,4,opt,name=useage,proto3" json:"useage"`
+	Detail               string   `protobuf:"bytes,5,opt,name=detail,proto3" json:"detail"`
+	AttributeRule        string   `protobuf:"bytes,6,opt,name=attribute_rule,json=attributeRule,proto3" json:"attribute_rule"`
+	StyleId              string   `protobuf:"bytes,7,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StyleItem) Reset()         { *m = StyleItem{} }
+func (m *StyleItem) String() string { return proto.CompactTextString(m) }
+func (*StyleItem) ProtoMessage()    {}
+func (*StyleItem) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{31}
+}
+
+func (m *StyleItem) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleItem.Unmarshal(m, b)
+}
+func (m *StyleItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleItem.Marshal(b, m, deterministic)
+}
+func (m *StyleItem) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleItem.Merge(m, src)
+}
+func (m *StyleItem) XXX_Size() int {
+	return xxx_messageInfo_StyleItem.Size(m)
+}
+func (m *StyleItem) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleItem.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleItem proto.InternalMessageInfo
+
+func (m *StyleItem) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *StyleItem) GetC2Name() string {
+	if m != nil {
+		return m.C2Name
+	}
+	return ""
+}
+
+func (m *StyleItem) GetC2Id() int64 {
+	if m != nil {
+		return m.C2Id
+	}
+	return 0
+}
+
+func (m *StyleItem) GetUseage() string {
+	if m != nil {
+		return m.Useage
+	}
+	return ""
+}
+
+func (m *StyleItem) GetDetail() string {
+	if m != nil {
+		return m.Detail
+	}
+	return ""
+}
+
+func (m *StyleItem) GetAttributeRule() string {
+	if m != nil {
+		return m.AttributeRule
+	}
+	return ""
+}
+
+func (m *StyleItem) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+type StyleItemReply struct {
+	List                 []*StyleItem `protobuf:"bytes,1,rep,name=list,proto3" json:"list"`
+	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
+	XXX_unrecognized     []byte       `json:"-"`
+	XXX_sizecache        int32        `json:"-"`
+}
+
+func (m *StyleItemReply) Reset()         { *m = StyleItemReply{} }
+func (m *StyleItemReply) String() string { return proto.CompactTextString(m) }
+func (*StyleItemReply) ProtoMessage()    {}
+func (*StyleItemReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{32}
+}
+
+func (m *StyleItemReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StyleItemReply.Unmarshal(m, b)
+}
+func (m *StyleItemReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StyleItemReply.Marshal(b, m, deterministic)
+}
+func (m *StyleItemReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StyleItemReply.Merge(m, src)
+}
+func (m *StyleItemReply) XXX_Size() int {
+	return xxx_messageInfo_StyleItemReply.Size(m)
+}
+func (m *StyleItemReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_StyleItemReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StyleItemReply proto.InternalMessageInfo
+
+func (m *StyleItemReply) GetList() []*StyleItem {
+	if m != nil {
+		return m.List
+	}
+	return nil
+}
+
+type C2ListRequest struct {
+	StyleId              string   `protobuf:"bytes,1,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *C2ListRequest) Reset()         { *m = C2ListRequest{} }
+func (m *C2ListRequest) String() string { return proto.CompactTextString(m) }
+func (*C2ListRequest) ProtoMessage()    {}
+func (*C2ListRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{33}
+}
+
+func (m *C2ListRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_C2ListRequest.Unmarshal(m, b)
+}
+func (m *C2ListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_C2ListRequest.Marshal(b, m, deterministic)
+}
+func (m *C2ListRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_C2ListRequest.Merge(m, src)
+}
+func (m *C2ListRequest) XXX_Size() int {
+	return xxx_messageInfo_C2ListRequest.Size(m)
+}
+func (m *C2ListRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_C2ListRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_C2ListRequest proto.InternalMessageInfo
+
+func (m *C2ListRequest) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+type C2ListReply struct {
+	List                 []*C2ListReply_Info `protobuf:"bytes,1,rep,name=list,proto3" json:"list"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *C2ListReply) Reset()         { *m = C2ListReply{} }
+func (m *C2ListReply) String() string { return proto.CompactTextString(m) }
+func (*C2ListReply) ProtoMessage()    {}
+func (*C2ListReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{34}
+}
+
+func (m *C2ListReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_C2ListReply.Unmarshal(m, b)
+}
+func (m *C2ListReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_C2ListReply.Marshal(b, m, deterministic)
+}
+func (m *C2ListReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_C2ListReply.Merge(m, src)
+}
+func (m *C2ListReply) XXX_Size() int {
+	return xxx_messageInfo_C2ListReply.Size(m)
+}
+func (m *C2ListReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_C2ListReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_C2ListReply proto.InternalMessageInfo
+
+func (m *C2ListReply) GetList() []*C2ListReply_Info {
+	if m != nil {
+		return m.List
+	}
+	return nil
+}
+
+type C2ListReply_Info struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	Name                 string   `protobuf:"bytes,2,opt,name=name,proto3" json:"name"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *C2ListReply_Info) Reset()         { *m = C2ListReply_Info{} }
+func (m *C2ListReply_Info) String() string { return proto.CompactTextString(m) }
+func (*C2ListReply_Info) ProtoMessage()    {}
+func (*C2ListReply_Info) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{34, 0}
+}
+
+func (m *C2ListReply_Info) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_C2ListReply_Info.Unmarshal(m, b)
+}
+func (m *C2ListReply_Info) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_C2ListReply_Info.Marshal(b, m, deterministic)
+}
+func (m *C2ListReply_Info) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_C2ListReply_Info.Merge(m, src)
+}
+func (m *C2ListReply_Info) XXX_Size() int {
+	return xxx_messageInfo_C2ListReply_Info.Size(m)
+}
+func (m *C2ListReply_Info) XXX_DiscardUnknown() {
+	xxx_messageInfo_C2ListReply_Info.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_C2ListReply_Info proto.InternalMessageInfo
+
+func (m *C2ListReply_Info) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *C2ListReply_Info) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+type UpdateStyleItemRequest struct {
+	List                 []*StyleItem `protobuf:"bytes,1,rep,name=list,proto3" json:"list"`
+	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
+	XXX_unrecognized     []byte       `json:"-"`
+	XXX_sizecache        int32        `json:"-"`
+}
+
+func (m *UpdateStyleItemRequest) Reset()         { *m = UpdateStyleItemRequest{} }
+func (m *UpdateStyleItemRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateStyleItemRequest) ProtoMessage()    {}
+func (*UpdateStyleItemRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{35}
+}
+
+func (m *UpdateStyleItemRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdateStyleItemRequest.Unmarshal(m, b)
+}
+func (m *UpdateStyleItemRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdateStyleItemRequest.Marshal(b, m, deterministic)
+}
+func (m *UpdateStyleItemRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdateStyleItemRequest.Merge(m, src)
+}
+func (m *UpdateStyleItemRequest) XXX_Size() int {
+	return xxx_messageInfo_UpdateStyleItemRequest.Size(m)
+}
+func (m *UpdateStyleItemRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdateStyleItemRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdateStyleItemRequest proto.InternalMessageInfo
+
+func (m *UpdateStyleItemRequest) GetList() []*StyleItem {
+	if m != nil {
+		return m.List
+	}
+	return nil
+}
+
+type DeleteMaintainaceRequest struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DeleteMaintainaceRequest) Reset()         { *m = DeleteMaintainaceRequest{} }
+func (m *DeleteMaintainaceRequest) String() string { return proto.CompactTextString(m) }
+func (*DeleteMaintainaceRequest) ProtoMessage()    {}
+func (*DeleteMaintainaceRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{36}
+}
+
+func (m *DeleteMaintainaceRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DeleteMaintainaceRequest.Unmarshal(m, b)
+}
+func (m *DeleteMaintainaceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DeleteMaintainaceRequest.Marshal(b, m, deterministic)
+}
+func (m *DeleteMaintainaceRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DeleteMaintainaceRequest.Merge(m, src)
+}
+func (m *DeleteMaintainaceRequest) XXX_Size() int {
+	return xxx_messageInfo_DeleteMaintainaceRequest.Size(m)
+}
+func (m *DeleteMaintainaceRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_DeleteMaintainaceRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DeleteMaintainaceRequest proto.InternalMessageInfo
+
+func (m *DeleteMaintainaceRequest) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+type ExportStyleRequest struct {
+	TaskName             string   `protobuf:"bytes,1,opt,name=task_name,json=taskName,proto3" json:"task_name"`
+	Fields               string   `protobuf:"bytes,2,opt,name=fields,proto3" json:"fields"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ExportStyleRequest) Reset()         { *m = ExportStyleRequest{} }
+func (m *ExportStyleRequest) String() string { return proto.CompactTextString(m) }
+func (*ExportStyleRequest) ProtoMessage()    {}
+func (*ExportStyleRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{37}
+}
+
+func (m *ExportStyleRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExportStyleRequest.Unmarshal(m, b)
+}
+func (m *ExportStyleRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExportStyleRequest.Marshal(b, m, deterministic)
+}
+func (m *ExportStyleRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExportStyleRequest.Merge(m, src)
+}
+func (m *ExportStyleRequest) XXX_Size() int {
+	return xxx_messageInfo_ExportStyleRequest.Size(m)
+}
+func (m *ExportStyleRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExportStyleRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExportStyleRequest proto.InternalMessageInfo
+
+func (m *ExportStyleRequest) GetTaskName() string {
+	if m != nil {
+		return m.TaskName
+	}
+	return ""
+}
+
+func (m *ExportStyleRequest) GetFields() string {
+	if m != nil {
+		return m.Fields
+	}
+	return ""
+}
+
+type ExportStyleReply struct {
+	ExportId             int64    `protobuf:"varint,1,opt,name=export_id,json=exportId,proto3" json:"export_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ExportStyleReply) Reset()         { *m = ExportStyleReply{} }
+func (m *ExportStyleReply) String() string { return proto.CompactTextString(m) }
+func (*ExportStyleReply) ProtoMessage()    {}
+func (*ExportStyleReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{38}
+}
+
+func (m *ExportStyleReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExportStyleReply.Unmarshal(m, b)
+}
+func (m *ExportStyleReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExportStyleReply.Marshal(b, m, deterministic)
+}
+func (m *ExportStyleReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExportStyleReply.Merge(m, src)
+}
+func (m *ExportStyleReply) XXX_Size() int {
+	return xxx_messageInfo_ExportStyleReply.Size(m)
+}
+func (m *ExportStyleReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExportStyleReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExportStyleReply proto.InternalMessageInfo
+
+func (m *ExportStyleReply) GetExportId() int64 {
+	if m != nil {
+		return m.ExportId
+	}
+	return 0
+}
+
+type ExportStyleTaskList struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	TaskName             string   `protobuf:"bytes,2,opt,name=task_name,json=taskName,proto3" json:"task_name"`
+	Path                 string   `protobuf:"bytes,3,opt,name=path,proto3" json:"path"`
+	CreatedAt            string   `protobuf:"bytes,4,opt,name=created_at,json=createdAt,proto3" json:"created_at"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ExportStyleTaskList) Reset()         { *m = ExportStyleTaskList{} }
+func (m *ExportStyleTaskList) String() string { return proto.CompactTextString(m) }
+func (*ExportStyleTaskList) ProtoMessage()    {}
+func (*ExportStyleTaskList) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{39}
+}
+
+func (m *ExportStyleTaskList) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExportStyleTaskList.Unmarshal(m, b)
+}
+func (m *ExportStyleTaskList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExportStyleTaskList.Marshal(b, m, deterministic)
+}
+func (m *ExportStyleTaskList) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExportStyleTaskList.Merge(m, src)
+}
+func (m *ExportStyleTaskList) XXX_Size() int {
+	return xxx_messageInfo_ExportStyleTaskList.Size(m)
+}
+func (m *ExportStyleTaskList) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExportStyleTaskList.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExportStyleTaskList proto.InternalMessageInfo
+
+func (m *ExportStyleTaskList) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *ExportStyleTaskList) GetTaskName() string {
+	if m != nil {
+		return m.TaskName
+	}
+	return ""
+}
+
+func (m *ExportStyleTaskList) GetPath() string {
+	if m != nil {
+		return m.Path
+	}
+	return ""
+}
+
+func (m *ExportStyleTaskList) GetCreatedAt() string {
+	if m != nil {
+		return m.CreatedAt
+	}
+	return ""
+}
+
+type ExportStyleTaskListReply struct {
+	List                 []*ExportStyleTaskList `protobuf:"bytes,1,rep,name=list,proto3" json:"list"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *ExportStyleTaskListReply) Reset()         { *m = ExportStyleTaskListReply{} }
+func (m *ExportStyleTaskListReply) String() string { return proto.CompactTextString(m) }
+func (*ExportStyleTaskListReply) ProtoMessage()    {}
+func (*ExportStyleTaskListReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{40}
+}
+
+func (m *ExportStyleTaskListReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExportStyleTaskListReply.Unmarshal(m, b)
+}
+func (m *ExportStyleTaskListReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExportStyleTaskListReply.Marshal(b, m, deterministic)
+}
+func (m *ExportStyleTaskListReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExportStyleTaskListReply.Merge(m, src)
+}
+func (m *ExportStyleTaskListReply) XXX_Size() int {
+	return xxx_messageInfo_ExportStyleTaskListReply.Size(m)
+}
+func (m *ExportStyleTaskListReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExportStyleTaskListReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExportStyleTaskListReply proto.InternalMessageInfo
+
+func (m *ExportStyleTaskListReply) GetList() []*ExportStyleTaskList {
+	if m != nil {
+		return m.List
+	}
+	return nil
+}
+
+type DeleteExportStyleTaskRequest struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DeleteExportStyleTaskRequest) Reset()         { *m = DeleteExportStyleTaskRequest{} }
+func (m *DeleteExportStyleTaskRequest) String() string { return proto.CompactTextString(m) }
+func (*DeleteExportStyleTaskRequest) ProtoMessage()    {}
+func (*DeleteExportStyleTaskRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{41}
+}
+
+func (m *DeleteExportStyleTaskRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DeleteExportStyleTaskRequest.Unmarshal(m, b)
+}
+func (m *DeleteExportStyleTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DeleteExportStyleTaskRequest.Marshal(b, m, deterministic)
+}
+func (m *DeleteExportStyleTaskRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DeleteExportStyleTaskRequest.Merge(m, src)
+}
+func (m *DeleteExportStyleTaskRequest) XXX_Size() int {
+	return xxx_messageInfo_DeleteExportStyleTaskRequest.Size(m)
+}
+func (m *DeleteExportStyleTaskRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_DeleteExportStyleTaskRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DeleteExportStyleTaskRequest proto.InternalMessageInfo
+
+func (m *DeleteExportStyleTaskRequest) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+type DeleteStyleItemRequest struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DeleteStyleItemRequest) Reset()         { *m = DeleteStyleItemRequest{} }
+func (m *DeleteStyleItemRequest) String() string { return proto.CompactTextString(m) }
+func (*DeleteStyleItemRequest) ProtoMessage()    {}
+func (*DeleteStyleItemRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{42}
+}
+
+func (m *DeleteStyleItemRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DeleteStyleItemRequest.Unmarshal(m, b)
+}
+func (m *DeleteStyleItemRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DeleteStyleItemRequest.Marshal(b, m, deterministic)
+}
+func (m *DeleteStyleItemRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DeleteStyleItemRequest.Merge(m, src)
+}
+func (m *DeleteStyleItemRequest) XXX_Size() int {
+	return xxx_messageInfo_DeleteStyleItemRequest.Size(m)
+}
+func (m *DeleteStyleItemRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_DeleteStyleItemRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DeleteStyleItemRequest proto.InternalMessageInfo
+
+func (m *DeleteStyleItemRequest) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+type TemplateListRequest struct {
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TemplateListRequest) Reset()         { *m = TemplateListRequest{} }
+func (m *TemplateListRequest) String() string { return proto.CompactTextString(m) }
+func (*TemplateListRequest) ProtoMessage()    {}
+func (*TemplateListRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{43}
+}
+
+func (m *TemplateListRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TemplateListRequest.Unmarshal(m, b)
+}
+func (m *TemplateListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TemplateListRequest.Marshal(b, m, deterministic)
+}
+func (m *TemplateListRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TemplateListRequest.Merge(m, src)
+}
+func (m *TemplateListRequest) XXX_Size() int {
+	return xxx_messageInfo_TemplateListRequest.Size(m)
+}
+func (m *TemplateListRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_TemplateListRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TemplateListRequest proto.InternalMessageInfo
+
+func (m *TemplateListRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+type Template struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	Name                 string   `protobuf:"bytes,2,opt,name=name,proto3" json:"name"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Template) Reset()         { *m = Template{} }
+func (m *Template) String() string { return proto.CompactTextString(m) }
+func (*Template) ProtoMessage()    {}
+func (*Template) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{44}
+}
+
+func (m *Template) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Template.Unmarshal(m, b)
+}
+func (m *Template) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Template.Marshal(b, m, deterministic)
+}
+func (m *Template) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Template.Merge(m, src)
+}
+func (m *Template) XXX_Size() int {
+	return xxx_messageInfo_Template.Size(m)
+}
+func (m *Template) XXX_DiscardUnknown() {
+	xxx_messageInfo_Template.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Template proto.InternalMessageInfo
+
+func (m *Template) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *Template) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+type TemplateListReply struct {
+	List                 []*Template `protobuf:"bytes,1,rep,name=list,proto3" json:"list"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *TemplateListReply) Reset()         { *m = TemplateListReply{} }
+func (m *TemplateListReply) String() string { return proto.CompactTextString(m) }
+func (*TemplateListReply) ProtoMessage()    {}
+func (*TemplateListReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{45}
+}
+
+func (m *TemplateListReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TemplateListReply.Unmarshal(m, b)
+}
+func (m *TemplateListReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TemplateListReply.Marshal(b, m, deterministic)
+}
+func (m *TemplateListReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TemplateListReply.Merge(m, src)
+}
+func (m *TemplateListReply) XXX_Size() int {
+	return xxx_messageInfo_TemplateListReply.Size(m)
+}
+func (m *TemplateListReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_TemplateListReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TemplateListReply proto.InternalMessageInfo
+
+func (m *TemplateListReply) GetList() []*Template {
+	if m != nil {
+		return m.List
+	}
+	return nil
+}
+
+type TemplateDetailListRequest struct {
+	Tid int64 `protobuf:"varint,1,opt,name=tid,proto3" json:"tid"`
+	// 分页
+	PageSize             int32    `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size"`
+	Page                 int32    `protobuf:"varint,3,opt,name=page,proto3" json:"page"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TemplateDetailListRequest) Reset()         { *m = TemplateDetailListRequest{} }
+func (m *TemplateDetailListRequest) String() string { return proto.CompactTextString(m) }
+func (*TemplateDetailListRequest) ProtoMessage()    {}
+func (*TemplateDetailListRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{46}
+}
+
+func (m *TemplateDetailListRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TemplateDetailListRequest.Unmarshal(m, b)
+}
+func (m *TemplateDetailListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TemplateDetailListRequest.Marshal(b, m, deterministic)
+}
+func (m *TemplateDetailListRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TemplateDetailListRequest.Merge(m, src)
+}
+func (m *TemplateDetailListRequest) XXX_Size() int {
+	return xxx_messageInfo_TemplateDetailListRequest.Size(m)
+}
+func (m *TemplateDetailListRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_TemplateDetailListRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TemplateDetailListRequest proto.InternalMessageInfo
+
+func (m *TemplateDetailListRequest) GetTid() int64 {
+	if m != nil {
+		return m.Tid
+	}
+	return 0
+}
+
+func (m *TemplateDetailListRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+func (m *TemplateDetailListRequest) GetPage() int32 {
+	if m != nil {
+		return m.Page
+	}
+	return 0
+}
+
+type TemplateDetail struct {
+	Id                   int64    `protobuf:"varint,1,opt,name=id,proto3" json:"id"`
+	Name                 string   `protobuf:"bytes,2,opt,name=name,proto3" json:"name"`
+	StartMile            int64    `protobuf:"varint,3,opt,name=start_mile,json=startMile,proto3" json:"start_mile"`
+	StartDate            int64    `protobuf:"varint,4,opt,name=start_date,json=startDate,proto3" json:"start_date"`
+	MaintainMileMinCycle int64    `protobuf:"varint,5,opt,name=maintain_mile_min_cycle,json=maintainMileMinCycle,proto3" json:"maintain_mile_min_cycle"`
+	MaintainDateMinCycle int64    `protobuf:"varint,6,opt,name=maintain_date_min_cycle,json=maintainDateMinCycle,proto3" json:"maintain_date_min_cycle"`
+	Tid                  int64    `protobuf:"varint,7,opt,name=tid,proto3" json:"tid"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TemplateDetail) Reset()         { *m = TemplateDetail{} }
+func (m *TemplateDetail) String() string { return proto.CompactTextString(m) }
+func (*TemplateDetail) ProtoMessage()    {}
+func (*TemplateDetail) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{47}
+}
+
+func (m *TemplateDetail) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TemplateDetail.Unmarshal(m, b)
+}
+func (m *TemplateDetail) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TemplateDetail.Marshal(b, m, deterministic)
+}
+func (m *TemplateDetail) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TemplateDetail.Merge(m, src)
+}
+func (m *TemplateDetail) XXX_Size() int {
+	return xxx_messageInfo_TemplateDetail.Size(m)
+}
+func (m *TemplateDetail) XXX_DiscardUnknown() {
+	xxx_messageInfo_TemplateDetail.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TemplateDetail proto.InternalMessageInfo
+
+func (m *TemplateDetail) GetId() int64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *TemplateDetail) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *TemplateDetail) GetStartMile() int64 {
+	if m != nil {
+		return m.StartMile
+	}
+	return 0
+}
+
+func (m *TemplateDetail) GetStartDate() int64 {
+	if m != nil {
+		return m.StartDate
+	}
+	return 0
+}
+
+func (m *TemplateDetail) GetMaintainMileMinCycle() int64 {
+	if m != nil {
+		return m.MaintainMileMinCycle
+	}
+	return 0
+}
+
+func (m *TemplateDetail) GetMaintainDateMinCycle() int64 {
+	if m != nil {
+		return m.MaintainDateMinCycle
+	}
+	return 0
+}
+
+func (m *TemplateDetail) GetTid() int64 {
+	if m != nil {
+		return m.Tid
+	}
+	return 0
+}
+
+type TemplateDetailListReply struct {
+	List                 []*TemplateDetail `protobuf:"bytes,1,rep,name=list,proto3" json:"list"`
+	Total                int64             `protobuf:"varint,2,opt,name=total,proto3" json:"total"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *TemplateDetailListReply) Reset()         { *m = TemplateDetailListReply{} }
+func (m *TemplateDetailListReply) String() string { return proto.CompactTextString(m) }
+func (*TemplateDetailListReply) ProtoMessage()    {}
+func (*TemplateDetailListReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{48}
+}
+
+func (m *TemplateDetailListReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TemplateDetailListReply.Unmarshal(m, b)
+}
+func (m *TemplateDetailListReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TemplateDetailListReply.Marshal(b, m, deterministic)
+}
+func (m *TemplateDetailListReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TemplateDetailListReply.Merge(m, src)
+}
+func (m *TemplateDetailListReply) XXX_Size() int {
+	return xxx_messageInfo_TemplateDetailListReply.Size(m)
+}
+func (m *TemplateDetailListReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_TemplateDetailListReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TemplateDetailListReply proto.InternalMessageInfo
+
+func (m *TemplateDetailListReply) GetList() []*TemplateDetail {
+	if m != nil {
+		return m.List
+	}
+	return nil
+}
+
+func (m *TemplateDetailListReply) GetTotal() int64 {
+	if m != nil {
+		return m.Total
+	}
+	return 0
+}
+
+type TemplateDetailRequest struct {
+	Tid                  int64    `protobuf:"varint,1,opt,name=tid,proto3" json:"tid"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TemplateDetailRequest) Reset()         { *m = TemplateDetailRequest{} }
+func (m *TemplateDetailRequest) String() string { return proto.CompactTextString(m) }
+func (*TemplateDetailRequest) ProtoMessage()    {}
+func (*TemplateDetailRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{49}
+}
+
+func (m *TemplateDetailRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TemplateDetailRequest.Unmarshal(m, b)
+}
+func (m *TemplateDetailRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TemplateDetailRequest.Marshal(b, m, deterministic)
+}
+func (m *TemplateDetailRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TemplateDetailRequest.Merge(m, src)
+}
+func (m *TemplateDetailRequest) XXX_Size() int {
+	return xxx_messageInfo_TemplateDetailRequest.Size(m)
+}
+func (m *TemplateDetailRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_TemplateDetailRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TemplateDetailRequest proto.InternalMessageInfo
+
+func (m *TemplateDetailRequest) GetTid() int64 {
+	if m != nil {
+		return m.Tid
+	}
+	return 0
+}
+
+type TemplateDetailReply struct {
+	// 保养
+	Maintainance []*MaintainItem `protobuf:"bytes,1,rep,name=maintainance,proto3" json:"maintainance"`
+	// 维修
+	Repair []*MaintainItem `protobuf:"bytes,2,rep,name=repair,proto3" json:"repair"`
+	// 清洗
+	Wash                 []*MaintainItem `protobuf:"bytes,3,rep,name=wash,proto3" json:"wash"`
+	Name                 string          `protobuf:"bytes,4,opt,name=name,proto3" json:"name"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *TemplateDetailReply) Reset()         { *m = TemplateDetailReply{} }
+func (m *TemplateDetailReply) String() string { return proto.CompactTextString(m) }
+func (*TemplateDetailReply) ProtoMessage()    {}
+func (*TemplateDetailReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{50}
+}
+
+func (m *TemplateDetailReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TemplateDetailReply.Unmarshal(m, b)
+}
+func (m *TemplateDetailReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TemplateDetailReply.Marshal(b, m, deterministic)
+}
+func (m *TemplateDetailReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TemplateDetailReply.Merge(m, src)
+}
+func (m *TemplateDetailReply) XXX_Size() int {
+	return xxx_messageInfo_TemplateDetailReply.Size(m)
+}
+func (m *TemplateDetailReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_TemplateDetailReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TemplateDetailReply proto.InternalMessageInfo
+
+func (m *TemplateDetailReply) GetMaintainance() []*MaintainItem {
+	if m != nil {
+		return m.Maintainance
+	}
+	return nil
+}
+
+func (m *TemplateDetailReply) GetRepair() []*MaintainItem {
+	if m != nil {
+		return m.Repair
+	}
+	return nil
+}
+
+func (m *TemplateDetailReply) GetWash() []*MaintainItem {
+	if m != nil {
+		return m.Wash
+	}
+	return nil
+}
+
+func (m *TemplateDetailReply) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+type AddTemplateDetailRequest struct {
+	Tid                  int64    `protobuf:"varint,1,opt,name=tid,proto3" json:"tid"`
+	ItemId               int64    `protobuf:"varint,2,opt,name=item_id,json=itemId,proto3" json:"item_id"`
+	StartMile            int64    `protobuf:"varint,3,opt,name=start_mile,json=startMile,proto3" json:"start_mile"`
+	StartDate            int64    `protobuf:"varint,4,opt,name=start_date,json=startDate,proto3" json:"start_date"`
+	MileCycle            int64    `protobuf:"varint,5,opt,name=mile_cycle,json=mileCycle,proto3" json:"mile_cycle"`
+	DateCycle            int64    `protobuf:"varint,6,opt,name=date_cycle,json=dateCycle,proto3" json:"date_cycle"`
+	StyleId              string   `protobuf:"bytes,7,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	Name                 string   `protobuf:"bytes,8,opt,name=name,proto3" json:"name"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AddTemplateDetailRequest) Reset()         { *m = AddTemplateDetailRequest{} }
+func (m *AddTemplateDetailRequest) String() string { return proto.CompactTextString(m) }
+func (*AddTemplateDetailRequest) ProtoMessage()    {}
+func (*AddTemplateDetailRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{51}
+}
+
+func (m *AddTemplateDetailRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AddTemplateDetailRequest.Unmarshal(m, b)
+}
+func (m *AddTemplateDetailRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AddTemplateDetailRequest.Marshal(b, m, deterministic)
+}
+func (m *AddTemplateDetailRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AddTemplateDetailRequest.Merge(m, src)
+}
+func (m *AddTemplateDetailRequest) XXX_Size() int {
+	return xxx_messageInfo_AddTemplateDetailRequest.Size(m)
+}
+func (m *AddTemplateDetailRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_AddTemplateDetailRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AddTemplateDetailRequest proto.InternalMessageInfo
+
+func (m *AddTemplateDetailRequest) GetTid() int64 {
+	if m != nil {
+		return m.Tid
+	}
+	return 0
+}
+
+func (m *AddTemplateDetailRequest) GetItemId() int64 {
+	if m != nil {
+		return m.ItemId
+	}
+	return 0
+}
+
+func (m *AddTemplateDetailRequest) GetStartMile() int64 {
+	if m != nil {
+		return m.StartMile
+	}
+	return 0
+}
+
+func (m *AddTemplateDetailRequest) GetStartDate() int64 {
+	if m != nil {
+		return m.StartDate
+	}
+	return 0
+}
+
+func (m *AddTemplateDetailRequest) GetMileCycle() int64 {
+	if m != nil {
+		return m.MileCycle
+	}
+	return 0
+}
+
+func (m *AddTemplateDetailRequest) GetDateCycle() int64 {
+	if m != nil {
+		return m.DateCycle
+	}
+	return 0
+}
+
+func (m *AddTemplateDetailRequest) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+func (m *AddTemplateDetailRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+type AddTemplateDetailReply struct {
+	Tid                  int64    `protobuf:"varint,1,opt,name=tid,proto3" json:"tid"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *AddTemplateDetailReply) Reset()         { *m = AddTemplateDetailReply{} }
+func (m *AddTemplateDetailReply) String() string { return proto.CompactTextString(m) }
+func (*AddTemplateDetailReply) ProtoMessage()    {}
+func (*AddTemplateDetailReply) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{52}
+}
+
+func (m *AddTemplateDetailReply) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AddTemplateDetailReply.Unmarshal(m, b)
+}
+func (m *AddTemplateDetailReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AddTemplateDetailReply.Marshal(b, m, deterministic)
+}
+func (m *AddTemplateDetailReply) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AddTemplateDetailReply.Merge(m, src)
+}
+func (m *AddTemplateDetailReply) XXX_Size() int {
+	return xxx_messageInfo_AddTemplateDetailReply.Size(m)
+}
+func (m *AddTemplateDetailReply) XXX_DiscardUnknown() {
+	xxx_messageInfo_AddTemplateDetailReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AddTemplateDetailReply proto.InternalMessageInfo
+
+func (m *AddTemplateDetailReply) GetTid() int64 {
+	if m != nil {
+		return m.Tid
+	}
+	return 0
+}
+
+type ChooseTemplateDetailRequest struct {
+	Tid                  int64    `protobuf:"varint,1,opt,name=tid,proto3" json:"tid"`
+	StyleId              string   `protobuf:"bytes,2,opt,name=style_id,json=styleId,proto3" json:"style_id"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ChooseTemplateDetailRequest) Reset()         { *m = ChooseTemplateDetailRequest{} }
+func (m *ChooseTemplateDetailRequest) String() string { return proto.CompactTextString(m) }
+func (*ChooseTemplateDetailRequest) ProtoMessage()    {}
+func (*ChooseTemplateDetailRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{53}
+}
+
+func (m *ChooseTemplateDetailRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ChooseTemplateDetailRequest.Unmarshal(m, b)
+}
+func (m *ChooseTemplateDetailRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ChooseTemplateDetailRequest.Marshal(b, m, deterministic)
+}
+func (m *ChooseTemplateDetailRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ChooseTemplateDetailRequest.Merge(m, src)
+}
+func (m *ChooseTemplateDetailRequest) XXX_Size() int {
+	return xxx_messageInfo_ChooseTemplateDetailRequest.Size(m)
+}
+func (m *ChooseTemplateDetailRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ChooseTemplateDetailRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ChooseTemplateDetailRequest proto.InternalMessageInfo
+
+func (m *ChooseTemplateDetailRequest) GetTid() int64 {
+	if m != nil {
+		return m.Tid
+	}
+	return 0
+}
+
+func (m *ChooseTemplateDetailRequest) GetStyleId() string {
+	if m != nil {
+		return m.StyleId
+	}
+	return ""
+}
+
+type TemplateItemListRequest struct {
+	ItemType             int64    `protobuf:"varint,1,opt,name=item_type,json=itemType,proto3" json:"item_type"`
+	Tid                  int64    `protobuf:"varint,2,opt,name=tid,proto3" json:"tid"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TemplateItemListRequest) Reset()         { *m = TemplateItemListRequest{} }
+func (m *TemplateItemListRequest) String() string { return proto.CompactTextString(m) }
+func (*TemplateItemListRequest) ProtoMessage()    {}
+func (*TemplateItemListRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_b614324037d99e80, []int{54}
+}
+
+func (m *TemplateItemListRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TemplateItemListRequest.Unmarshal(m, b)
+}
+func (m *TemplateItemListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TemplateItemListRequest.Marshal(b, m, deterministic)
+}
+func (m *TemplateItemListRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TemplateItemListRequest.Merge(m, src)
+}
+func (m *TemplateItemListRequest) XXX_Size() int {
+	return xxx_messageInfo_TemplateItemListRequest.Size(m)
+}
+func (m *TemplateItemListRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_TemplateItemListRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TemplateItemListRequest proto.InternalMessageInfo
+
+func (m *TemplateItemListRequest) GetItemType() int64 {
+	if m != nil {
+		return m.ItemType
+	}
+	return 0
+}
+
+func (m *TemplateItemListRequest) GetTid() int64 {
+	if m != nil {
+		return m.Tid
+	}
+	return 0
+}
+
+func init() {
+	proto.RegisterType((*BrandListRequest)(nil), "v1.BrandListRequest")
+	proto.RegisterType((*BrandList)(nil), "v1.BrandList")
+	proto.RegisterType((*BrandListReply)(nil), "v1.BrandListReply")
+	proto.RegisterType((*SearchRequest)(nil), "v1.SearchRequest")
+	proto.RegisterType((*SearchList)(nil), "v1.SearchList")
+	proto.RegisterType((*SearchReply)(nil), "v1.SearchReply")
+	proto.RegisterType((*UpdateSYBrandRequest)(nil), "v1.UpdateSYBrandRequest")
+	proto.RegisterType((*GetMakerRequest)(nil), "v1.GetMakerRequest")
+	proto.RegisterType((*MakerList)(nil), "v1.MakerList")
+	proto.RegisterType((*GetMakerReply)(nil), "v1.GetMakerReply")
+	proto.RegisterType((*UpdateMakerRequest)(nil), "v1.UpdateMakerRequest")
+	proto.RegisterType((*EmptyReply)(nil), "v1.EmptyReply")
+	proto.RegisterType((*SeriesListRequest)(nil), "v1.SeriesListRequest")
+	proto.RegisterType((*SeriesList)(nil), "v1.SeriesList")
+	proto.RegisterType((*SeriesListReply)(nil), "v1.SeriesListReply")
+	proto.RegisterType((*UpdateSeriesRequest)(nil), "v1.UpdateSeriesRequest")
+	proto.RegisterType((*StyleListRequest)(nil), "v1.StyleListRequest")
+	proto.RegisterType((*StyleList)(nil), "v1.StyleList")
+	proto.RegisterType((*StyleListReply)(nil), "v1.StyleListReply")
+	proto.RegisterType((*UpdateStyleRequest)(nil), "v1.UpdateStyleRequest")
+	proto.RegisterType((*StyleInfoRequest)(nil), "v1.StyleInfoRequest")
+	proto.RegisterType((*StyleInfoReply)(nil), "v1.StyleInfoReply")
+	proto.RegisterType((*StyleInfoReply_Aircondition)(nil), "v1.StyleInfoReply.Aircondition")
+	proto.RegisterType((*StyleInfoReply_Basic)(nil), "v1.StyleInfoReply.Basic")
+	proto.RegisterType((*StyleInfoReply_Body)(nil), "v1.StyleInfoReply.Body")
+	proto.RegisterType((*StyleInfoReply_Chassis)(nil), "v1.StyleInfoReply.Chassis")
+	proto.RegisterType((*StyleInfoReply_Control)(nil), "v1.StyleInfoReply.Control")
+	proto.RegisterType((*StyleInfoReply_Electric)(nil), "v1.StyleInfoReply.Electric")
+	proto.RegisterType((*StyleInfoReply_Engine)(nil), "v1.StyleInfoReply.Engine")
+	proto.RegisterType((*StyleInfoReply_External)(nil), "v1.StyleInfoReply.External")
+	proto.RegisterType((*StyleInfoReply_Gearbox)(nil), "v1.StyleInfoReply.Gearbox")
+	proto.RegisterType((*StyleInfoReply_Intelligent)(nil), "v1.StyleInfoReply.Intelligent")
+	proto.RegisterType((*StyleInfoReply_Internal)(nil), "v1.StyleInfoReply.Internal")
+	proto.RegisterType((*StyleInfoReply_Light)(nil), "v1.StyleInfoReply.Light")
+	proto.RegisterType((*StyleInfoReply_Media)(nil), "v1.StyleInfoReply.Media")
+	proto.RegisterType((*StyleInfoReply_Optional)(nil), "v1.StyleInfoReply.Optional")
+	proto.RegisterType((*StyleInfoReply_Rearview)(nil), "v1.StyleInfoReply.Rearview")
+	proto.RegisterType((*StyleInfoReply_Safety)(nil), "v1.StyleInfoReply.Safety")
+	proto.RegisterType((*StyleInfoReply_Seat)(nil), "v1.StyleInfoReply.Seat")
+	proto.RegisterType((*StyleInfoReply_Wheelbrake)(nil), "v1.StyleInfoReply.Wheelbrake")
+	proto.RegisterType((*UpdateStyleInfoRequest)(nil), "v1.UpdateStyleInfoRequest")
+	proto.RegisterType((*MaintainManualRequest)(nil), "v1.MaintainManualRequest")
+	proto.RegisterType((*MaintainItem)(nil), "v1.MaintainItem")
+	proto.RegisterType((*MaintainManualReply)(nil), "v1.MaintainManualReply")
+	proto.RegisterType((*ItemListRequest)(nil), "v1.ItemListRequest")
+	proto.RegisterType((*ItemListReply)(nil), "v1.ItemListReply")
+	proto.RegisterType((*ItemListReply_Item)(nil), "v1.ItemListReply.Item")
+	proto.RegisterType((*UpdateMaintainManualRequest)(nil), "v1.UpdateMaintainManualRequest")
+	proto.RegisterType((*MaintainManualInfoRequest)(nil), "v1.MaintainManualInfoRequest")
+	proto.RegisterType((*MaintainManualInfoReply)(nil), "v1.MaintainManualInfoReply")
+	proto.RegisterType((*MaintainManualInfoReply_Wash)(nil), "v1.MaintainManualInfoReply.Wash")
+	proto.RegisterType((*MaintainManualInfoReply_Repair)(nil), "v1.MaintainManualInfoReply.Repair")
+	proto.RegisterType((*MaintainManualInfoReply_MaintainItem)(nil), "v1.MaintainManualInfoReply.MaintainItem")
+	proto.RegisterType((*MaintainManualInfoReply_Items)(nil), "v1.MaintainManualInfoReply.Items")
+	proto.RegisterType((*MaintainManualInfoReply_Maintain)(nil), "v1.MaintainManualInfoReply.Maintain")
+	proto.RegisterType((*MaintainManualInfoReply_Cycle)(nil), "v1.MaintainManualInfoReply.Cycle")
+	proto.RegisterType((*StyleItem)(nil), "v1.StyleItem")
+	proto.RegisterType((*StyleItemReply)(nil), "v1.StyleItemReply")
+	proto.RegisterType((*C2ListRequest)(nil), "v1.C2ListRequest")
+	proto.RegisterType((*C2ListReply)(nil), "v1.C2ListReply")
+	proto.RegisterType((*C2ListReply_Info)(nil), "v1.C2ListReply.Info")
+	proto.RegisterType((*UpdateStyleItemRequest)(nil), "v1.UpdateStyleItemRequest")
+	proto.RegisterType((*DeleteMaintainaceRequest)(nil), "v1.DeleteMaintainaceRequest")
+	proto.RegisterType((*ExportStyleRequest)(nil), "v1.ExportStyleRequest")
+	proto.RegisterType((*ExportStyleReply)(nil), "v1.ExportStyleReply")
+	proto.RegisterType((*ExportStyleTaskList)(nil), "v1.ExportStyleTaskList")
+	proto.RegisterType((*ExportStyleTaskListReply)(nil), "v1.ExportStyleTaskListReply")
+	proto.RegisterType((*DeleteExportStyleTaskRequest)(nil), "v1.DeleteExportStyleTaskRequest")
+	proto.RegisterType((*DeleteStyleItemRequest)(nil), "v1.DeleteStyleItemRequest")
+	proto.RegisterType((*TemplateListRequest)(nil), "v1.TemplateListRequest")
+	proto.RegisterType((*Template)(nil), "v1.Template")
+	proto.RegisterType((*TemplateListReply)(nil), "v1.TemplateListReply")
+	proto.RegisterType((*TemplateDetailListRequest)(nil), "v1.TemplateDetailListRequest")
+	proto.RegisterType((*TemplateDetail)(nil), "v1.TemplateDetail")
+	proto.RegisterType((*TemplateDetailListReply)(nil), "v1.TemplateDetailListReply")
+	proto.RegisterType((*TemplateDetailRequest)(nil), "v1.TemplateDetailRequest")
+	proto.RegisterType((*TemplateDetailReply)(nil), "v1.TemplateDetailReply")
+	proto.RegisterType((*AddTemplateDetailRequest)(nil), "v1.AddTemplateDetailRequest")
+	proto.RegisterType((*AddTemplateDetailReply)(nil), "v1.AddTemplateDetailReply")
+	proto.RegisterType((*ChooseTemplateDetailRequest)(nil), "v1.ChooseTemplateDetailRequest")
+	proto.RegisterType((*TemplateItemListRequest)(nil), "v1.TemplateItemListRequest")
+}
+
+func init() { proto.RegisterFile("vehicle_style.proto", fileDescriptor_b614324037d99e80) }
+
+var fileDescriptor_b614324037d99e80 = []byte{
+	// 7112 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0xcd, 0x6f, 0x24, 0xc9,
+	0x75, 0x27, 0xf8, 0xcd, 0x0a, 0x16, 0xd9, 0x64, 0x92, 0xdd, 0x2c, 0x16, 0xfb, 0xb3, 0x66, 0x34,
+	0xdb, 0xea, 0x99, 0xe9, 0x99, 0xa1, 0x34, 0xd2, 0x48, 0x1a, 0xad, 0xc4, 0x26, 0xbb, 0x7b, 0xb8,
+	0x6a, 0x4e, 0x37, 0xaa, 0xa8, 0x69, 0x48, 0x0b, 0x6c, 0x22, 0x98, 0x19, 0x55, 0x15, 0xcb, 0xfc,
+	0x52, 0x64, 0x16, 0x39, 0x35, 0xa7, 0x05, 0x74, 0xde, 0x5d, 0x60, 0x81, 0x05, 0x16, 0xd8, 0xbd,
+	0xed, 0x69, 0x2f, 0xbb, 0x7b, 0xf1, 0x49, 0x86, 0xff, 0x04, 0x1d, 0x2c, 0xc0, 0x17, 0x9f, 0xec,
+	0x9b, 0x61, 0xc3, 0xb0, 0x0d, 0x5f, 0x0d, 0x1b, 0xef, 0x23, 0x22, 0x33, 0x8b, 0x45, 0x6a, 0x46,
+	0x16, 0x60, 0x41, 0x3e, 0x31, 0xeb, 0xbd, 0x5f, 0x44, 0x46, 0xbc, 0xf7, 0xe2, 0x7d, 0x44, 0x44,
+	0x52, 0x6c, 0x9e, 0xab, 0xa1, 0x0e, 0x22, 0xe5, 0xe7, 0xc5, 0x38, 0x52, 0x8f, 0x33, 0x93, 0x16,
+	0xa9, 0x37, 0x7b, 0xfe, 0x41, 0xe7, 0xaf, 0x67, 0xc4, 0xfa, 0x13, 0x23, 0x93, 0xf0, 0x85, 0xce,
+	0x8b, 0xae, 0xfa, 0xd9, 0x48, 0xe5, 0x85, 0x77, 0x47, 0x88, 0x53, 0xa0, 0xf9, 0x89, 0x8c, 0x55,
+	0x6b, 0xe6, 0xfe, 0xcc, 0xc3, 0x46, 0xb7, 0x81, 0x94, 0x4f, 0x65, 0xac, 0xbc, 0x96, 0x58, 0xd2,
+	0x89, 0x2e, 0xb4, 0x8c, 0x5a, 0xb3, 0xc8, 0xb3, 0x3f, 0xbd, 0x6d, 0xb1, 0x34, 0x94, 0xb9, 0xaf,
+	0xe3, 0x41, 0x6b, 0xee, 0xfe, 0xcc, 0xc3, 0x85, 0xee, 0xe2, 0x50, 0xe6, 0x47, 0xf1, 0xc0, 0xbb,
+	0x25, 0x16, 0xf3, 0x42, 0x16, 0xa3, 0xbc, 0x35, 0x4f, 0x74, 0xfa, 0xe5, 0xed, 0x8a, 0x46, 0x26,
+	0x07, 0xca, 0xcf, 0xf5, 0x17, 0xaa, 0xb5, 0x80, 0xac, 0x65, 0x20, 0xf4, 0xf4, 0x17, 0xca, 0xf3,
+	0xc4, 0x3c, 0x3c, 0xb7, 0x16, 0x91, 0x8e, 0xcf, 0xde, 0x8e, 0x58, 0xa6, 0xa1, 0xe9, 0xb0, 0xb5,
+	0x44, 0x2f, 0xc7, 0xdf, 0x47, 0xa1, 0xf7, 0xa6, 0x58, 0x4b, 0xa3, 0xd0, 0xaf, 0x8c, 0x7c, 0x19,
+	0x01, 0xcd, 0x34, 0x0a, 0x9f, 0xd8, 0xc1, 0x77, 0xfe, 0x7e, 0x46, 0x34, 0xdc, 0x84, 0xbd, 0x35,
+	0x31, 0xab, 0x43, 0x9c, 0xe1, 0x5c, 0x77, 0x56, 0x87, 0xd7, 0x4c, 0xad, 0x2e, 0x93, 0xb9, 0x49,
+	0x99, 0x54, 0xc7, 0x35, 0x5f, 0x1f, 0xd7, 0x2d, 0xb1, 0x78, 0xa1, 0xf4, 0x60, 0x58, 0xe0, 0x04,
+	0xe7, 0xba, 0xfc, 0xab, 0x2a, 0xac, 0x45, 0x62, 0x5c, 0x12, 0xd6, 0x12, 0xd1, 0x59, 0x58, 0x5b,
+	0x62, 0x41, 0xc7, 0x20, 0x10, 0x9a, 0x17, 0xfd, 0x98, 0x32, 0xed, 0xc6, 0x94, 0x69, 0xff, 0xc3,
+	0x8c, 0x58, 0xab, 0xe8, 0x39, 0x8b, 0xc6, 0xde, 0x03, 0xd1, 0x0c, 0x46, 0xc6, 0xa8, 0xa4, 0xf0,
+	0x51, 0xcc, 0x24, 0x85, 0x15, 0xa6, 0xbd, 0x62, 0x69, 0x67, 0xca, 0x10, 0x7b, 0x16, 0xd9, 0x4b,
+	0x99, 0x32, 0xc8, 0xda, 0x12, 0x0b, 0x45, 0x5a, 0xc8, 0x08, 0x45, 0x31, 0xd7, 0xa5, 0x1f, 0x20,
+	0xa5, 0xbe, 0x36, 0x39, 0xf7, 0x38, 0x8f, 0xac, 0x06, 0x52, 0xb0, 0xd1, 0xae, 0x68, 0x44, 0xd2,
+	0x72, 0x49, 0x1a, 0xcb, 0x40, 0xb0, 0xcc, 0xcc, 0xa8, 0x73, 0xdf, 0xe9, 0x7c, 0xae, 0xbb, 0x0c,
+	0x04, 0xcb, 0x4c, 0xd4, 0xe7, 0xdc, 0x92, 0xc4, 0xb2, 0x0c, 0x04, 0x64, 0x3e, 0x10, 0xf3, 0x91,
+	0xce, 0x8b, 0xd6, 0xf2, 0xfd, 0xb9, 0x87, 0x2b, 0x7b, 0xab, 0x8f, 0xcf, 0x3f, 0x78, 0x5c, 0xce,
+	0x15, 0x59, 0x9d, 0xff, 0x32, 0x23, 0x56, 0x7b, 0x4a, 0x9a, 0x60, 0x68, 0x8d, 0xdc, 0x13, 0xf3,
+	0xc5, 0x38, 0xa3, 0x69, 0x2f, 0x74, 0xf1, 0x19, 0x25, 0x8f, 0x20, 0xd6, 0x3e, 0xff, 0xaa, 0x69,
+	0x77, 0xae, 0xae, 0xdd, 0x1d, 0xb1, 0x1c, 0xcb, 0x33, 0x65, 0x2a, 0x8a, 0xc7, 0xdf, 0x47, 0x21,
+	0x8c, 0x39, 0x57, 0x46, 0xab, 0x1c, 0x78, 0x0b, 0xc8, 0x5b, 0x26, 0xc2, 0x51, 0xd8, 0x79, 0x5f,
+	0x08, 0x1a, 0xcf, 0x84, 0x1d, 0x36, 0xd0, 0x0e, 0x3d, 0x31, 0x8f, 0xaa, 0xa4, 0x61, 0xe0, 0x73,
+	0xe7, 0x03, 0xb1, 0x62, 0x67, 0x00, 0xea, 0xeb, 0xf0, 0xa4, 0x67, 0x70, 0xd2, 0x6b, 0x30, 0xe9,
+	0xb2, 0x43, 0x9e, 0xf5, 0x2f, 0x67, 0xc4, 0xd6, 0x8f, 0xb3, 0x50, 0x16, 0xaa, 0xf7, 0x13, 0x94,
+	0x88, 0x9d, 0xfc, 0xa4, 0xdd, 0xd7, 0xad, 0x7b, 0xf6, 0x9a, 0x15, 0x3f, 0x57, 0x5f, 0x16, 0xa5,
+	0x71, 0xcf, 0xd7, 0x8c, 0xbb, 0xb4, 0xe1, 0x85, 0x9a, 0x0d, 0x5f, 0x69, 0xf4, 0x97, 0xcd, 0x78,
+	0x69, 0x8a, 0x19, 0xbf, 0x23, 0x6e, 0x3c, 0x57, 0xc5, 0x31, 0x08, 0xd8, 0x4e, 0xa5, 0xaa, 0x9b,
+	0x99, 0x9a, 0x6e, 0x3a, 0xaf, 0x45, 0x03, 0xa1, 0x28, 0xe2, 0xab, 0x71, 0x35, 0x1d, 0xce, 0xd6,
+	0x75, 0xb8, 0x25, 0x16, 0xf0, 0x91, 0xe7, 0x4d, 0x3f, 0x3a, 0x7b, 0x62, 0xb5, 0x1c, 0x06, 0xad,
+	0xa5, 0xaa, 0x32, 0xd0, 0x02, 0xdd, 0x9b, 0x59, 0x17, 0x4f, 0x85, 0x47, 0xaa, 0x98, 0x1c, 0xfd,
+	0x57, 0x7b, 0x75, 0x53, 0x88, 0xa7, 0x71, 0x56, 0x8c, 0xf1, 0xbd, 0x9d, 0xff, 0x3e, 0x2b, 0x36,
+	0x7a, 0x68, 0x52, 0x5f, 0xc1, 0x7f, 0xdf, 0x13, 0x2b, 0x6c, 0x97, 0x15, 0x6d, 0x0b, 0x22, 0x21,
+	0xe0, 0x5f, 0xd4, 0x8d, 0xd7, 0x56, 0xcd, 0x72, 0x7d, 0xd5, 0x78, 0x6f, 0x89, 0x1b, 0x60, 0x25,
+	0xd5, 0xe1, 0x93, 0xb7, 0x5b, 0x4d, 0xa3, 0xb0, 0xe7, 0x66, 0xd0, 0xf9, 0x4f, 0xb3, 0xb0, 0xbc,
+	0xac, 0x5c, 0xbe, 0xaa, 0xb9, 0xd7, 0x86, 0x30, 0x37, 0x31, 0x04, 0xa7, 0x96, 0xf9, 0x8a, 0x5a,
+	0x26, 0x65, 0xba, 0x70, 0x49, 0xa6, 0xa5, 0xe8, 0x16, 0xa7, 0x3b, 0xf5, 0xa5, 0xaa, 0x53, 0xaf,
+	0xca, 0x67, 0xb9, 0x2e, 0x9f, 0x2f, 0x2b, 0x82, 0x7f, 0x9c, 0x11, 0x37, 0xaa, 0xa6, 0xf1, 0xfb,
+	0xe5, 0xf2, 0x3b, 0x35, 0x97, 0xcf, 0xde, 0xcf, 0x4d, 0x96, 0x56, 0xdc, 0x1f, 0xcc, 0x88, 0x4d,
+	0xf6, 0x7e, 0xc8, 0xba, 0xca, 0xf9, 0xfd, 0xda, 0xf5, 0x30, 0x75, 0x25, 0x4e, 0x2c, 0x86, 0xa9,
+	0x2e, 0x6e, 0xa1, 0xe6, 0xe2, 0xa6, 0x68, 0x6e, 0x71, 0x9a, 0xe6, 0xfe, 0x6c, 0x56, 0xac, 0xf7,
+	0x20, 0x4f, 0xfb, 0x6d, 0xae, 0xe9, 0x3b, 0x42, 0xc0, 0xa8, 0x62, 0x99, 0x8c, 0x58, 0x83, 0x0b,
+	0xdd, 0xc6, 0x50, 0xe6, 0xc7, 0x48, 0xf8, 0xed, 0xad, 0x6c, 0x27, 0xab, 0xa5, 0xaa, 0xac, 0xee,
+	0x08, 0x11, 0xa7, 0xa1, 0x8a, 0xfc, 0xb1, 0x92, 0x06, 0x2d, 0x7a, 0xae, 0xdb, 0x40, 0xca, 0x4f,
+	0x94, 0x44, 0x36, 0x26, 0xa6, 0x55, 0x73, 0x6e, 0x20, 0xe5, 0x52, 0x72, 0x25, 0xae, 0xf1, 0x16,
+	0x2b, 0x13, 0x4b, 0x75, 0x47, 0x2c, 0x53, 0xb7, 0x3a, 0x6c, 0x35, 0xa9, 0x1d, 0xfe, 0x3e, 0x0a,
+	0x3b, 0xff, 0x6b, 0x56, 0x34, 0x9c, 0x8c, 0x2f, 0x59, 0x44, 0xb5, 0xe1, 0x6c, 0xad, 0xe1, 0xaf,
+	0xcb, 0x03, 0x7f, 0x43, 0xef, 0x50, 0x17, 0xc0, 0xe2, 0xa4, 0x00, 0xae, 0xca, 0x08, 0xef, 0x89,
+	0x95, 0x58, 0xea, 0xa4, 0x90, 0x3a, 0xb1, 0x9e, 0x62, 0xae, 0x2b, 0x2c, 0x69, 0x52, 0x3c, 0x8d,
+	0xcb, 0xe2, 0xb9, 0x42, 0xac, 0x98, 0x2e, 0x56, 0x4c, 0xf0, 0xf7, 0x3e, 0x5d, 0x2c, 0xe7, 0x4a,
+	0xae, 0xe3, 0xdf, 0xdb, 0x60, 0x8d, 0x8c, 0x6b, 0xb2, 0xa6, 0x8a, 0xd6, 0x66, 0xaf, 0xd6, 0xda,
+	0x5c, 0x75, 0x4d, 0x75, 0x3a, 0xbc, 0xbc, 0x8f, 0x92, 0x7e, 0x7a, 0x45, 0xd7, 0x9d, 0x5f, 0xf5,
+	0x59, 0x01, 0x04, 0x02, 0x05, 0x1c, 0x88, 0xa6, 0xd4, 0x26, 0x48, 0x93, 0x50, 0x17, 0x3a, 0x4d,
+	0x10, 0xbc, 0xb2, 0x77, 0xcf, 0x0d, 0xdf, 0x21, 0x1f, 0xef, 0x57, 0x60, 0xdd, 0x5a, 0x23, 0xef,
+	0xb1, 0x58, 0x38, 0x95, 0xb9, 0x0e, 0x70, 0xb4, 0x2b, 0x7b, 0xad, 0x29, 0xad, 0x9f, 0x00, 0xbf,
+	0x4b, 0x30, 0xef, 0x6d, 0x31, 0x7f, 0x9a, 0x86, 0x63, 0x9c, 0xc1, 0xca, 0xde, 0xf6, 0x34, 0x78,
+	0x1a, 0x8e, 0xbb, 0x08, 0xf2, 0xbe, 0x29, 0x96, 0x82, 0xa1, 0xcc, 0x73, 0x4d, 0x5e, 0x64, 0x65,
+	0xaf, 0x3d, 0x05, 0x7f, 0x40, 0x88, 0xae, 0x85, 0x62, 0xab, 0x34, 0x29, 0x4c, 0x1a, 0xa1, 0x8e,
+	0xaf, 0x68, 0x45, 0x88, 0xae, 0x85, 0x7a, 0xdf, 0x16, 0xcb, 0x2a, 0x52, 0x41, 0x61, 0x74, 0x80,
+	0xda, 0x5f, 0xd9, 0xdb, 0x9d, 0xd2, 0xec, 0x29, 0x43, 0xba, 0x0e, 0xec, 0x7d, 0x20, 0x16, 0x55,
+	0x32, 0xd0, 0x09, 0xd9, 0xc5, 0xca, 0xde, 0xce, 0xb4, 0x66, 0x08, 0xe8, 0x32, 0x10, 0xdf, 0xf5,
+	0x79, 0xa1, 0x4c, 0x22, 0x23, 0x5c, 0x63, 0x57, 0xbc, 0x8b, 0x21, 0x5d, 0x07, 0x86, 0xa9, 0x0d,
+	0x94, 0x34, 0xa7, 0xe9, 0xe7, 0xb8, 0xf8, 0xa6, 0x4f, 0xed, 0x39, 0x21, 0xba, 0x16, 0xea, 0xfd,
+	0x50, 0xac, 0xe8, 0xa4, 0x50, 0x51, 0xa4, 0x07, 0x2a, 0x29, 0x70, 0x69, 0xae, 0xec, 0xdd, 0x9d,
+	0xd2, 0xf2, 0xa8, 0x44, 0x75, 0xab, 0x4d, 0x60, 0xc0, 0xf0, 0x13, 0x07, 0xbc, 0x72, 0xe5, 0x80,
+	0x8f, 0x12, 0x3b, 0x60, 0x0b, 0x06, 0xf3, 0x88, 0x30, 0x9b, 0x6f, 0x5e, 0x69, 0x1e, 0x2f, 0x80,
+	0xdf, 0x25, 0x18, 0xe0, 0x63, 0x15, 0x6a, 0xd9, 0x5a, 0xbd, 0x12, 0x7f, 0x0c, 0xfc, 0x2e, 0xc1,
+	0x60, 0x60, 0x69, 0x06, 0x86, 0x28, 0xa3, 0xd6, 0xda, 0x95, 0x03, 0x7b, 0xc9, 0x90, 0xae, 0x03,
+	0x43, 0x43, 0xa3, 0xa4, 0x39, 0xd7, 0xea, 0xa2, 0x75, 0xe3, 0xca, 0x86, 0x5d, 0x86, 0x74, 0x1d,
+	0x18, 0xd4, 0x9d, 0xcb, 0xbe, 0x2a, 0xc6, 0xad, 0xf5, 0x2b, 0xd5, 0xdd, 0x43, 0x40, 0x97, 0x81,
+	0x60, 0xf3, 0xb9, 0x92, 0x45, 0x6b, 0xe3, 0x4a, 0x9b, 0xef, 0x29, 0x59, 0x74, 0x11, 0xe4, 0x7d,
+	0x5f, 0x88, 0x8b, 0xa1, 0x52, 0xd1, 0xa9, 0x91, 0x67, 0xaa, 0xe5, 0x61, 0x93, 0x3b, 0x53, 0x9a,
+	0xbc, 0x76, 0xa0, 0x6e, 0xa5, 0x41, 0xfb, 0x97, 0x73, 0xa2, 0x59, 0x5d, 0xae, 0xde, 0x77, 0xc5,
+	0x4e, 0x75, 0xc1, 0xfa, 0x6c, 0xef, 0xbe, 0xab, 0x55, 0x1b, 0xdd, 0xed, 0x2a, 0x80, 0x17, 0xc6,
+	0x09, 0x94, 0xaf, 0x0f, 0xc5, 0x7a, 0x20, 0x8d, 0x2f, 0xb5, 0xf1, 0xb3, 0x91, 0xd1, 0x7d, 0xad,
+	0x0c, 0x7b, 0xa5, 0xb5, 0x40, 0x9a, 0x7d, 0x6d, 0x5e, 0x31, 0xd5, 0xfb, 0xba, 0x58, 0xef, 0x1b,
+	0x39, 0x30, 0x32, 0x09, 0x94, 0x9f, 0x8f, 0xf3, 0x42, 0xc5, 0x1c, 0xcb, 0x6e, 0x38, 0x7a, 0x0f,
+	0xc9, 0xde, 0x37, 0xc5, 0xad, 0x44, 0x0d, 0x64, 0xa1, 0xcf, 0x95, 0x0f, 0x03, 0x1a, 0xa8, 0x44,
+	0x19, 0x59, 0xa4, 0x36, 0xc4, 0x6d, 0x59, 0xee, 0x51, 0x9a, 0x3c, 0xb7, 0x3c, 0x88, 0x4c, 0x59,
+	0xbc, 0xf7, 0xa1, 0x1f, 0xaa, 0x73, 0x1d, 0xb8, 0x88, 0x07, 0xa4, 0x43, 0xa4, 0x78, 0xcf, 0xc5,
+	0x7d, 0xd0, 0x91, 0xaf, 0x93, 0x50, 0x65, 0x2a, 0x09, 0x21, 0xae, 0xc0, 0xc0, 0xdd, 0xc4, 0x94,
+	0xe1, 0x38, 0x78, 0x07, 0x70, 0x47, 0x25, 0x6c, 0x5f, 0x9b, 0x83, 0x12, 0xe4, 0xbd, 0x27, 0xb6,
+	0xb0, 0x23, 0xd0, 0x06, 0xf6, 0x90, 0x8e, 0x8a, 0x48, 0x15, 0x9c, 0x7f, 0x6c, 0x00, 0x0f, 0xd4,
+	0xb5, 0xaf, 0xcd, 0x4b, 0x64, 0x78, 0x1d, 0xd1, 0x34, 0xaa, 0x6f, 0xf4, 0x80, 0xa7, 0xc1, 0xbb,
+	0x44, 0x55, 0x9a, 0xf7, 0x91, 0x68, 0x15, 0x2a, 0xce, 0xe0, 0xd7, 0xc8, 0x28, 0xff, 0x8b, 0x34,
+	0x51, 0x56, 0x13, 0x1c, 0x46, 0x6f, 0x55, 0xf8, 0x3f, 0x4d, 0x13, 0xc5, 0x7a, 0x68, 0xff, 0x0f,
+	0x21, 0x16, 0xd0, 0x83, 0x7a, 0x77, 0x85, 0x90, 0x11, 0xae, 0x2b, 0x78, 0x0b, 0xa9, 0xae, 0x42,
+	0x81, 0x77, 0x80, 0x0d, 0xe8, 0x64, 0xe0, 0x87, 0x3a, 0x2f, 0x50, 0x15, 0xb1, 0x92, 0xf9, 0xc8,
+	0xd8, 0x58, 0x72, 0x8b, 0xf9, 0x87, 0xcc, 0x3e, 0x26, 0xee, 0xaf, 0xcb, 0x41, 0xde, 0x16, 0x1b,
+	0x2a, 0xd6, 0x79, 0x0e, 0xda, 0x82, 0x86, 0xa1, 0x34, 0x76, 0x6f, 0x62, 0xdd, 0x32, 0x7a, 0x4c,
+	0x87, 0x20, 0xc5, 0xee, 0x90, 0x74, 0x64, 0x7d, 0xde, 0x3b, 0xc2, 0xeb, 0x43, 0xec, 0x0d, 0x86,
+	0xd2, 0x0c, 0x94, 0x2f, 0xe3, 0x74, 0x94, 0x14, 0xac, 0x91, 0x75, 0xe0, 0x1c, 0x20, 0x63, 0x1f,
+	0xe9, 0x75, 0x34, 0xcc, 0xa8, 0xd0, 0xae, 0x82, 0x2f, 0xd1, 0x3a, 0x19, 0x9c, 0xe8, 0x18, 0xed,
+	0xb4, 0x3f, 0x52, 0x64, 0xd3, 0x7e, 0xa8, 0x0a, 0xa9, 0x23, 0xd6, 0xc2, 0x1a, 0xd0, 0xc1, 0x96,
+	0x0f, 0x91, 0x0a, 0x49, 0x07, 0x7b, 0x45, 0x3f, 0x54, 0x79, 0xc0, 0xb2, 0x5f, 0x61, 0xda, 0xa1,
+	0xca, 0x03, 0xef, 0x5d, 0xe1, 0x0d, 0x47, 0x49, 0x68, 0x54, 0xe8, 0xcb, 0x20, 0x50, 0x11, 0xe8,
+	0x44, 0x71, 0x3e, 0xb3, 0xc1, 0x9c, 0x7d, 0xc7, 0xf0, 0x3e, 0x16, 0xed, 0xcb, 0x70, 0x27, 0x77,
+	0xca, 0x20, 0x5b, 0x97, 0x9a, 0x59, 0xc9, 0x6f, 0x89, 0x85, 0x48, 0x9d, 0xab, 0x88, 0xd3, 0x49,
+	0xfa, 0xe1, 0xad, 0x8b, 0xb9, 0xe8, 0x62, 0x88, 0x3e, 0xb0, 0xd1, 0x85, 0xc7, 0x32, 0x0d, 0x5c,
+	0xab, 0xa6, 0x81, 0x6f, 0x88, 0xd5, 0x58, 0x7e, 0xae, 0xe3, 0x51, 0xec, 0x67, 0xe9, 0x85, 0x32,
+	0xe8, 0xc9, 0x1a, 0xdd, 0x26, 0x13, 0x5f, 0x01, 0x0d, 0x1c, 0x80, 0x05, 0xe5, 0x3a, 0x1e, 0x45,
+	0x12, 0xdd, 0x40, 0xac, 0x23, 0x48, 0x65, 0xd6, 0xc9, 0x01, 0x30, 0xa0, 0xe7, 0xf8, 0xc7, 0xc8,
+	0xf6, 0x8e, 0xc4, 0x83, 0x2b, 0xdb, 0xba, 0x39, 0x6e, 0x60, 0x1f, 0x77, 0xaf, 0xe8, 0xc3, 0xce,
+	0xb4, 0x32, 0xd6, 0x3c, 0x53, 0x2a, 0x44, 0xd7, 0x56, 0x8e, 0xb5, 0x07, 0x34, 0xef, 0x6b, 0x62,
+	0xcd, 0x82, 0x8a, 0xd4, 0xfc, 0x6c, 0xa4, 0x5a, 0x9b, 0x54, 0xd0, 0x30, 0xf5, 0x04, 0x89, 0x13,
+	0xd9, 0xff, 0x16, 0xd9, 0x6b, 0x99, 0xfd, 0xef, 0x89, 0x9b, 0xa9, 0x8e, 0xfc, 0x0b, 0x58, 0xc5,
+	0x41, 0x1a, 0x1b, 0x35, 0x54, 0x49, 0xae, 0xcf, 0x55, 0xeb, 0x26, 0x22, 0x37, 0x53, 0x1d, 0xbd,
+	0x56, 0xd2, 0x1c, 0x54, 0x58, 0x60, 0x42, 0xae, 0x8d, 0x9d, 0xd8, 0x2d, 0x32, 0x21, 0x86, 0x57,
+	0x54, 0x96, 0x19, 0xf0, 0x41, 0xdb, 0xa4, 0x0a, 0xfc, 0x01, 0x43, 0xc2, 0x07, 0x7f, 0x3c, 0x92,
+	0x49, 0xab, 0x45, 0x43, 0x42, 0xca, 0x4f, 0x46, 0x32, 0xa9, 0xe7, 0xcd, 0x3b, 0x13, 0x79, 0x33,
+	0xa4, 0x7d, 0xcc, 0x8c, 0x07, 0xad, 0x36, 0xa7, 0x7d, 0xc4, 0x8d, 0x07, 0x93, 0xc9, 0xfe, 0xee,
+	0xa5, 0x64, 0xff, 0x1d, 0xe1, 0xe5, 0x51, 0x7a, 0x31, 0xb1, 0x58, 0x6e, 0xd3, 0x62, 0x01, 0x4e,
+	0x6d, 0xb1, 0x54, 0x6b, 0x91, 0x3b, 0x97, 0x6a, 0x91, 0x4a, 0xfe, 0x79, 0x77, 0x32, 0xff, 0x84,
+	0x49, 0x8c, 0x4e, 0x7d, 0x32, 0xd8, 0x7b, 0x3c, 0x89, 0xd1, 0xe9, 0x0b, 0xb4, 0xd9, 0xb7, 0xc5,
+	0x46, 0x79, 0x26, 0x60, 0x46, 0x01, 0xf8, 0xb1, 0xd6, 0x7d, 0x1a, 0x03, 0x33, 0x7a, 0x96, 0x0e,
+	0xe1, 0xc2, 0x82, 0x2f, 0xa4, 0x31, 0x32, 0x29, 0xc6, 0xad, 0x07, 0x14, 0x2e, 0x98, 0xfe, 0x9a,
+	0xc9, 0xb5, 0xa2, 0xa2, 0x53, 0x2b, 0x2a, 0xda, 0xff, 0x67, 0x4e, 0xcc, 0x43, 0xb6, 0xe8, 0x3d,
+	0x16, 0x9b, 0xa7, 0x32, 0x38, 0xf3, 0x31, 0x0e, 0x3a, 0xe7, 0xc7, 0x2e, 0x72, 0x03, 0x58, 0x18,
+	0x2d, 0xad, 0xdb, 0x03, 0x89, 0x86, 0x69, 0x6a, 0xfc, 0x64, 0x14, 0x9f, 0xba, 0x90, 0x26, 0x80,
+	0xf4, 0x29, 0x52, 0xbc, 0xf7, 0xc5, 0x56, 0xdf, 0xa4, 0x49, 0x31, 0xd9, 0x23, 0xb9, 0x46, 0x0f,
+	0x79, 0xf5, 0x2e, 0x3d, 0x31, 0x3f, 0xd4, 0x83, 0x21, 0xbb, 0x45, 0x7c, 0x06, 0x5a, 0x94, 0x26,
+	0x03, 0x76, 0x84, 0xf8, 0x0c, 0x4e, 0x3a, 0xd6, 0x09, 0x5a, 0xf8, 0xc0, 0xa4, 0xa3, 0x24, 0xf4,
+	0x83, 0x48, 0x49, 0x8c, 0x8f, 0xec, 0x0c, 0x6f, 0x31, 0xff, 0x39, 0xb2, 0x0f, 0x2c, 0x17, 0x16,
+	0x50, 0xaa, 0x23, 0xf0, 0x5c, 0xe7, 0x69, 0x34, 0xaa, 0xec, 0x67, 0x22, 0xf1, 0x33, 0xa4, 0x91,
+	0xad, 0xc8, 0xc2, 0xce, 0x6c, 0xd9, 0xda, 0x8a, 0x2c, 0x78, 0x66, 0x0f, 0x44, 0xb3, 0x30, 0xa3,
+	0xe4, 0xcc, 0x76, 0xc2, 0x0e, 0x10, 0x69, 0xdc, 0xc7, 0x03, 0xd1, 0x1c, 0x25, 0x91, 0x0c, 0x55,
+	0xe2, 0xc7, 0x32, 0xcf, 0xd9, 0xf5, 0xad, 0x30, 0xed, 0x58, 0xe6, 0xb9, 0x77, 0x5b, 0x34, 0x28,
+	0xe7, 0x90, 0xb9, 0xf5, 0x71, 0x25, 0x01, 0xe6, 0x7d, 0xa1, 0x43, 0xc5, 0x3e, 0x0d, 0x9f, 0xdb,
+	0x7f, 0x32, 0x23, 0x96, 0x38, 0x53, 0x87, 0x41, 0xe2, 0x43, 0x51, 0x4d, 0x42, 0x04, 0x91, 0x30,
+	0xef, 0x78, 0x5f, 0x6c, 0xa1, 0x3e, 0xf3, 0x51, 0x9e, 0xa9, 0x04, 0x7d, 0x0e, 0x22, 0x49, 0x51,
+	0x1e, 0xf0, 0x7a, 0x8e, 0x85, 0x2d, 0xbe, 0x26, 0xd6, 0xa0, 0x62, 0xa8, 0x98, 0x1e, 0xa9, 0x6a,
+	0x15, 0xa8, 0xa5, 0xdd, 0xdd, 0x11, 0x22, 0x34, 0x90, 0x78, 0x60, 0x77, 0xa4, 0xab, 0x06, 0x52,
+	0xb0, 0x97, 0x3d, 0x71, 0x93, 0xd4, 0x3e, 0xf9, 0x62, 0xd2, 0xe0, 0x26, 0x32, 0xeb, 0x6f, 0x6e,
+	0xff, 0xe7, 0x25, 0xb1, 0xc4, 0xb1, 0x1a, 0x46, 0x01, 0x09, 0x03, 0xb5, 0xce, 0x6d, 0x4d, 0xd5,
+	0xe8, 0xae, 0x4a, 0x6d, 0x7a, 0x8e, 0x08, 0x9a, 0x94, 0x79, 0x80, 0x09, 0x0a, 0xce, 0x99, 0xe7,
+	0xd5, 0x24, 0xe2, 0x3e, 0xd2, 0x60, 0xb1, 0xc9, 0x51, 0x91, 0xfa, 0xc3, 0x34, 0x72, 0x7b, 0x86,
+	0x40, 0xf8, 0x24, 0x8d, 0x42, 0xef, 0x87, 0xe2, 0x36, 0x3c, 0xc7, 0xb2, 0xd0, 0x81, 0x0f, 0xe3,
+	0x87, 0x55, 0x4f, 0x9d, 0xa1, 0x25, 0xd1, 0xcc, 0xda, 0x0e, 0x73, 0x48, 0x90, 0x7d, 0x87, 0x80,
+	0xe5, 0x5a, 0xf6, 0x90, 0x49, 0x03, 0x69, 0x01, 0x4f, 0x73, 0xdd, 0x31, 0x5e, 0x11, 0x1d, 0x1c,
+	0x0c, 0xea, 0x83, 0x71, 0xbe, 0x91, 0x61, 0x6a, 0xb3, 0xa9, 0x75, 0xe0, 0x30, 0xb0, 0x0b, 0x74,
+	0xef, 0x91, 0xd8, 0x80, 0x79, 0x18, 0x09, 0x0b, 0xa7, 0xdf, 0xf7, 0xa3, 0x34, 0x38, 0x63, 0x63,
+	0xbd, 0xc1, 0x8c, 0x43, 0xdd, 0xef, 0xbf, 0x48, 0x83, 0x33, 0x10, 0x45, 0x60, 0x46, 0x3a, 0x77,
+	0x49, 0x23, 0x27, 0x4f, 0x44, 0x2c, 0x33, 0x46, 0x3b, 0x47, 0x70, 0xf2, 0x7e, 0x8e, 0xb5, 0x17,
+	0x88, 0x97, 0xac, 0x77, 0x8b, 0xb9, 0xc7, 0x69, 0xa8, 0x7a, 0x96, 0x07, 0xad, 0x14, 0x64, 0x83,
+	0x23, 0xfc, 0x59, 0x55, 0x0a, 0x19, 0xf4, 0x96, 0x3a, 0xb2, 0xcc, 0x8a, 0x6e, 0xd6, 0xc5, 0x9c,
+	0x0a, 0x23, 0xb6, 0x69, 0x78, 0xf4, 0x7e, 0x20, 0x6e, 0x53, 0x0a, 0x03, 0xb9, 0x8f, 0x29, 0xfc,
+	0xbc, 0x48, 0x33, 0xbf, 0x50, 0xc1, 0x30, 0x49, 0xa3, 0x74, 0x30, 0x66, 0x2b, 0xdf, 0x21, 0x4c,
+	0x0f, 0x20, 0xbd, 0x22, 0xcd, 0x4e, 0x1c, 0x00, 0xbc, 0x13, 0x59, 0x55, 0x5d, 0x7c, 0x14, 0xdd,
+	0x37, 0x90, 0x55, 0x93, 0xdf, 0xba, 0x98, 0x1b, 0x86, 0x01, 0x47, 0x7a, 0x78, 0xf4, 0x0e, 0xc4,
+	0xdd, 0xf4, 0x5c, 0x19, 0x19, 0x45, 0xbe, 0x0c, 0x30, 0x71, 0xce, 0x0b, 0xa5, 0x0c, 0xf4, 0xc5,
+	0x62, 0xa3, 0xc0, 0xbf, 0xcb, 0xa8, 0x7d, 0x04, 0xf5, 0x18, 0xc3, 0x52, 0x7c, 0x21, 0xde, 0x30,
+	0xea, 0x5c, 0x99, 0x5c, 0xf9, 0xce, 0x51, 0xeb, 0x10, 0x1d, 0x70, 0x52, 0xe9, 0x89, 0x32, 0x82,
+	0x7b, 0x0c, 0xfd, 0x8c, 0x3d, 0xb7, 0x0e, 0xc1, 0x23, 0x27, 0x65, 0x6f, 0xdf, 0x12, 0xdb, 0xe7,
+	0xd2, 0x68, 0x79, 0x1a, 0x55, 0x06, 0x63, 0x20, 0xee, 0x73, 0x3e, 0x70, 0xd3, 0xb2, 0xed, 0x30,
+	0xba, 0xc0, 0xf4, 0xde, 0x13, 0x9b, 0x65, 0xbb, 0x52, 0x25, 0x94, 0x0c, 0x78, 0xae, 0x4d, 0xa9,
+	0x90, 0xc7, 0x62, 0xf3, 0x42, 0xa2, 0xd2, 0x93, 0xbc, 0x32, 0x4c, 0xca, 0x0b, 0x36, 0x80, 0xd5,
+	0x23, 0x0e, 0x0d, 0xac, 0xfd, 0xbf, 0x17, 0xc5, 0xb2, 0xad, 0xd2, 0xbd, 0xef, 0x8b, 0x5d, 0x34,
+	0x5c, 0x5b, 0xac, 0xfb, 0xf5, 0x74, 0x89, 0x56, 0x67, 0x0b, 0x20, 0xb6, 0xc9, 0x71, 0x35, 0x75,
+	0xb2, 0x7e, 0xc8, 0x35, 0xe7, 0xa4, 0xa4, 0xe2, 0x87, 0x6c, 0x3b, 0xce, 0x4c, 0xc0, 0x0f, 0xc9,
+	0xa2, 0x50, 0x66, 0xec, 0x43, 0xe9, 0x32, 0x18, 0x3b, 0x3f, 0x44, 0xd4, 0xa7, 0x48, 0x04, 0x47,
+	0x63, 0x61, 0x19, 0x06, 0x2e, 0x1b, 0x04, 0x69, 0xe1, 0x6e, 0x32, 0xf3, 0x15, 0x44, 0x2e, 0x1b,
+	0x08, 0x1f, 0x88, 0xa6, 0x6d, 0x53, 0xf1, 0x49, 0x2b, 0x4c, 0x43, 0xff, 0xf5, 0x03, 0x71, 0x9b,
+	0x2c, 0xed, 0x8a, 0xf9, 0xd2, 0x8a, 0xdd, 0x41, 0xcc, 0xd4, 0x09, 0x3b, 0x07, 0x38, 0x39, 0xe3,
+	0xa5, 0x8a, 0x03, 0x9c, 0x98, 0xf2, 0x33, 0x71, 0xcf, 0x26, 0xc0, 0xb6, 0x95, 0x2e, 0xc6, 0x50,
+	0xdd, 0xe4, 0xa3, 0x18, 0xcb, 0x6d, 0x5e, 0xd4, 0x77, 0x18, 0xf6, 0xb4, 0x44, 0x1d, 0x94, 0xa0,
+	0xeb, 0xf3, 0xd4, 0xc6, 0xf5, 0x79, 0xea, 0x03, 0xd1, 0x8c, 0xd3, 0x22, 0x35, 0x7e, 0x24, 0xc7,
+	0xe9, 0xa8, 0xb0, 0x21, 0x0b, 0x69, 0x2f, 0x90, 0x54, 0x42, 0x38, 0x34, 0xae, 0x54, 0x20, 0x1c,
+	0x1b, 0x31, 0xad, 0x04, 0x08, 0xca, 0xb7, 0x69, 0xd3, 0xca, 0x22, 0x35, 0x28, 0xdd, 0x6f, 0x89,
+	0x6d, 0x32, 0x3e, 0x5f, 0x27, 0x85, 0x1a, 0x40, 0x1a, 0x1f, 0xb2, 0x60, 0x69, 0x2d, 0xdf, 0x24,
+	0xf6, 0x91, 0xe3, 0x92, 0x50, 0x3f, 0x12, 0xad, 0xcb, 0xed, 0x58, 0xae, 0xb4, 0xc8, 0x6f, 0x4d,
+	0x36, 0x64, 0xd1, 0x3e, 0x12, 0x1b, 0xb8, 0xaf, 0xe9, 0xd3, 0xb0, 0xaa, 0x39, 0xfe, 0x0d, 0x64,
+	0x1c, 0x03, 0x9d, 0xde, 0xf2, 0x8e, 0xf0, 0xaa, 0x58, 0xee, 0x9f, 0x56, 0xf3, 0x7a, 0x09, 0xa6,
+	0x9e, 0xdb, 0x7f, 0xb8, 0x28, 0x16, 0x69, 0x53, 0xca, 0x7b, 0x93, 0x82, 0x96, 0x4e, 0x0a, 0x79,
+	0xe6, 0xf7, 0x53, 0x13, 0xf3, 0xb2, 0x68, 0x4a, 0x6d, 0x8e, 0x80, 0xf8, 0x2c, 0x35, 0xb1, 0xf7,
+	0x81, 0xd8, 0x0a, 0xc6, 0x11, 0x14, 0xd7, 0xc6, 0x47, 0x8b, 0x1c, 0xa8, 0x58, 0x25, 0x36, 0x74,
+	0x6d, 0x5a, 0xde, 0x7e, 0xc9, 0x82, 0x10, 0xe3, 0x9a, 0x84, 0x5a, 0xc6, 0xaa, 0x70, 0x27, 0x1e,
+	0xeb, 0x96, 0x71, 0xc8, 0x74, 0xf0, 0xd6, 0x0e, 0x3c, 0x54, 0x32, 0xf4, 0x63, 0x59, 0x28, 0xa3,
+	0x65, 0x64, 0x77, 0x05, 0x2c, 0xf7, 0x13, 0x25, 0xc3, 0x63, 0xe6, 0xd5, 0x5e, 0xe1, 0x1a, 0x2c,
+	0xd4, 0x5f, 0xe1, 0xc0, 0xff, 0x46, 0xdc, 0x70, 0x60, 0x36, 0x82, 0x45, 0xde, 0xcc, 0x60, 0x32,
+	0xdb, 0xc1, 0x9e, 0xb8, 0xe9, 0x80, 0xe7, 0x32, 0x3a, 0x57, 0x16, 0xbe, 0x54, 0x9f, 0xec, 0x67,
+	0xc0, 0xe3, 0x36, 0x1d, 0xd1, 0x0c, 0x75, 0x9e, 0x45, 0x32, 0x20, 0xb9, 0x70, 0x1c, 0xab, 0xd2,
+	0xc0, 0x39, 0x54, 0x7f, 0xfb, 0xb6, 0xf4, 0x5f, 0xad, 0x52, 0x5f, 0x60, 0xb9, 0x4d, 0x01, 0xa7,
+	0x12, 0x65, 0x04, 0x97, 0xdb, 0xc8, 0xa8, 0x04, 0x97, 0x7b, 0x62, 0xc5, 0x82, 0xc1, 0x68, 0xc9,
+	0xaa, 0x05, 0xc3, 0xc0, 0x6a, 0xef, 0x08, 0x81, 0xb5, 0x71, 0x04, 0x7e, 0xd5, 0x1a, 0x35, 0x50,
+	0x5e, 0x00, 0x61, 0x6a, 0xe9, 0xbc, 0x3a, 0xb5, 0x74, 0x7e, 0x57, 0x78, 0x76, 0x7d, 0x0e, 0x53,
+	0x93, 0x2b, 0xb2, 0x46, 0x32, 0xe0, 0x0d, 0xe6, 0x7c, 0xe2, 0x18, 0x60, 0xbb, 0x35, 0xe7, 0xe3,
+	0x9b, 0xcc, 0x86, 0xa9, 0x1b, 0xd5, 0xfa, 0xb4, 0x9b, 0xc5, 0x78, 0x90, 0xa5, 0x23, 0x3f, 0x1f,
+	0x65, 0x59, 0x34, 0xc6, 0x18, 0xcf, 0x86, 0x0b, 0x19, 0x6f, 0x0f, 0xa9, 0x10, 0xdb, 0x21, 0x5b,
+	0xc8, 0x74, 0x5e, 0xe0, 0x36, 0x84, 0x49, 0xcf, 0x6c, 0xe9, 0xd9, 0x24, 0x62, 0x0f, 0x69, 0xa0,
+	0x66, 0xa3, 0x6c, 0xd4, 0xa7, 0x88, 0x44, 0xd1, 0x65, 0xcd, 0x91, 0x29, 0x14, 0xad, 0x8b, 0x39,
+	0x18, 0x13, 0x45, 0x12, 0x78, 0x84, 0xa6, 0xa4, 0xef, 0x58, 0x05, 0x43, 0x99, 0xe8, 0x3c, 0xe6,
+	0xe2, 0x72, 0x0d, 0xc9, 0xc7, 0x96, 0xda, 0xfe, 0xdb, 0x25, 0xb1, 0x6c, 0xb7, 0x67, 0x21, 0x4a,
+	0x70, 0x54, 0xc6, 0x35, 0xa4, 0xfc, 0x81, 0xd1, 0x51, 0x64, 0xf3, 0x5a, 0x8f, 0x78, 0xb8, 0x92,
+	0xd4, 0x73, 0xe4, 0x50, 0xbd, 0xc2, 0xee, 0xdf, 0x28, 0xb0, 0xf7, 0x02, 0xd2, 0xaf, 0x59, 0x5b,
+	0xaf, 0x90, 0xf3, 0x37, 0xea, 0x13, 0x62, 0xc0, 0x1b, 0x6c, 0x46, 0x65, 0xb7, 0xef, 0x30, 0xa9,
+	0xe2, 0x72, 0x84, 0x79, 0x9c, 0x85, 0x62, 0x5e, 0xf5, 0x35, 0xb1, 0x56, 0xba, 0x70, 0xc8, 0xed,
+	0x79, 0x19, 0xad, 0x5a, 0xea, 0x09, 0x10, 0xc1, 0xd2, 0x89, 0x90, 0x26, 0x3a, 0xf0, 0x65, 0x52,
+	0x68, 0xbf, 0x18, 0xaa, 0x7e, 0x61, 0x13, 0xde, 0x92, 0xb9, 0x9f, 0x14, 0xfa, 0x04, 0x58, 0x90,
+	0xdd, 0xab, 0x34, 0x0f, 0x79, 0xed, 0xe0, 0x33, 0xc5, 0x0d, 0x19, 0xab, 0x48, 0xe5, 0xb9, 0x1f,
+	0xaa, 0x5c, 0x0f, 0x12, 0x1f, 0xca, 0xa9, 0x32, 0x6e, 0x30, 0xf3, 0x10, 0x79, 0x87, 0x69, 0x6a,
+	0xbc, 0xef, 0x88, 0x9d, 0x21, 0xe4, 0x1f, 0x6e, 0x9c, 0x58, 0x92, 0x0d, 0x65, 0x12, 0x46, 0xf6,
+	0x46, 0xd2, 0x2d, 0x00, 0xd8, 0x70, 0x01, 0x8d, 0x3e, 0x41, 0x2e, 0xe8, 0x89, 0x13, 0x3b, 0x48,
+	0xe5, 0x71, 0x7a, 0xb4, 0x92, 0xd6, 0x1c, 0x99, 0xe6, 0xb7, 0x23, 0x96, 0xcf, 0x14, 0xc7, 0x4b,
+	0x3e, 0x91, 0x3a, 0x53, 0x63, 0x5b, 0x63, 0x9c, 0xa9, 0x31, 0x0e, 0x18, 0xc4, 0x37, 0xb6, 0x89,
+	0x05, 0xad, 0x20, 0x8f, 0x79, 0x4f, 0x81, 0xc5, 0x29, 0x4f, 0xa5, 0x05, 0x67, 0x82, 0xd4, 0xa2,
+	0x59, 0x6b, 0x41, 0x19, 0x20, 0xb5, 0x80, 0x92, 0x6d, 0x54, 0x60, 0x96, 0x95, 0xa9, 0x50, 0xda,
+	0x95, 0xd5, 0x64, 0xe2, 0x2b, 0xa0, 0xb9, 0x8d, 0xcb, 0x20, 0x8d, 0x33, 0x69, 0x0a, 0xf4, 0x0c,
+	0x59, 0x9a, 0xd3, 0x6e, 0x6d, 0xac, 0xe2, 0xd4, 0x8c, 0x79, 0x95, 0xe1, 0xc6, 0xe5, 0x41, 0x09,
+	0x7b, 0xc5, 0xa8, 0x63, 0x04, 0x41, 0x84, 0x33, 0x2a, 0x4e, 0x0b, 0x4e, 0x54, 0x79, 0xb1, 0xad,
+	0x10, 0x0d, 0x87, 0x85, 0x10, 0x1d, 0x97, 0xae, 0x72, 0x9d, 0x21, 0x3a, 0x76, 0x5e, 0xf2, 0x91,
+	0xd8, 0x30, 0x69, 0xda, 0xf7, 0xa3, 0xd1, 0x60, 0x20, 0x07, 0xca, 0x37, 0x32, 0x38, 0xe3, 0x75,
+	0x76, 0x03, 0x18, 0x2f, 0x88, 0xde, 0x95, 0xc1, 0x19, 0x60, 0x71, 0x72, 0x79, 0xa4, 0x43, 0xdc,
+	0x76, 0x04, 0x95, 0xd3, 0x62, 0xbb, 0x01, 0x8c, 0x1e, 0xd1, 0x51, 0xdd, 0x6f, 0x88, 0xd5, 0xfc,
+	0x6c, 0x8c, 0xbb, 0xfc, 0xa4, 0x0f, 0x5a, 0x77, 0x4d, 0x4b, 0xb4, 0x05, 0x58, 0x9e, 0xa5, 0xa6,
+	0xc8, 0x7d, 0x99, 0x65, 0x5c, 0xf8, 0xfa, 0x67, 0xba, 0xe0, 0x65, 0xb8, 0x49, 0xcc, 0x7d, 0xc7,
+	0xfb, 0x91, 0xa6, 0x7b, 0x57, 0xe0, 0xb5, 0x68, 0x73, 0x07, 0x9f, 0xbd, 0xae, 0x78, 0xab, 0x18,
+	0x2a, 0x1f, 0x9e, 0x07, 0xb2, 0x50, 0xfe, 0x20, 0x92, 0x79, 0xee, 0xa7, 0x90, 0x53, 0x56, 0x37,
+	0x88, 0xa3, 0x31, 0xef, 0xf1, 0x74, 0x8a, 0xa1, 0x3a, 0x61, 0xf0, 0x73, 0xc0, 0xbe, 0x04, 0xe8,
+	0x51, 0x15, 0xd9, 0xce, 0xc4, 0x12, 0x9f, 0xac, 0x80, 0xd3, 0x1d, 0x80, 0xca, 0x38, 0x2c, 0x70,
+	0x01, 0x0b, 0xa4, 0xb2, 0xca, 0xae, 0x6d, 0x33, 0xce, 0x5e, 0xde, 0x66, 0xac, 0x40, 0x50, 0x1c,
+	0x73, 0x35, 0x08, 0x96, 0x96, 0x7f, 0x3c, 0x2b, 0x56, 0x2a, 0x47, 0x32, 0x10, 0x23, 0xe5, 0xe8,
+	0x73, 0x1d, 0x69, 0x69, 0xc6, 0xae, 0xea, 0x0b, 0x86, 0x3a, 0xe3, 0x11, 0x6c, 0x39, 0x2e, 0xd7,
+	0x7b, 0x07, 0x43, 0x9d, 0xa1, 0xf3, 0x18, 0xea, 0x0c, 0xed, 0x6b, 0x04, 0xee, 0x84, 0xf3, 0x08,
+	0x4e, 0x62, 0x81, 0x77, 0x60, 0x59, 0xaf, 0xac, 0xeb, 0xa6, 0x99, 0xf9, 0x69, 0xdf, 0x0f, 0x64,
+	0xac, 0x8c, 0xcc, 0xed, 0x6e, 0x3e, 0x31, 0x5e, 0xf6, 0x0f, 0x88, 0x0c, 0xf1, 0xa3, 0xc4, 0x46,
+	0x3a, 0x94, 0x26, 0x67, 0x57, 0xb3, 0x66, 0xa1, 0x2f, 0x90, 0xea, 0x3d, 0x13, 0xf7, 0x4b, 0x64,
+	0xac, 0xa3, 0x48, 0x63, 0xe4, 0xf7, 0x2f, 0xe4, 0x39, 0x58, 0x19, 0xb6, 0x24, 0xb7, 0x73, 0xdb,
+	0xb6, 0x3c, 0x76, 0xa8, 0xd7, 0xf2, 0x5c, 0x75, 0x11, 0x03, 0x39, 0x7d, 0xd9, 0xcf, 0x28, 0x2a,
+	0x8c, 0xcc, 0xd1, 0x7b, 0x71, 0x17, 0xe4, 0x96, 0x5a, 0xb6, 0x8b, 0x1f, 0x3b, 0x00, 0x35, 0x6f,
+	0xff, 0xff, 0x45, 0xb1, 0x6c, 0x0f, 0xaa, 0x50, 0xa2, 0xe4, 0x45, 0x92, 0x14, 0x8a, 0x50, 0x17,
+	0x21, 0x9c, 0x44, 0x91, 0xfb, 0x29, 0x30, 0xbb, 0x96, 0x87, 0x12, 0x95, 0xc6, 0x69, 0xc0, 0xa8,
+	0x20, 0x35, 0x61, 0x45, 0xa2, 0xd2, 0xb0, 0xfc, 0xbb, 0xcc, 0x81, 0x14, 0xd0, 0xe9, 0x0b, 0x65,
+	0x8d, 0x29, 0x11, 0x04, 0x7d, 0x5b, 0x20, 0xd8, 0x0a, 0xf7, 0x80, 0xd9, 0x87, 0xc4, 0xf5, 0x9e,
+	0x88, 0x3b, 0xd6, 0x41, 0xca, 0x28, 0x1a, 0xfb, 0x32, 0xfc, 0x8f, 0xa3, 0xbc, 0xc0, 0xf2, 0x89,
+	0x5c, 0x0a, 0x09, 0x7b, 0xb7, 0x0a, 0xda, 0x77, 0x18, 0xf2, 0x30, 0xef, 0x08, 0xaf, 0x3f, 0x8a,
+	0x22, 0x3f, 0x0a, 0x42, 0x3f, 0x94, 0xf9, 0xf0, 0x34, 0x95, 0xc6, 0x5e, 0x20, 0x5c, 0x07, 0xce,
+	0x8b, 0x20, 0x3c, 0xb4, 0x74, 0xef, 0x43, 0xb1, 0x7d, 0x19, 0x4d, 0xf7, 0x35, 0x48, 0xb6, 0x5b,
+	0x93, 0x4d, 0xf0, 0xee, 0x06, 0xb8, 0xf3, 0x51, 0xe8, 0x1b, 0x8d, 0x55, 0x1a, 0x6b, 0xc8, 0xce,
+	0x71, 0x89, 0xdd, 0xf9, 0x28, 0xec, 0x22, 0x9f, 0x96, 0x89, 0x9d, 0xe3, 0x81, 0xb8, 0x1b, 0xa7,
+	0xa7, 0x1a, 0xa6, 0x34, 0x4c, 0x13, 0xe5, 0x5f, 0x68, 0x43, 0x91, 0xc4, 0x6e, 0x68, 0x72, 0x38,
+	0xd8, 0x25, 0xd4, 0x2b, 0x00, 0xbd, 0x66, 0x8c, 0xdd, 0xda, 0xf4, 0x9e, 0x8a, 0x7b, 0xf1, 0x28,
+	0x2a, 0xb4, 0xdf, 0x1f, 0x25, 0x01, 0x1d, 0xf2, 0x95, 0x85, 0x29, 0xee, 0x4d, 0x71, 0x8c, 0xb8,
+	0x8d, 0xb0, 0x67, 0x0e, 0x65, 0xeb, 0x53, 0xdc, 0xcf, 0x83, 0x2a, 0xa4, 0xde, 0x8a, 0x25, 0x1e,
+	0xdb, 0x93, 0xd3, 0x46, 0x77, 0x3b, 0xaf, 0xb6, 0xd8, 0x77, 0x6c, 0xb0, 0xa6, 0x89, 0xb6, 0x36,
+	0xb2, 0x53, 0x50, 0xd9, 0xaa, 0x35, 0xb4, 0xc1, 0x1d, 0xca, 0x8a, 0x7a, 0x2b, 0xe7, 0x9e, 0x9b,
+	0x5c, 0x56, 0x54, 0x9b, 0x39, 0x47, 0x7d, 0xb9, 0x9d, 0x51, 0xb1, 0x42, 0x87, 0xb4, 0x3a, 0xa5,
+	0x5d, 0x97, 0x99, 0x60, 0xbd, 0x13, 0xed, 0xf2, 0xa1, 0xee, 0x17, 0x1c, 0x63, 0xbc, 0x5a, 0xa3,
+	0x1e, 0x70, 0xda, 0xff, 0x6d, 0x5e, 0x2c, 0xe0, 0x29, 0x2d, 0x78, 0x06, 0x19, 0xca, 0x0c, 0x57,
+	0x4c, 0x1f, 0x1c, 0xa0, 0x92, 0xd6, 0xfd, 0xdd, 0xb0, 0x8c, 0x67, 0xd2, 0x7c, 0xaa, 0xa4, 0xc1,
+	0xe3, 0xaa, 0x22, 0x4e, 0xf3, 0x6c, 0xa8, 0xdc, 0x01, 0x54, 0x85, 0x52, 0x6e, 0x70, 0x29, 0x59,
+	0xdf, 0xe0, 0x52, 0x12, 0x2f, 0xc5, 0x05, 0x91, 0x92, 0x89, 0xbd, 0xf6, 0x82, 0x3f, 0xbc, 0x96,
+	0x58, 0x0a, 0xe5, 0x18, 0x77, 0xb7, 0xc9, 0x7a, 0xed, 0x4f, 0xc8, 0xe5, 0xfa, 0xd2, 0xe6, 0xf3,
+	0xf0, 0x88, 0x94, 0x74, 0xc0, 0x96, 0x07, 0x8f, 0xb0, 0x0c, 0xe0, 0x5d, 0x91, 0x8c, 0x33, 0x3f,
+	0x54, 0x91, 0x1c, 0xfb, 0x69, 0xbf, 0xcf, 0xa6, 0xb5, 0x6e, 0x39, 0x87, 0xc0, 0x78, 0xd9, 0xef,
+	0x7b, 0xdf, 0x10, 0xb7, 0x1c, 0xda, 0x48, 0x9d, 0xf8, 0xfd, 0x94, 0xb6, 0x9f, 0xd8, 0x8c, 0x36,
+	0x2d, 0xb7, 0x2b, 0x75, 0xf2, 0x2c, 0xc5, 0xcd, 0x27, 0x48, 0xdd, 0x87, 0x78, 0x5f, 0xb5, 0xb2,
+	0x4e, 0x6d, 0xea, 0x4e, 0x8c, 0x72, 0x6d, 0x02, 0x18, 0x23, 0x1f, 0x28, 0xa2, 0xaf, 0xf0, 0xe0,
+	0x2f, 0x67, 0x4b, 0x59, 0xb7, 0x8c, 0x67, 0x4c, 0xc7, 0x0b, 0xbc, 0x20, 0x6c, 0xde, 0x53, 0x85,
+	0x67, 0xdc, 0x8f, 0x87, 0xf0, 0x5b, 0x8c, 0x4c, 0xc2, 0x3a, 0x5f, 0x06, 0xc2, 0xc9, 0xc8, 0x24,
+	0x35, 0x35, 0xf3, 0x6e, 0x2b, 0x8c, 0x76, 0x52, 0xcd, 0xb4, 0x25, 0xf8, 0x42, 0xc6, 0x19, 0x55,
+	0x90, 0xa3, 0x60, 0xe8, 0x1b, 0x25, 0x31, 0x9c, 0x23, 0xfe, 0x86, 0xad, 0x20, 0x47, 0xc1, 0xb0,
+	0x4b, 0x0c, 0x40, 0xb7, 0x7f, 0xb1, 0x24, 0x16, 0xf0, 0x28, 0x1e, 0x77, 0xe8, 0x65, 0x70, 0x06,
+	0x0e, 0xc3, 0x5d, 0x84, 0x95, 0xc1, 0xd9, 0x8b, 0x20, 0xc4, 0x3b, 0x3e, 0x78, 0x26, 0x0b, 0xfe,
+	0x56, 0xd9, 0x6a, 0x71, 0x25, 0x90, 0xe6, 0x88, 0x49, 0x30, 0x09, 0x80, 0xe0, 0xca, 0xb7, 0x66,
+	0x10, 0x48, 0x83, 0x8b, 0xdc, 0xbb, 0x29, 0x16, 0x81, 0x59, 0x9c, 0x3b, 0x3b, 0x90, 0xe6, 0xe4,
+	0x1c, 0xc9, 0xa1, 0x1f, 0x9e, 0x5b, 0x27, 0xb6, 0x10, 0x84, 0x87, 0xe7, 0x21, 0x44, 0x18, 0x48,
+	0x85, 0x15, 0x1e, 0xfa, 0xe6, 0x69, 0xa4, 0xfc, 0x08, 0xcf, 0x1a, 0xf3, 0xc0, 0x28, 0x95, 0x54,
+	0x5d, 0xd8, 0x6d, 0xc2, 0x1d, 0x10, 0xec, 0x05, 0xa0, 0x7a, 0x08, 0x42, 0x57, 0x06, 0xf5, 0x9f,
+	0x4b, 0xb7, 0xa3, 0x74, 0x64, 0xb8, 0x07, 0x57, 0xff, 0xd9, 0x7c, 0x1b, 0x78, 0xd4, 0xce, 0xfb,
+	0xb6, 0x68, 0xd9, 0x36, 0xe0, 0x38, 0xf3, 0x2c, 0xd2, 0x85, 0x6d, 0x46, 0x26, 0x66, 0xfb, 0x7c,
+	0x11, 0x84, 0x3d, 0xe0, 0x72, 0xc3, 0x77, 0x85, 0xe7, 0xce, 0x6d, 0x50, 0x4e, 0x7d, 0x19, 0x58,
+	0x1b, 0xdb, 0xb0, 0x9c, 0x23, 0xcb, 0xc0, 0x83, 0x76, 0x19, 0x28, 0x0c, 0x3a, 0x83, 0x84, 0x2e,
+	0xee, 0x08, 0x3e, 0x68, 0x97, 0x81, 0xea, 0x96, 0x64, 0xc8, 0x92, 0x07, 0x2a, 0xc7, 0xf3, 0x66,
+	0x7b, 0xd4, 0x4c, 0xd6, 0xb5, 0xc6, 0x64, 0xbb, 0x6d, 0xbd, 0x2e, 0xe6, 0x06, 0x59, 0xce, 0xa6,
+	0x05, 0x8f, 0x94, 0x60, 0xf3, 0x2b, 0xfd, 0xb4, 0xff, 0xc1, 0xde, 0xb9, 0x2d, 0x0a, 0x1d, 0xf9,
+	0x25, 0x50, 0x01, 0xc8, 0xae, 0xdb, 0xe9, 0x98, 0x0c, 0x6c, 0x8d, 0xc8, 0x4e, 0xcd, 0x3d, 0xf1,
+	0x56, 0x22, 0xcf, 0xf5, 0x80, 0x76, 0x75, 0x0a, 0x23, 0xfb, 0x7d, 0x1d, 0xf8, 0x3a, 0xe9, 0xa7,
+	0x26, 0x26, 0x9a, 0x8d, 0x15, 0x64, 0x70, 0x6f, 0x94, 0xe8, 0x13, 0x02, 0x1f, 0x95, 0x58, 0x1b,
+	0x38, 0xde, 0x17, 0x5b, 0x65, 0x2a, 0xe0, 0x46, 0x96, 0x73, 0x5a, 0xeb, 0xd9, 0x1c, 0xc0, 0x49,
+	0x2f, 0x87, 0xa9, 0xa6, 0x85, 0xe4, 0x7c, 0x16, 0x1e, 0xc1, 0x44, 0xa9, 0x3e, 0x4d, 0xfb, 0x7b,
+	0x7b, 0xef, 0x9f, 0x73, 0xfa, 0xba, 0x82, 0xb4, 0x97, 0x48, 0x02, 0x4f, 0xcb, 0x19, 0x3a, 0xd5,
+	0x5e, 0x18, 0x40, 0xe8, 0x9a, 0x0a, 0x25, 0xb1, 0x37, 0x29, 0x31, 0x47, 0xee, 0xb1, 0x63, 0x42,
+	0x6e, 0x64, 0x52, 0x19, 0xfa, 0x46, 0xe5, 0xc1, 0x48, 0xf9, 0x10, 0x9b, 0x6d, 0x3d, 0x09, 0xf4,
+	0x2e, 0x92, 0x0f, 0x64, 0x14, 0x61, 0x72, 0x9c, 0x29, 0xbc, 0xb7, 0x8d, 0x87, 0x5b, 0x9c, 0xcc,
+	0x36, 0x99, 0x88, 0xf7, 0xd5, 0xa1, 0xa6, 0xb3, 0x20, 0x4e, 0x3c, 0x29, 0x79, 0xb5, 0x4d, 0x39,
+	0xf7, 0x7c, 0x43, 0xac, 0x9e, 0xa7, 0x3a, 0x28, 0x95, 0x4e, 0xe7, 0x94, 0x4d, 0x24, 0xda, 0x5b,
+	0x05, 0x5d, 0xb1, 0x6c, 0x2f, 0xc5, 0x40, 0x36, 0x8b, 0x67, 0x27, 0x64, 0xeb, 0x36, 0x9b, 0x05,
+	0x12, 0x59, 0x38, 0xbc, 0x18, 0x85, 0xab, 0x53, 0x83, 0x20, 0x9b, 0xe9, 0xac, 0x5a, 0x2a, 0xe0,
+	0x4c, 0xfb, 0xff, 0x2e, 0x88, 0x65, 0x7b, 0x61, 0x06, 0x4a, 0x7a, 0x2c, 0x27, 0x33, 0x9d, 0x04,
+	0x43, 0xac, 0xea, 0xdc, 0x59, 0x48, 0x52, 0xe8, 0x57, 0x40, 0x85, 0x62, 0xee, 0xf2, 0x16, 0xeb,
+	0x85, 0x4e, 0xc2, 0xf4, 0x62, 0xda, 0x16, 0xeb, 0x6b, 0xe4, 0x40, 0x0c, 0xa2, 0xc3, 0x21, 0x2c,
+	0xab, 0x8c, 0x3e, 0x97, 0x81, 0x4d, 0xa2, 0x6e, 0xe0, 0xc9, 0x10, 0x54, 0x56, 0x44, 0x76, 0x07,
+	0x17, 0x54, 0xa5, 0x8c, 0x92, 0x7c, 0x28, 0x43, 0x7b, 0x3a, 0xb2, 0x6e, 0xc1, 0x3d, 0xa6, 0x83,
+	0xe4, 0xf8, 0xd8, 0x89, 0x81, 0xe4, 0x5d, 0x9a, 0x74, 0xde, 0xc4, 0xa0, 0x3b, 0x42, 0xd0, 0x59,
+	0xa3, 0xce, 0xdc, 0x06, 0x52, 0x03, 0x8f, 0x18, 0x81, 0xe0, 0xb5, 0xc5, 0x72, 0x90, 0xe6, 0xb1,
+	0x2a, 0x74, 0xc0, 0xee, 0xc2, 0xfd, 0xf6, 0x8e, 0xc4, 0x03, 0xbc, 0xc9, 0x05, 0x72, 0xb4, 0xf7,
+	0x89, 0xfc, 0x58, 0x1b, 0x93, 0x1a, 0x97, 0xb5, 0xb0, 0xb3, 0xb8, 0x6b, 0x81, 0x56, 0xa0, 0xc7,
+	0x08, 0xb3, 0x59, 0xcb, 0x94, 0x8d, 0x5a, 0x96, 0x5b, 0x63, 0xca, 0x46, 0x2d, 0x0b, 0xee, 0x9e,
+	0x58, 0xe1, 0x43, 0x4d, 0x1c, 0x3a, 0x79, 0x0d, 0x41, 0x67, 0x99, 0x38, 0xf6, 0x3d, 0x71, 0x13,
+	0x12, 0x16, 0xda, 0x9b, 0xcf, 0x8c, 0x1c, 0xfb, 0x49, 0xfa, 0xc5, 0x17, 0x91, 0xdd, 0x55, 0xda,
+	0xb4, 0xcc, 0x1e, 0xf0, 0x3e, 0x45, 0x16, 0xcc, 0xc9, 0xd9, 0xc6, 0x95, 0x73, 0x22, 0xcf, 0x72,
+	0xd7, 0x02, 0xaf, 0x98, 0xd3, 0x91, 0x78, 0x80, 0x2b, 0x2b, 0x92, 0x63, 0x65, 0xfc, 0x1c, 0x0f,
+	0x47, 0x75, 0x92, 0xdb, 0x9d, 0x60, 0xac, 0xe1, 0xd8, 0x0d, 0xdd, 0x2d, 0x81, 0x3d, 0xc0, 0x1d,
+	0x39, 0x18, 0x56, 0x6f, 0xde, 0x9b, 0x62, 0x8d, 0xe4, 0xe1, 0x43, 0x3e, 0x79, 0xa6, 0x6c, 0x05,
+	0xdd, 0x24, 0xea, 0xcb, 0x44, 0xfd, 0x48, 0x8d, 0xdb, 0x7f, 0xd5, 0x10, 0x8b, 0x74, 0x55, 0x0b,
+	0xfc, 0x82, 0x3c, 0xcd, 0xd9, 0x44, 0xe1, 0x11, 0xfc, 0x02, 0x97, 0x06, 0x74, 0x13, 0x8b, 0x43,
+	0x17, 0xd1, 0x9e, 0x00, 0xc9, 0xbb, 0x2b, 0x56, 0x64, 0x6e, 0xfc, 0x22, 0xc8, 0xfd, 0xc2, 0x04,
+	0xf6, 0xde, 0x8c, 0xcc, 0xcd, 0x49, 0x90, 0x9f, 0x98, 0x00, 0xe4, 0x59, 0xd6, 0x6b, 0xf6, 0x3a,
+	0xd1, 0xa9, 0x1c, 0xd8, 0x5d, 0x7e, 0xc7, 0xe4, 0xfb, 0x44, 0xa7, 0x72, 0x00, 0x3e, 0x03, 0xcd,
+	0xeb, 0x54, 0x45, 0x0e, 0x4e, 0x66, 0xb8, 0x06, 0xf4, 0x27, 0x2a, 0x9a, 0x44, 0xe2, 0x6e, 0x29,
+	0x23, 0x17, 0x4b, 0x24, 0xa4, 0x51, 0x13, 0x48, 0x5c, 0x05, 0x8c, 0x5c, 0x2a, 0x91, 0xb0, 0x06,
+	0x18, 0x79, 0x5b, 0x08, 0x75, 0x2a, 0xfd, 0x53, 0x99, 0xfb, 0xa7, 0xd2, 0x7e, 0x2c, 0xa1, 0x4e,
+	0xe5, 0x13, 0x99, 0x3f, 0x91, 0xde, 0xb6, 0x58, 0x52, 0xa7, 0xa1, 0x1f, 0x9c, 0xda, 0x7b, 0x33,
+	0x8b, 0xea, 0x34, 0x3c, 0x38, 0x0d, 0xf0, 0xd0, 0x2c, 0xcf, 0xd8, 0xa2, 0xe0, 0x11, 0x5c, 0x66,
+	0x5f, 0x16, 0x7a, 0x30, 0x52, 0xae, 0x4c, 0xe2, 0x73, 0x26, 0x36, 0xa6, 0x9b, 0xcc, 0xe6, 0x4a,
+	0x89, 0x0f, 0x97, 0x70, 0x3b, 0x12, 0x4c, 0xb4, 0x3a, 0xa9, 0x26, 0x6f, 0x47, 0xa6, 0x49, 0x51,
+	0x99, 0x94, 0x3b, 0x55, 0x8b, 0x75, 0x18, 0x46, 0x6e, 0x5e, 0xd5, 0x53, 0xb5, 0x63, 0xe4, 0x30,
+	0xfe, 0x91, 0xd8, 0xe0, 0xb3, 0xdd, 0x8a, 0x14, 0xd6, 0xec, 0x15, 0xb5, 0x34, 0x29, 0x2a, 0x62,
+	0xd8, 0x16, 0x4b, 0x3a, 0x4f, 0xfd, 0xbe, 0xfe, 0x9c, 0xa3, 0xd1, 0xa2, 0xce, 0xd3, 0x67, 0x1a,
+	0x0b, 0xff, 0xb3, 0x44, 0xb9, 0xe6, 0x14, 0x67, 0x04, 0x90, 0xb8, 0xe5, 0xbe, 0xb8, 0x13, 0xc9,
+	0x44, 0xf9, 0xa1, 0xca, 0xa4, 0xc1, 0xd0, 0x3b, 0x71, 0xbc, 0x46, 0x91, 0xa7, 0x0d, 0xa0, 0x43,
+	0x8b, 0xa9, 0x9f, 0xac, 0x3d, 0x10, 0x4d, 0xec, 0xe2, 0x4c, 0xa9, 0x0c, 0xe4, 0xc5, 0x01, 0x09,
+	0x68, 0x3f, 0x22, 0x12, 0x48, 0x29, 0x86, 0x94, 0xb4, 0x6a, 0x53, 0x9b, 0x1c, 0x76, 0xa5, 0x4e,
+	0x2a, 0xe6, 0xf4, 0x40, 0x34, 0x13, 0xcc, 0x47, 0xcf, 0x35, 0x9e, 0xb3, 0x51, 0xf8, 0x59, 0x41,
+	0xda, 0x67, 0x48, 0x82, 0x04, 0x24, 0x93, 0x46, 0x46, 0x11, 0xd4, 0x3a, 0xd6, 0x22, 0x39, 0x00,
+	0x6d, 0x58, 0xce, 0xbe, 0x65, 0xc0, 0x0c, 0x33, 0x99, 0xe7, 0x2a, 0x19, 0x28, 0xbe, 0x23, 0x17,
+	0x8c, 0xf2, 0x21, 0x2c, 0x50, 0x1e, 0x08, 0x05, 0xa5, 0xb6, 0x03, 0xc1, 0x68, 0x0e, 0x08, 0xc2,
+	0x83, 0x7a, 0x42, 0x5d, 0xc0, 0xda, 0xca, 0x54, 0xa8, 0xf2, 0xc2, 0x68, 0x99, 0xf8, 0x99, 0x49,
+	0x0b, 0x3e, 0xd6, 0xa5, 0x88, 0xb5, 0xcb, 0xa0, 0x57, 0x0e, 0xf3, 0xca, 0x41, 0x40, 0xfd, 0x14,
+	0x93, 0x39, 0xe9, 0xe2, 0x97, 0xb7, 0xca, 0x4b, 0x7a, 0x07, 0xc4, 0xe1, 0x77, 0x7e, 0x2c, 0x76,
+	0x2b, 0xb7, 0xfa, 0x20, 0x32, 0xe5, 0x51, 0xc5, 0x10, 0xe8, 0x4a, 0xce, 0xb6, 0xbb, 0xdc, 0x97,
+	0x14, 0xba, 0x17, 0x95, 0x06, 0xb1, 0x2f, 0xee, 0x60, 0x24, 0xb7, 0x79, 0x0b, 0x6e, 0x70, 0x56,
+	0x53, 0x30, 0xba, 0xb4, 0xd3, 0x06, 0x10, 0xa7, 0x2b, 0x3d, 0x3d, 0x48, 0xaa, 0xd9, 0x58, 0x47,
+	0xac, 0x9a, 0x51, 0xe2, 0xf7, 0x23, 0x59, 0xf8, 0x85, 0x36, 0xf6, 0x1e, 0xcf, 0x8a, 0x19, 0x25,
+	0xcf, 0x22, 0x59, 0x9c, 0x68, 0x83, 0xe7, 0x3d, 0x38, 0x3e, 0x5c, 0xfc, 0x76, 0xbd, 0xdc, 0xe6,
+	0xfd, 0x34, 0x25, 0x0b, 0x58, 0xfd, 0x76, 0xa5, 0xbc, 0x2f, 0xb6, 0xa0, 0x1b, 0x3f, 0x33, 0x2a,
+	0x07, 0x3b, 0x8b, 0xd3, 0x44, 0x17, 0xa9, 0xe1, 0x2b, 0x3d, 0x1e, 0xf0, 0x5e, 0x11, 0xeb, 0x98,
+	0x38, 0xed, 0xff, 0xba, 0x2c, 0xe6, 0x61, 0x72, 0xde, 0xbf, 0x15, 0xbb, 0xa5, 0x5f, 0xaa, 0x6c,
+	0x28, 0x9c, 0x8e, 0x8a, 0xc2, 0x6d, 0x7d, 0xec, 0x38, 0x48, 0x59, 0xb2, 0x3c, 0x41, 0x80, 0xf7,
+	0x91, 0x68, 0x95, 0xed, 0x5d, 0x00, 0x92, 0xe1, 0xc8, 0x5d, 0x65, 0x28, 0xf7, 0xa9, 0x6c, 0x0c,
+	0xda, 0x07, 0x2e, 0x54, 0xfa, 0x93, 0x1e, 0xd1, 0x95, 0xcf, 0x54, 0x5c, 0x91, 0x13, 0xdd, 0xad,
+	0xbb, 0x46, 0x87, 0xc1, 0x22, 0xeb, 0x2d, 0x81, 0x71, 0xde, 0x0f, 0x46, 0x19, 0xde, 0x8e, 0x70,
+	0x1f, 0x47, 0x60, 0xf4, 0x3e, 0x18, 0x65, 0x9f, 0x20, 0x11, 0x82, 0x00, 0xe2, 0xc2, 0xf4, 0xa2,
+	0x76, 0x8d, 0x03, 0xe3, 0xf9, 0x61, 0x7a, 0x41, 0x37, 0x47, 0x6c, 0x6f, 0xfd, 0x34, 0x0a, 0x7d,
+	0x2a, 0xd8, 0x16, 0xcb, 0xde, 0x9e, 0xa5, 0x51, 0x78, 0x82, 0xd5, 0x9a, 0x4d, 0x0e, 0x20, 0x95,
+	0x31, 0x52, 0x47, 0xf6, 0xfa, 0x0d, 0xfa, 0x5a, 0xa6, 0x95, 0xfb, 0xe9, 0x60, 0x23, 0x30, 0x3d,
+	0x28, 0xc9, 0xcb, 0x8b, 0x38, 0x9b, 0x96, 0x89, 0xf7, 0x7d, 0x89, 0x05, 0xd9, 0x15, 0x39, 0x26,
+	0xd7, 0x33, 0x9f, 0x0a, 0x21, 0xd5, 0x75, 0xed, 0xfc, 0x1d, 0xf6, 0xeb, 0x42, 0xab, 0xa8, 0xf8,
+	0x3b, 0xe8, 0xd5, 0x45, 0xd3, 0xef, 0x89, 0x36, 0xef, 0x3e, 0xf8, 0x41, 0x9a, 0x46, 0xf8, 0xb7,
+	0x14, 0x18, 0x39, 0xe1, 0x6d, 0x46, 0x1c, 0x10, 0xa0, 0x14, 0xdd, 0x63, 0xb1, 0x89, 0x0e, 0x66,
+	0x42, 0xb9, 0x4d, 0x7b, 0xd8, 0xa3, 0x93, 0xba, 0x5e, 0xbf, 0x23, 0x76, 0x2a, 0x0e, 0x69, 0x42,
+	0xa5, 0xab, 0x7c, 0xad, 0xc9, 0x7a, 0xa6, 0xba, 0x36, 0x61, 0x69, 0xb9, 0x85, 0x59, 0x79, 0x9f,
+	0xdb, 0x74, 0x59, 0xe3, 0xa5, 0xc5, 0x4b, 0xb3, 0x7c, 0xb1, 0xdb, 0x77, 0x79, 0x47, 0x78, 0x65,
+	0x17, 0x4e, 0x32, 0x5c, 0xb8, 0xda, 0x76, 0x4e, 0x30, 0xb5, 0xfb, 0xbd, 0x94, 0xfa, 0x83, 0x85,
+	0xb0, 0x33, 0x77, 0xf7, 0x7b, 0x71, 0x2b, 0x14, 0xac, 0x04, 0xbc, 0x2d, 0x62, 0xe9, 0x6c, 0x99,
+	0x8e, 0x48, 0xc9, 0x8d, 0xaf, 0x01, 0x9d, 0xce, 0x97, 0xf1, 0x90, 0x14, 0xd2, 0x78, 0x40, 0xba,
+	0x0d, 0x1c, 0xbe, 0xe3, 0x08, 0x44, 0xb7, 0x6f, 0xf3, 0xae, 0xf0, 0x72, 0x15, 0xa4, 0x98, 0xdc,
+	0xb8, 0xfd, 0x65, 0x7b, 0x9f, 0x81, 0x38, 0x95, 0x8d, 0x67, 0xd0, 0x23, 0xc3, 0x4d, 0x7a, 0x31,
+	0x29, 0x60, 0xf6, 0xe7, 0xdb, 0x84, 0xe8, 0xa6, 0x17, 0x75, 0x01, 0xe3, 0x85, 0xbe, 0x2c, 0x35,
+	0x64, 0x34, 0xec, 0xd3, 0x1b, 0x48, 0x01, 0x60, 0xfb, 0x8f, 0x66, 0x85, 0x28, 0xef, 0x91, 0xbb,
+	0xa5, 0x80, 0xbf, 0xaa, 0x77, 0xb3, 0xd0, 0xf2, 0x31, 0xe7, 0xc1, 0x25, 0xf3, 0x91, 0x68, 0x55,
+	0xae, 0xdb, 0xe5, 0x99, 0x0a, 0x74, 0x5f, 0x07, 0x98, 0x7e, 0xb9, 0x8b, 0xc6, 0xf6, 0xce, 0x5d,
+	0xaf, 0xca, 0xc5, 0xf0, 0x8e, 0x46, 0x5c, 0x79, 0xc5, 0x1c, 0x87, 0x77, 0xa0, 0x97, 0xef, 0xf8,
+	0xae, 0xd8, 0xa9, 0xde, 0xc0, 0xab, 0xbf, 0x84, 0x96, 0xfb, 0x76, 0x79, 0x0d, 0xaf, 0xfe, 0x96,
+	0x77, 0x30, 0xa2, 0xe1, 0x55, 0x9b, 0xca, 0x7b, 0x78, 0xbf, 0x93, 0x39, 0xb5, 0x37, 0xe5, 0x99,
+	0x84, 0x48, 0x3d, 0xe5, 0x4d, 0x8b, 0x2c, 0x5f, 0x00, 0x5c, 0x7e, 0x53, 0xe7, 0x63, 0x71, 0xab,
+	0xf2, 0x59, 0xcf, 0x35, 0xdf, 0xdf, 0x78, 0x9e, 0x98, 0x0f, 0x65, 0x21, 0xed, 0x07, 0xd8, 0xf0,
+	0xdc, 0xd9, 0x13, 0x37, 0x8f, 0xf9, 0xd3, 0x2a, 0xfa, 0x6a, 0xae, 0xf2, 0x11, 0xaf, 0xbb, 0xa2,
+	0x39, 0x53, 0xff, 0xce, 0xec, 0xcf, 0x67, 0x44, 0xd3, 0x36, 0x3a, 0x82, 0x74, 0x61, 0xca, 0x8b,
+	0x34, 0x24, 0x1a, 0xfc, 0x22, 0x78, 0xa6, 0x7b, 0x9d, 0xd2, 0x40, 0xae, 0x14, 0x29, 0xfe, 0x62,
+	0xaa, 0x81, 0x94, 0x63, 0x1d, 0xa9, 0x92, 0x0d, 0x33, 0xb1, 0x5f, 0x4d, 0x21, 0xe5, 0x50, 0x16,
+	0x74, 0xdb, 0x16, 0x2a, 0xfc, 0x60, 0x1c, 0x44, 0xf6, 0xb3, 0xa9, 0x06, 0x50, 0x0e, 0x80, 0x80,
+	0x77, 0xea, 0x64, 0x61, 0xd9, 0xf4, 0xe1, 0x54, 0x03, 0x28, 0xc4, 0xae, 0xce, 0x65, 0xa9, 0x7e,
+	0xdd, 0x14, 0xd2, 0x2c, 0xbc, 0x16, 0x61, 0xbf, 0x34, 0x5b, 0x84, 0x9f, 0x47, 0x61, 0xe7, 0x7f,
+	0xce, 0x88, 0xcd, 0x49, 0xc9, 0x64, 0xd1, 0xd8, 0xfb, 0xa6, 0x68, 0xda, 0x6f, 0xd1, 0xf8, 0x82,
+	0xe7, 0xdc, 0xc3, 0x95, 0xbd, 0x75, 0xfa, 0x3a, 0xba, 0x94, 0x49, 0xb7, 0x86, 0xf2, 0x1e, 0x8a,
+	0x45, 0xa3, 0x32, 0xa9, 0xa1, 0x6c, 0x9d, 0x8e, 0x67, 0xbe, 0xf7, 0xa6, 0x98, 0xbf, 0x90, 0xf9,
+	0xb0, 0x35, 0x77, 0x05, 0x0e, 0xb9, 0x9d, 0x23, 0x71, 0x03, 0x7e, 0x55, 0x3f, 0xa6, 0xdc, 0x15,
+	0x0d, 0x9c, 0x89, 0x5b, 0x33, 0x73, 0xdd, 0x65, 0x20, 0xa0, 0x81, 0x5d, 0xfd, 0xf1, 0x5f, 0x67,
+	0x2c, 0x56, 0xcb, 0xae, 0x60, 0x86, 0x8f, 0x6a, 0xdf, 0x7d, 0xdf, 0x82, 0x11, 0xd4, 0x00, 0x8f,
+	0x69, 0x1c, 0x80, 0x69, 0x7f, 0x2c, 0xe6, 0xd1, 0x02, 0x2a, 0x62, 0x9c, 0xa9, 0x8a, 0xd1, 0x8d,
+	0xaa, 0xf2, 0x35, 0x19, 0x8e, 0x0a, 0x3f, 0x0a, 0xfd, 0xf9, 0xac, 0xd8, 0xb5, 0xdf, 0x8f, 0x4f,
+	0xb3, 0xc1, 0x49, 0xbb, 0xaa, 0xbc, 0x65, 0xb6, 0xf6, 0x96, 0xdf, 0x51, 0xe3, 0xb2, 0xff, 0xf1,
+	0x60, 0xb9, 0xfc, 0x8f, 0x07, 0x50, 0xa7, 0x14, 0xfc, 0xdd, 0xe2, 0x5c, 0x17, 0x1e, 0x3b, 0xdf,
+	0x12, 0x3b, 0xf5, 0xe9, 0x57, 0xd7, 0xf0, 0x35, 0xcb, 0xf0, 0x57, 0x42, 0x6c, 0x4f, 0x6b, 0x48,
+	0x56, 0x4a, 0x56, 0x44, 0x3a, 0xbc, 0x5f, 0xb5, 0xa2, 0x09, 0xe8, 0xe3, 0xd7, 0x32, 0x1f, 0x92,
+	0x55, 0x79, 0xdf, 0x9d, 0xb0, 0xd2, 0xce, 0x75, 0xed, 0xba, 0x88, 0x74, 0x76, 0x7b, 0x2c, 0x56,
+	0xcb, 0xcf, 0x36, 0xe9, 0xd3, 0x1b, 0xe8, 0xe2, 0xe1, 0x75, 0x5d, 0x4c, 0x5f, 0x30, 0x68, 0x50,
+	0x3f, 0x14, 0xcb, 0xf6, 0x77, 0x6b, 0x1e, 0x7b, 0x7a, 0xf3, 0xcb, 0xf4, 0xd4, 0x75, 0xad, 0xbc,
+	0x6f, 0x8b, 0x85, 0x52, 0xa1, 0x2b, 0x7b, 0x0f, 0xae, 0x6b, 0x8e, 0x9a, 0xec, 0x12, 0xbe, 0xfd,
+	0x17, 0x33, 0x62, 0x1e, 0x84, 0x82, 0x07, 0x00, 0xd8, 0x03, 0x08, 0x7e, 0x95, 0xd9, 0xd7, 0x5a,
+	0x74, 0xd5, 0x42, 0xe7, 0xb0, 0xd1, 0x74, 0x0b, 0x9d, 0xbf, 0xde, 0x42, 0x17, 0xae, 0xb7, 0xd0,
+	0xc5, 0xeb, 0x2d, 0x74, 0xe9, 0x3a, 0x0b, 0x5d, 0xae, 0xd9, 0x50, 0xfb, 0x2f, 0x67, 0xc4, 0x22,
+	0x29, 0xf2, 0x5f, 0xc3, 0x6c, 0xff, 0x74, 0x32, 0x70, 0xd5, 0x66, 0x37, 0x73, 0xf5, 0xec, 0x66,
+	0xaf, 0x99, 0xdd, 0xef, 0x8a, 0xb7, 0x69, 0xf7, 0xc4, 0x02, 0x4c, 0x2a, 0x2f, 0x3f, 0xe8, 0x61,
+	0x4d, 0xd2, 0x07, 0x3d, 0xbf, 0x91, 0x26, 0xdb, 0x5a, 0x2c, 0x5b, 0x89, 0xe1, 0x06, 0xd5, 0xc0,
+	0xda, 0x07, 0x3c, 0x82, 0x83, 0x43, 0x19, 0x90, 0x7c, 0xf0, 0x19, 0xd6, 0x1d, 0xb4, 0xcd, 0xd9,
+	0x01, 0x5c, 0xbb, 0xee, 0x70, 0xbc, 0x5d, 0xc2, 0xb7, 0x7f, 0x3e, 0x23, 0x16, 0x9c, 0x0c, 0x2a,
+	0x02, 0x9e, 0xb9, 0x5e, 0xc0, 0xb3, 0xd7, 0x0b, 0x78, 0xee, 0x7a, 0x01, 0xcf, 0x4f, 0x08, 0xb8,
+	0xf3, 0x8b, 0x19, 0xfe, 0x88, 0x7e, 0x6a, 0x66, 0xb3, 0x2d, 0x96, 0x82, 0xbd, 0xaa, 0x08, 0x17,
+	0x83, 0x3d, 0x14, 0xe0, 0xa6, 0x58, 0x08, 0xf6, 0xac, 0xf8, 0xe6, 0xba, 0xf3, 0xc1, 0x1e, 0xfd,
+	0x97, 0xa4, 0x51, 0xae, 0xec, 0x67, 0xe0, 0x8d, 0x2e, 0xff, 0x02, 0x3a, 0x5f, 0x73, 0xe3, 0xef,
+	0xd3, 0xe8, 0x17, 0xde, 0xdd, 0x2f, 0x0a, 0xa3, 0x4f, 0x47, 0x85, 0xf2, 0xcd, 0xa8, 0x2c, 0x03,
+	0x1d, 0xb5, 0x3b, 0xba, 0xd6, 0x06, 0x3a, 0xdf, 0xb0, 0x5f, 0x58, 0x83, 0x47, 0xbd, 0xea, 0xbf,
+	0xb8, 0x94, 0x08, 0xfa, 0x30, 0xfc, 0x91, 0x58, 0x3d, 0xd8, 0xab, 0xa6, 0x12, 0xd7, 0x04, 0x9d,
+	0x40, 0xac, 0x58, 0x2c, 0xf4, 0xfe, 0xb0, 0xd6, 0xfb, 0x16, 0xf4, 0x5e, 0x61, 0x3f, 0x46, 0x4d,
+	0x53, 0xa6, 0xf0, 0x48, 0xcc, 0xc3, 0xaf, 0x69, 0xb9, 0xe2, 0xa5, 0xff, 0x0a, 0xf4, 0xbd, 0x7a,
+	0x4a, 0x8b, 0x73, 0xa1, 0x91, 0x7d, 0xa9, 0xd9, 0xb4, 0x0e, 0x55, 0xa4, 0xca, 0x9c, 0x02, 0x8f,
+	0xa4, 0xa6, 0x7f, 0x91, 0x7e, 0x24, 0xbc, 0xa7, 0x9f, 0x63, 0x29, 0x52, 0xfd, 0x24, 0x7e, 0x57,
+	0x34, 0x0a, 0x99, 0x9f, 0xd5, 0xbc, 0x02, 0x10, 0xec, 0x07, 0xf0, 0x7d, 0xad, 0xa2, 0x30, 0xb7,
+	0x06, 0x40, 0xbf, 0x3a, 0xef, 0x89, 0xf5, 0x5a, 0x57, 0x20, 0x9d, 0x5d, 0xd1, 0x50, 0x48, 0x2b,
+	0xf3, 0xa2, 0x65, 0x22, 0x1c, 0x85, 0x9d, 0x91, 0xd8, 0xac, 0x34, 0x38, 0x91, 0xf9, 0xd9, 0xd4,
+	0x7f, 0xdb, 0x50, 0x1b, 0xcc, 0xec, 0xc4, 0x60, 0xf0, 0x9f, 0x55, 0x14, 0x43, 0xae, 0x5f, 0xf0,
+	0x19, 0xec, 0x3b, 0x30, 0x0a, 0x2f, 0xf8, 0xca, 0xc2, 0x7e, 0x5f, 0xc2, 0x94, 0xfd, 0xa2, 0xf3,
+	0x5c, 0xb4, 0xa6, 0xbc, 0x96, 0xc6, 0xfb, 0x76, 0x4d, 0xba, 0xf8, 0x91, 0xf0, 0x34, 0x2c, 0xc9,
+	0xf9, 0xb1, 0xb8, 0x4d, 0x72, 0x9e, 0x80, 0x5c, 0x25, 0xeb, 0x87, 0xe2, 0x16, 0xe1, 0x2f, 0x29,
+	0x75, 0x12, 0xf9, 0x75, 0xb1, 0x79, 0xa2, 0xe2, 0x2c, 0x92, 0x45, 0xed, 0xbf, 0x85, 0x58, 0x4b,
+	0x99, 0xa9, 0x58, 0xca, 0x63, 0xb1, 0x6c, 0xa1, 0x5f, 0xca, 0xb2, 0x3e, 0x14, 0x1b, 0xf5, 0xae,
+	0x61, 0xda, 0xf7, 0x6b, 0xd3, 0x6e, 0xc2, 0xb4, 0x2d, 0x88, 0xe7, 0xfa, 0x1f, 0xc4, 0x8e, 0xa5,
+	0xd0, 0x4d, 0xd4, 0xea, 0xb8, 0x38, 0xa3, 0x9b, 0x71, 0x19, 0x5d, 0xfd, 0x1f, 0x8c, 0xcc, 0x5e,
+	0xf1, 0x0f, 0x46, 0xe6, 0xca, 0x7f, 0x30, 0xd2, 0xf9, 0xbb, 0x19, 0xb1, 0x56, 0x7f, 0xc1, 0x97,
+	0x99, 0xcd, 0x3f, 0x33, 0x10, 0x7d, 0x28, 0xb6, 0x5d, 0xc6, 0x86, 0x0e, 0x33, 0xd6, 0x49, 0x2d,
+	0x2a, 0x6d, 0x59, 0x36, 0xf4, 0x76, 0xac, 0x13, 0xf2, 0x9f, 0xd5, 0x66, 0xe8, 0x48, 0xcb, 0x66,
+	0x8b, 0xf5, 0x66, 0xf0, 0x16, 0xd7, 0x8c, 0xa5, 0xb4, 0x54, 0xe6, 0xbd, 0xaf, 0xc5, 0xf6, 0x34,
+	0xa1, 0x82, 0x46, 0xde, 0xaa, 0x69, 0xc4, 0xab, 0x6a, 0x84, 0xa0, 0xa4, 0x97, 0xf2, 0x3f, 0x70,
+	0xcc, 0x56, 0xfe, 0x03, 0x47, 0xe7, 0xeb, 0xe2, 0xe6, 0x04, 0xfa, 0x2a, 0x4d, 0x75, 0xfe, 0xdf,
+	0x4c, 0x69, 0x6b, 0x16, 0xfb, 0x3b, 0x53, 0xe5, 0x39, 0x9d, 0xcf, 0x57, 0x2c, 0xf8, 0x6f, 0x66,
+	0x44, 0x6b, 0x3f, 0x0c, 0xbf, 0xe4, 0x04, 0x7f, 0x1f, 0x4a, 0xa6, 0xce, 0x23, 0x71, 0x6b, 0xca,
+	0x8c, 0x41, 0x4d, 0x97, 0x15, 0xfa, 0xef, 0xc4, 0xee, 0xc1, 0x30, 0x4d, 0x73, 0xf5, 0x65, 0x05,
+	0x74, 0x4d, 0x65, 0xfc, 0x49, 0x69, 0xa0, 0x5f, 0xa9, 0xd8, 0xe6, 0x97, 0xcc, 0xba, 0x97, 0x3c,
+	0xd9, 0xf9, 0xe9, 0xb6, 0x0c, 0xe3, 0x77, 0xf9, 0x9b, 0xa7, 0x77, 0xf1, 0x05, 0xef, 0x65, 0xa7,
+	0xef, 0x9d, 0x7f, 0x70, 0xba, 0x88, 0xff, 0xb7, 0xf2, 0x1b, 0xff, 0x14, 0x00, 0x00, 0xff, 0xff,
+	0xd4, 0x92, 0x54, 0xb0, 0xce, 0x52, 0x00, 0x00,
+}

+ 801 - 0
pb/v1/vehicle_style.proto

@@ -0,0 +1,801 @@
+syntax = "proto3";
+
+// package声明符,用来防止不同的消息类型有命名冲突
+package v1;
+// 用于生成指定语言go的包名称
+option go_package = "adm-vehicle-style/pb/v1";
+
+message BrandListRequest {
+    // 品牌名
+    string brand_name = 1;
+    // 首字母
+    string initial = 2;
+    // 是否有图片 -1 1
+    int32 has_img = 3;
+    // 状态 -1 1
+    int32 status = 4;
+    // 分页
+    int32 page_size = 5;
+    int32 page = 6;
+    string brand_id = 7;
+    string old_brand_name = 8;
+}
+
+message BrandList {
+    int64 id = 1;
+    string initial = 2;
+    string brand_name = 3;
+    string brand_id = 4;
+    int64 weight = 5;
+    int64 has_img = 6;
+    int64 status = 7;
+    string image = 8;
+    string old_brand_name = 9;
+}
+
+message BrandListReply {
+    int64 current_page = 1;
+    int64 per_page = 2;
+    int64 total = 3;
+    int64 first_page = 4;
+    int64 last_page = 5;
+    int64 prev_page = 6;
+    int64 next_page = 7;
+    repeated BrandList list = 8;
+}
+
+message SearchRequest {
+    // 1 品牌
+    int32 type = 1;
+    string search = 2;
+	string brand_id = 3;
+	string maker_id = 4;
+	string series_id = 5;
+}
+
+message SearchList {
+	string id = 1;
+	string name = 2;
+}
+
+message SearchReply {
+    repeated SearchList list = 1;
+}
+
+message UpdateSYBrandRequest {
+    int64 id = 1;
+    string brand_name = 2;
+    string initial = 3;
+    int64 weight = 4;
+    int64 status = 5;
+    int64 has_img = 6;
+    string old_brand_name = 7;
+}
+
+message GetMakerRequest {
+    string brand_id = 1;
+}
+
+message MakerList {
+    string brand_id = 1;
+    string maker_id = 2;
+    string maker = 3;
+}
+
+message GetMakerReply {
+    repeated MakerList list = 1;
+}
+
+message UpdateMakerRequest {
+    string maker_id = 2;
+    string maker = 3;
+}
+
+message EmptyReply {}
+
+message SeriesListRequest {
+    // 品牌名
+    string brand_name = 1;
+    // 车系名
+    string series_name = 2;
+    // 是否有图片 -1 1
+    int32 has_img = 3;
+    // 状态 -1 1
+    int32 status = 4;
+    // 分页
+    int32 page_size = 5;
+    int32 page = 6;
+
+    string brand_id = 7;
+
+    string series_id = 8;
+    string old_series_name = 9;
+}
+
+message SeriesList {
+    int64 id = 1;
+    string brand_name = 2;
+    string series_id = 3;
+    string maker  = 4;
+    string series_name = 5;
+    int64 status = 6;
+    string image = 7;
+    string brand_id = 8;
+    string old_series_name = 9;
+}
+
+message SeriesListReply {
+    int64 current_page = 1;
+    int64 per_page = 2;
+    int64 total = 3;
+    int64 first_page = 4;
+    int64 last_page = 5;
+    int64 prev_page = 6;
+    int64 next_page = 7;
+    repeated SeriesList list = 8;
+}
+
+message UpdateSeriesRequest {
+    int64 id = 1;
+    string series_name = 2;
+    string maker = 3;
+    int64 status = 4;
+    int64 has_img = 5;
+    string old_series_name = 6;
+}
+
+message StyleListRequest {
+    // 品牌名
+    string brand_name = 1;
+    // 车系名
+    string series_name = 2;
+    // 是否有图片 -1 1
+    int32 has_manual = 3;
+    // 状态 -1 1
+    int32 status = 4;
+    // 分页
+    int32 page_size = 5;
+    int32 page = 6;
+    // 厂商
+    string maker = 7;
+    // 年份
+    int64 model_year = 8;
+
+    string style_name = 9;
+    string brand_id = 10;
+    string series_id = 11;
+    string style_id = 12;
+}
+
+message StyleList {
+    int64 id = 1;
+    string style_id = 2;
+    string brand_name = 3;
+    string maker = 4;
+    string series_name = 5;
+    string style_name = 6;
+    int64 status = 7;
+    int64 maintain_id = 8;
+    string series_id = 9;
+    string brand_id = 10;
+}
+
+message StyleListReply {
+    int64 current_page = 1;
+    int64 per_page = 2;
+    int64 total = 3;
+    int64 first_page = 4;
+    int64 last_page = 5;
+    int64 prev_page = 6;
+    int64 next_page = 7;
+    repeated StyleList list = 8;
+}
+
+message UpdateStyleRequest {
+    int64 id = 1;
+    string style_name = 2;
+    int32 status = 3;
+}
+
+message StyleInfoRequest {
+    int64 id = 1;
+}
+
+message StyleInfoReply {
+    message Aircondition {
+        string aircondition_control_type = 1;
+        string car_air_purifier = 2;
+        string fragrance_system = 3;
+        string negative_ion_generator = 4;
+        string pm25_device = 5;
+        string rear_independent_air_conditioner = 6;
+        string rear_seat_air_outlet = 7;
+        string refrigerator = 8;
+        string temperature_zone_control = 9;
+    }
+
+    message Basic {
+        string alternator = 1;
+        string braking_distance_measure = 2;
+        string brand_name = 3;
+        string emission_standard = 4;
+        string engine = 5;
+        string fast_charge_amount = 6;
+        string fast_charging_time = 7;
+        string fuel_type_detail = 8;
+        string gearbox_desc = 9;
+        string hundred_accelerate = 10;
+        string hundred_accelerate_measure = 11;
+        string level = 12;
+        string lwh = 13;
+        string maker = 14;
+        string maximum_power = 15;
+        string maximum_simulation_milage = 16;
+        string maximum_simulation_milage_measure = 17;
+        string maximum_speed = 18;
+        string maximum_torque = 19;
+        string model_year = 20;
+        string oil_wear_comrehensive = 21;
+        string oil_wear_measure = 22;
+        string price = 23;
+        string price_yuan = 24;
+        string series_id = 25;
+        string series_img = 26;
+        string series_name = 27;
+        string slow_charging_time = 28;
+        string style_id = 29;
+        string style_name = 30;
+        string sub_level = 31;
+        string vehicle_structure = 32;
+        string vehicle_warranty = 33;
+		string brand_id = 34;
+    }
+
+    message Body {
+        string back_wheel_distance = 1;
+        string door_number = 2;
+        string front_wheel_distance = 3;
+        string high = 4;
+        string long = 5;
+        string minimum_ground_clearance = 6;
+        string oilbox_volume = 7;
+        string seat_number = 8;
+        string trunk_volume = 9;
+        string unladen_mass = 10;
+        string wheelbase = 11;
+        string wide = 12;
+    }
+
+    message Chassis {
+        string assist_type = 1;
+        string back_suspention_type = 2;
+        string body_structure = 3;
+        string drive_type = 4;
+        string front_suspention_type = 5;
+    }
+
+    message Control {
+        string air_suspension = 1;
+        string ascent_assist = 2;
+        string auto_hold = 3;
+        string automatic_driving_assistance = 4;
+        string automatic_parking = 5;
+        string back_parking_rador = 6;
+        string central_diff_lock = 7;
+        string cruise_system = 8;
+        string driving_mode_selection = 9;
+        string e_induction_suspension = 10;
+        string edl = 11;
+        string engine_start_stop_technology = 12;
+        string front_parking_rador = 13;
+        string hdc = 14;
+        string overall_active_steering_system = 15;
+        string reverse_vehicle_side_warning_system = 16;
+        string variable_steering_ratio = 17;
+        string variable_suspension = 18;
+        string wade_sensing_system = 19;
+    }
+
+    message Electric {
+        string back_electric_maximum_power = 1;
+        string back_electric_torque = 2;
+        string battery_energy = 3;
+        string battery_pack_warranty = 4;
+        string battery_type = 5;
+        string front_electric_maximum_power = 6;
+        string front_electric_torque = 7;
+        string hundred_electricity_consumption = 8;
+        string maximum_simulation_milage = 9;
+        string motor_layout = 10;
+        string motor_number = 11;
+        string motor_type = 12;
+        string system_integrated_power = 13;
+        string system_integrated_torque = 14;
+        string total_motor_power = 15;
+        string total_motor_torque = 16;
+    }
+
+    message Engine {
+        string air_intak_form = 1;
+        string cylinder_arrangement = 2;
+        string cylinder_diameter = 3;
+        string cylinder_head_material = 4;
+        string cylinder_material = 5;
+        string cylinder_number = 6;
+        string cylinder_valve_number = 7;
+        string displacement = 8;
+        string displacement_l = 9;
+        string engine_technology = 10;
+        string engine_type = 11;
+        string fuel_lable = 12;
+        string fuel_type_detail = 13;
+        string maximum_horsepower = 14;
+        string maximum_power_rpm = 15;
+        string oil_supply_mode = 16;
+        string piston_stroke = 17;
+        string reduction_ratio = 18;
+        string rpm = 19;
+        string valve_mechanism = 20;
+    }
+
+    message External {
+        string active_intake_grille = 1;
+        string battery_pre_heating = 2;
+        string central_control_lock = 3;
+        string electric_trunk = 4;
+        string electronic_anti_theft = 5;
+        string eosd = 6;
+        string frameless_design_door = 7;
+        string hide_electric_door_handle = 8;
+        string inductive_trunk = 9;
+        string key_type = 10;
+        string keyless_entry_system = 11;
+        string keyless_start_system = 12;
+        string outside_pedal = 13;
+        string rear_compartment_position_memory = 14;
+        string remote_start = 15;
+        string rim_material = 16;
+        string roof_luggage_rack = 17;
+        string side_sliding_door = 18;
+        string skylight_type = 19;
+        string sports_appearance_kit = 20;
+        string tail = 21;
+        string the_tailgate_glass_opens_independently = 22;
+    }
+
+    message Gearbox {
+        string gear_number = 1;
+        string gearbox_desc = 2;
+        string gearbox_type = 3;
+    }
+
+    message Intelligent {
+        string auxiliary_driving_chip = 1;
+        string chip_computing_power = 2;
+        string number_of_cameras = 3;
+        string number_of_lidars = 4;
+        string number_of_millimeter_wave_radars = 5;
+        string number_of_ultrasonic_radars = 6;
+    }
+
+    message Internal {
+        string active_noise_reduction = 1;
+        string car_driving_recorder = 2;
+        string driving_computer_display = 3;
+        string electrically_adjustable_pedal = 4;
+        string full_lcd_dashboard = 5;
+        string full_lcd_dashboard_size = 6;
+        string hud_rising_number_display = 7;
+        string mobile_phone_wireless_charging = 8;
+        string multi_functional_steering_wheel = 9;
+        string steering_wheel_adjustment = 10;
+        string steering_wheel_heating = 11;
+        string steering_wheel_material = 12;
+        string steering_wheel_remember = 13;
+        string steering_wheel_shift = 14;
+    }
+
+    message Light {
+        string adaptive_far_near = 1;
+        string atmosphere = 2;
+        string auto_head = 3;
+        string clean = 4;
+        string daytime = 5;
+        string far = 6;
+        string fog = 7;
+        string headlamp_delay_off = 8;
+        string headlamp_rain_fog_mode = 9;
+        string height_adjustable = 10;
+        string lighting_features = 11;
+        string near = 12;
+        string side_turn = 13;
+        string steering_assist_lamp = 14;
+        string touch_reading_lamp = 15;
+    }
+
+    message Media {
+        string back_lcd = 1;
+        string car_internet = 2;
+        string car_phone = 3;
+        string car_tv = 4;
+        string cd_dvd = 5;
+        string center_console_large_screen_size = 6;
+        string central_colour_screen = 7;
+        string central_lcd_split_screen = 8;
+        string charging_interface = 9;
+        string face_recognition = 10;
+        string gesture_control = 11;
+        string gps = 12;
+        string interface_of12v = 13;
+        string mobile_internet = 14;
+        string navigation_traffic_information_display = 15;
+        string number_of_interfaces = 16;
+        string ota = 17;
+        string power_of220v = 18;
+        string rear_control_multimedia = 19;
+        string road_rescue_call = 20;
+        string speaker_brand = 21;
+        string speaker_number = 22;
+        string voice_control = 23;
+    }
+
+    message Optional {
+        string body_colour = 1;
+        string interior_color = 2;
+    }
+
+    message Rearview {
+        string anti_pinch_hand = 1;
+        string back_electric_window = 2;
+        string back_side_privacy = 3;
+        string back_side_sunshade = 4;
+        string back_sunshade = 5;
+        string back_wiper = 6;
+        string cosmetic = 7;
+        string exterior_rearview_mirror_function = 8;
+        string front_electric_window = 9;
+        string front_wiper = 10;
+        string heatable_spray_nozzle = 11;
+        string interior_rearview_mirror_function = 12;
+        string multilayer_sound_insulation_glass = 13;
+        string window_one_key = 14;
+    }
+
+    message Safety {
+        string abs = 1;
+        string active_brake = 2;
+        string asr_tcs_trc = 3;
+        string auxiliary_seat_airbag = 4;
+        string back_belt_airbag = 5;
+        string back_head_airbag = 6;
+        string back_side_airbag = 7;
+        string eba_bas_ba = 8;
+        string ebd_cbc = 9;
+        string esp = 10;
+        string fatigue_driving_warning = 11;
+        string font_head_airbag = 12;
+        string front_middle_airbag = 13;
+        string front_side_airbag = 14;
+        string iso_fix = 15;
+        string knee_airbag = 16;
+        string lane_departure_warning_system = 17;
+        string lane_keeping = 18;
+        string main_seat_airbag = 19;
+        string night_vision = 20;
+        string parallel_auxiliary = 21;
+        string passenger_seat_cushion_airbag = 22;
+        string passive_pedestrian_protection = 23;
+        string rear_central_airbag = 24;
+        string rear_seat_anti_slide_airbag = 25;
+        string road_traffic_sign_recognition = 26;
+        string run_flat_tire = 27;
+        string seat_belt_warning = 28;
+        string tire_presure_monitor = 29;
+    }
+
+    message Seat {
+        string auxiliary_adjustable_button = 1;
+        string auxiliary_electric_adust = 2;
+        string auxiliary_seat_adjustment_mode = 3;
+        string back_cup_holder = 4;
+        string back_down_type = 5;
+        string back_fold_table = 6;
+        string back_handrail = 7;
+        string electric_seat_remeber = 8;
+        string front_handrail = 9;
+        string front_seat_function = 10;
+        string heating_cooling_cup_holder = 11;
+        string main_electric_adust = 12;
+        string main_seat_adjustment_mode = 13;
+        string rear_seat_electric_adjustment = 14;
+        string rear_seat_function = 15;
+        string rear_seat_power_down = 16;
+        string seat_layout_form = 17;
+        string seat_material = 18;
+        string second_independent = 19;
+        string second_row_seat_adjustment = 20;
+        string sport_seat = 21;
+    }
+
+    message Wheelbrake {
+        string back_brake_type = 1;
+        string back_wheel_specification = 2;
+        string front_brake_type = 3;
+        string front_wheel_specification = 4;
+        string parking_brake_type = 5;
+        string spare_wheel_specification = 6;
+    }
+
+    Aircondition aircondition = 1;
+    Basic basic = 2;
+    Body body = 3;
+    Chassis chassis = 4;
+    Control control = 5;
+    Electric electric = 6;
+    Engine engine = 7;
+    External external = 8;
+    Gearbox gearbox = 9;
+    Intelligent intelligent = 10;
+    Internal internal = 11;
+    Light light = 12;
+    Media media = 13;
+    Optional optional = 14;
+    Rearview rearview = 15;
+    Safety safety = 16;
+    Seat seat = 17;
+    Wheelbrake wheelbrake = 18;
+}
+
+message UpdateStyleInfoRequest{
+    int64 id = 1;
+    string data = 2;
+}
+
+message MaintainManualRequest {
+    string style_id = 1;
+}
+
+message MaintainItem {
+	int64 id = 1;
+	string item = 2;
+	int64 start_mile = 3;
+	int64 start_date = 4;
+	int64 mile_cycle = 5;
+	int64 date_cycle = 6;
+	string style_id = 7;
+	int64 item_id = 8;
+}	
+
+message MaintainManualReply {
+	// 保养
+	repeated MaintainItem maintainance = 1;
+	// 维修
+	repeated MaintainItem repair = 2;
+	// 清洗
+	repeated MaintainItem wash = 3;
+}
+
+message ItemListRequest {
+    int64 item_type = 1;
+	string style_id = 2;
+}
+
+message ItemListReply {
+    message Item {
+    	int64 item_id = 1;
+    	string item_name = 2;
+    }
+	repeated Item list = 1;
+}
+
+message UpdateMaintainManualRequest {
+	int64 id = 1;
+	int64 item_id = 2;
+	int64 start_mile = 3;
+	int64 start_date = 4;
+	int64 mile_cycle = 5;
+	int64 date_cycle = 6;
+	string style_id = 7;
+	string name = 8;
+	int64 tid = 9;
+}
+
+message MaintainManualInfoRequest {
+	string style_id = 1;
+}
+
+message MaintainManualInfoReply {
+	message Wash {
+        uint32 cycle = 1;
+        string item_name = 2;
+        uint32 item_id = 3;
+      int64 start_mile = 4;
+      int64 start_date = 5;
+      int64 mile_cycle = 6;
+      int64 date_cycle = 7;
+      string style_id = 8;
+    }
+
+    message Repair {
+        uint32 cycle = 1;
+        string item_name = 2;
+        uint32 item_id = 3;
+        int64 start_mile = 4;
+        int64 start_date = 5;
+        int64 mile_cycle = 6;
+        int64 date_cycle = 7;
+        string style_id = 8;
+    }
+
+    message MaintainItem {
+        string item_name = 1;
+        uint32 item_id = 2;
+        int64 start_mile = 3;
+        int64 start_date = 4;
+        int64 mile_cycle = 5;
+        int64 date_cycle = 6;
+        string style_id = 7;
+    }
+
+    message Items {
+        uint32 level = 1;
+        string item_name = 2;
+        uint32 item_id = 3;
+    }
+
+    message Maintain {
+        uint32 age = 1;
+        uint32 mile = 2;
+        repeated Items items = 3;
+    }
+
+    message Cycle {
+        int64 start_mile = 1;
+        int64 start_date = 2;
+        int64 mile_cycle = 3;
+        int64 date_cycle = 4;
+    }
+
+    repeated Wash wash = 1;
+    repeated Repair repair = 2;
+    repeated MaintainItem maintain_item = 3;
+    repeated Maintain maintain = 4;
+    Cycle cycle = 5;
+}
+
+message StyleItem {
+	int64 id = 1;
+    string c2_name = 2;
+    int64 c2_id = 3;
+    string useage = 4;
+    string detail = 5;
+    string attribute_rule = 6;
+	string style_id = 7;
+}
+
+message StyleItemReply {
+    repeated StyleItem list = 1;
+}
+
+message C2ListRequest {
+	string style_id = 1;
+}
+
+message C2ListReply {
+	message Info {
+		int64 id = 1;
+		string name = 2;
+	}
+
+    repeated Info list = 1;
+}
+
+message UpdateStyleItemRequest {
+    repeated StyleItem list = 1;
+}
+
+message DeleteMaintainaceRequest {
+    int64 id = 1;
+}
+
+message ExportStyleRequest {
+	string task_name = 1;
+	string fields = 2;
+}
+
+message ExportStyleReply {
+	int64 export_id = 1;
+}
+
+message ExportStyleTaskList {
+	int64 id = 1;
+	string task_name = 2;
+	string path = 3;
+	string created_at = 4;
+}
+
+message ExportStyleTaskListReply {
+	repeated ExportStyleTaskList list = 1;
+}
+
+message DeleteExportStyleTaskRequest {
+	int64 id = 1;
+}
+
+message DeleteStyleItemRequest {
+	int64 id = 1;
+}
+
+message TemplateListRequest{
+	string name = 1;
+}
+
+message Template{
+	int64 id = 1;
+	string name = 2;
+}
+
+message TemplateListReply {
+	repeated Template list = 1;	
+}
+
+message TemplateDetailListRequest {
+	int64 tid = 1;
+    // 分页
+    int32 page_size = 2;
+    int32 page = 3;
+}
+
+message TemplateDetail {
+	int64 id = 1;
+	string name = 2;
+	int64 start_mile = 3;
+	int64 start_date = 4;
+	int64 maintain_mile_min_cycle = 5;
+	int64 maintain_date_min_cycle = 6;
+	int64 tid = 7;
+}
+
+message TemplateDetailListReply {
+	repeated TemplateDetail list = 1;
+	int64 total = 2;
+}
+
+message TemplateDetailRequest {
+	int64 tid = 1;
+}
+
+message TemplateDetailReply {
+	// 保养
+	repeated MaintainItem maintainance = 1;
+	// 维修
+	repeated MaintainItem repair = 2;
+	// 清洗
+	repeated MaintainItem wash = 3;
+	string name = 4;
+}
+
+message AddTemplateDetailRequest {
+	int64 tid = 1;
+	int64 item_id = 2;
+	int64 start_mile = 3;
+	int64 start_date = 4;
+	int64 mile_cycle = 5;
+	int64 date_cycle = 6;
+	string style_id = 7;
+	string name = 8;
+}
+
+message AddTemplateDetailReply {
+	int64 tid = 1;
+}
+
+message ChooseTemplateDetailRequest {
+	int64 tid = 1;
+	string style_id = 2;
+}
+
+message TemplateItemListRequest {
+    int64 item_type = 1;
+	int64 tid = 2;
+}

+ 76 - 0
protogen.sh

@@ -0,0 +1,76 @@
+#!/bin/bash
+
+curentdirname=$(basename "$PWD")
+parentfulldir=$(dirname "$PWD")
+gomodfile=go.mod 
+pbdir=pb # 指定proto所在目录
+
+
+# 判断是否有go.mod文件
+if [ ! -f "$gomodfile" ]; then
+    echo "No '$gomodfile' file!"
+    exit 1
+fi
+
+# 从go.mod中取出工程包名
+packname=`awk 'NR==1{print $2}' $gomodfile`
+
+# 判断当前目录名是否与go.mod中的module 名称相同,不同直接提示错误
+if [ "$packname" != "$curentdirname" ]; then
+    echo "The module name is not the current directory! See 'go.mod'"
+    exit 1
+fi
+
+# 判断是否有pb目录
+if [ ! -d $pbdir ]; then
+    echo "No '$pbdir' directory!"
+    exit 1
+fi
+
+# 取出操作系统
+OS=`uname -s`
+
+# 将pbdir目录下所有一级目录下的所有.proto文件作统一处理并生成.pb.go文件
+dir=$(ls -l $pbdir |awk '/^d/ {print $NF}')
+for i in $dir
+do
+    cd $pbdir/$i
+    # 判断是否有.proto文件
+    num=$(ls *.proto 2> /dev/null | wc -l)
+    if [ $num != 0 ] ; then
+        if [ $OS == "Linux" ]; then
+            # 替换以 package 开头的整行
+            sed -i "s/^package.*$/package $i;/g" *.proto
+            # 替换以 option go_package 开头的整行
+            sed -i "s/^option go_package.*$/option go_package = \"$packname\/$pbdir\/$i\";/g" *.proto
+        elif [ $OS == "Darwin" ]; then
+            # 替换以 package 开头的整行
+            sed -i '' "s/^package.*$/package $i;/g" *.proto
+            # 替换以 option go_package 开头的整行
+            sed -i '' "s/^option go_package.*$/option go_package = \"$packname\/$pbdir\/$i\";/g" *.proto
+        else
+            echo "Unsupport OS: "$OS
+        fi
+
+        protoc --go_out=$parentfulldir *.proto
+    fi
+    cd ../..
+done
+
+cd $pbdir
+# 判断是否有.proto文件
+num=$(ls *.proto 2> /dev/null | wc -l)
+if [ $num != 0 ] ; then
+    if [ $OS == "Linux" ]; then
+        # 替换以 option go_package 开头的整行
+        sed -i "s/^option go_package.*$/option go_package = \"$packname\/$pbdir\";/g" *.proto
+    elif [ $OS == "Darwin" ]; then
+        # 替换以 option go_package 开头的整行
+        sed -i '' "s/^option go_package.*$/option go_package = \"$packname\/$pbdir\";/g" *.proto
+    else
+        echo "Unsupport OS: "$OS
+    fi
+
+    protoc --go_out=plugins=grpc:$parentfulldir *.proto
+fi
+cd ../

+ 125 - 0
rpmbuild.sh

@@ -0,0 +1,125 @@
+#!/bin/bash
+
+set -e
+
+show_usage="args: [--runmode=,--serve-addr=,--serve-port=,--etcd-addr=,--etcd-port=,--encrypt-key=,--log-dir=]"
+
+#-o或--options选项后面是可接受的短选项,如ab:c::,表示可接受的短选项为-a -b -c,
+#其中-a选项不接参数,-b选项后必须接参数,-c选项的参数为可选的
+#-l或--long选项后面是可接受的长选项,用逗号分开,冒号的意义同短选项。
+#-n选项后接选项解析错误时提示的脚本名字
+ARGS=`getopt -o -h --long help,runmode:,serve-addr:,serve-port:,etcd-addr:,etcd-port:,encrypt-key:,log-dir: -n "$0" -- "$@"`
+
+if [ $? != 0 ]; then
+    exit 1
+fi
+
+#将规范化后的命令行参数分配至位置参数($1,$2,...)
+eval set -- "${ARGS}"
+
+while [ -n "$1" ]
+do
+    case "$1" in
+        -h|--help)
+            echo "$show_usage"; exit 1 ;;
+        --runmode) 
+            RUNMODE=$2; shift ;;
+        --serve-addr)
+            SERVE_ADDR=$2; shift ;;
+        --serve-port)
+            SERVE_PORT=$2; shift ;;
+        --etcd-addr)
+            ETCD_ADDR=$2; shift ;;
+        --etcd-port)
+            ETCD_PORT=$2; shift ;;
+        --encrypt-key)
+            ENCRYPT_KEY=$2; shift ;;
+        --log-dir)
+            LOG_DIR=$2; shift ;;
+        *) shift ;;
+    esac
+done
+
+DISCOVERY_TYPE="etcd"
+
+if [ -z $SERVE_PORT ];then
+    echo "the server_port must be specified."
+    exit 1
+fi
+if [ -z $RUNMODE ];then
+    RUNMODE="dev"
+fi
+if [ -z $SERVE_ADDR ];then
+    SERVE_ADDR="0.0.0.0"
+fi
+if [ -z $ETCD_ADDR ];then
+    ETCD_ADDR="127.0.0.1"
+fi
+if [ -z $ETCD_PORT ];then
+    ETCD_PORT="2379"
+fi
+if [ -z $ENCRYPT_KEY ];then
+    ENCRYPT_KEY="b09c600fddc573f117449b3723f23d64"
+fi
+if [ -z $LOG_DIR ];then
+    LOG_DIR="logs"
+fi
+
+PROJECT_PATH=$(cd `dirname $0`; pwd)
+SERVICE_NAME="${PROJECT_PATH##*/}"
+APP_NAME="${PROJECT_PATH##*/}"
+APP_CONF=conf/app.conf
+GITLINE=`git log | head -1`
+GITLOG=gitlog
+
+echo $GITLINE > $GITLOG
+
+#生成配置文件
+sed -e "s/%APP_NAME%/$APP_NAME/g" ${APP_CONF}.in > ${APP_CONF}
+sed -i "s/%APP_NAME%/$APP_NAME/g" ${APP_CONF}
+sed -i "s/%RUNMODE%/$RUNMODE/g" ${APP_CONF}
+sed -i "s/%SERVE_ADDR%/$SERVE_ADDR/g" ${APP_CONF}
+sed -i "s/%SERVE_PORT%/$SERVE_PORT/g" ${APP_CONF}
+sed -i "s/%ETCD_ADDR%/$ETCD_ADDR/g" ${APP_CONF}
+sed -i "s/%ETCD_PORT%/$ETCD_PORT/g" ${APP_CONF}
+sed -i "s/%ENCRYPT_KEY%/$ENCRYPT_KEY/g" ${APP_CONF}
+sed -i "s/%LOG_DIR%/$LOG_DIR/g" ${APP_CONF}
+sed -i "s/%SERVICE_NAME%/$SERVICE_NAME/g" ${APP_CONF}
+sed -i "s/%DISCOVERY_TYPE%/$DISCOVERY_TYPE/g" ${APP_CONF}
+
+SPEC_FILE=app.spec
+APP_SERVICE=conf/app.service
+SH_APP=sh/app
+TOOLS_ROOT=`pwd`
+BUILD="${TOOLS_ROOT}/build"
+
+sed -e "s/%APP_NAME%/$APP_NAME/g" ${APP_SERVICE}.in > conf/${SERVICE_NAME}.service
+sed -e "s/%APP_NAME%/$APP_NAME/g" ${SH_APP}.in > ${SH_APP}
+sed -i "s/%SERVICE_NAME%/$SERVICE_NAME/g" ${SH_APP}
+
+VERSION=`cat VERSION`
+make version=$VERSION
+
+mkdir -p $BUILD/buildroot/{BUILD,RPMS,S{RPMS,PECS,OURCES}}
+rm -f $BUILD/buildroot/SOURCES/*.tgz
+
+set +e
+tar czf $BUILD/buildroot/SOURCES/${SERVICE_NAME}-$VERSION.tgz  * .[!.]*
+exitcode=$?
+
+if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then
+    exit $exitcode
+fi
+set -e
+
+sed -e "s/%VERSION%/$VERSION/g" ${SPEC_FILE}.in > ${SPEC_FILE}
+sed -i "s/%APP_NAME%/$APP_NAME/g" ${SPEC_FILE}
+sed -i "s/%SERVICE_NAME%/$SERVICE_NAME/g" ${SPEC_FILE}
+rpmbuild  -bb ${SPEC_FILE} --define "_topdir $BUILD/buildroot/" 
+
+rm -rf ./dist
+mkdir ./dist
+cp -rf $BUILD/buildroot/RPMS/* ./dist
+
+rm -rf $BUILD
+

+ 92 - 0
sh/app.in

@@ -0,0 +1,92 @@
+#!/bin/bash
+
+# source function library
+. /etc/%APP_NAME%/lib/start-stop-functions
+. /etc/%APP_NAME%/lib/init-multi-mode
+
+
+# Check for missing binaries (stale symlinks should not happen)
+# Note: Special treatment of stop for LSB conformance
+APP_BIN=/opt/%APP_NAME%/bin/%APP_NAME%
+test -x $APP_BIN || { echo "$APP_BIN not installed"; 
+   if [ "$1" = "stop" ]; then exit 0;
+   else exit 5; fi; }
+
+if [ "${MULTI_MODE}" = "YES" -o "${MULTI_MODE}" = "yes" ]; then
+   init_multi_mode $1 $2
+   exit $?
+fi
+
+
+PIDFILE=/var/run/%APP_NAME%.pid
+DAEMON_ARGS="pidFile=$PIDFILE"
+RETVAL=0
+# Return values acc. to LSB for all commands but status:
+# 0       - success
+# 1       - generic or unspecified error
+# 2       - invalid or excess argument(s)
+# 3       - unimplemented feature (e.g. "reload")
+# 4       - user had insufficient privileges
+# 5       - program is not installed
+# 6       - program is not configured
+# 7       - program is not running
+# 8--199  - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
+# 
+# Note that starting an already running service, stopping
+# or restarting a not-running service as well as the restart
+# with force-reload (in case signaling is not supported) are
+# considered a success.
+
+case "$1" in
+   start)
+
+      echo -n "Starting %APP_NAME%: "
+      ## create subfolder for lock files, on Debian systems needed
+      mkdir -p /var/lock/subsys
+
+      ## Start daemon with startproc(8). If this fails
+      ## the return value is set appropriately by startproc.
+      daemon --pidfile $PIDFILE $APP_BIN &
+      RETVAL=$?
+      echo
+      ;;
+   stop)
+      echo -n "Shutting down %APP_NAME%: "
+      ## Stop daemon with killproc(8) and if this fails
+      ## killproc sets the return value according to LSB.
+
+      killproc -p $PIDFILE $APP_BIN && rm -f /var/lock/subsys/%APP_NAME%
+      RETVAL=$?
+      echo
+      ;;
+   restart)
+      ## Stop the service and regardless of whether it was
+      ## running or not, start it again.
+      $0 stop
+      $0 start
+      RETVAL=$?
+      ;;
+   status)
+      echo -n "Checking for service %APP_NAME%: "
+      ## Check status with checkproc(8), if process is running
+      ## checkproc will return with exit status 0.
+
+      # Return value is slightly different for the status command:
+      # 0 - service up and running
+      # 1 - service dead, but /var/run/  pid  file exists
+      # 2 - service dead, but /var/lock/ lock file exists
+      # 3 - service not running (unused)
+      # 4 - service status unknown :-(
+      # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
+
+      status -p $PIDFILE $APP_BIN
+      RETVAL=$?
+      echo
+      ;;
+   *)
+      echo "Usage: $0 {start|stop|status|restart}"
+      exit 3
+      ;;
+   esac
+exit $RETVAL
+

+ 152 - 0
sh/init-multi-mode

@@ -0,0 +1,152 @@
+#!/bin/sh
+
+function init_multi_mode()
+{
+   ACTION=$1
+   CONFIG=$2
+   ERROR=0
+
+   if [ -z $ACTION ]
+   then
+      echo "Usage: $0 {start|stop|status|restart} [CONFIGURATION_NAME]"
+      exit 3
+   fi
+
+   if [ -z $CONFIG ]
+   then
+      for CONFIG_FOLDER in $( ls -d /etc/beegfs/*.d )
+      do
+         if [ -r ${CONFIG_FOLDER}/${SERVICE_NAME}.conf ]
+         then
+            CONFIG=$( basename $CONFIG_FOLDER .d )
+            init_multi_mode_single_configuration $ACTION $CONFIG
+
+            if [ $? -ne 0 ]
+            then
+               ERROR=1
+            fi
+         fi
+      done
+   else
+      if [ -e "/etc/beegfs/${CONFIG}.d" ]
+      then
+         init_multi_mode_single_configuration $ACTION $CONFIG
+         ERROR=$?
+      else
+         echo "Configuration folder /etc/beegfs/${CONFIG}.d doesn't exist."
+         ERROR=1
+      fi
+   fi
+   return $ERROR
+}
+
+function init_multi_mode_single_configuration()
+{
+   ACTION=$1
+   CONFIG=$2
+
+   if [ -z $ACTION ]
+   then
+      echo "Usage: $0 {start|stop|status|restart} [CONFIGURATION_NAME]"
+      exit 3
+   fi
+
+   # Check for existence of needed config file and read it
+   APP_CONFIG=/etc/beegfs/${CONFIG}.d/${SERVICE_NAME}.conf
+   test -r $APP_CONFIG || { echo "$APP_CONFIG not existing";
+      if [ "$1" = "stop" ]; then exit 0;
+      else exit 6; fi; }
+
+   PIDFILE=/var/run/${SERVICE_NAME}-${CONFIG}.pid
+   DAEMON_ARGS="cfgFile=${APP_CONFIG} pidFile=$PIDFILE"
+
+   RETVAL=0
+   # Return values acc. to LSB for all commands but status:
+   # 0	  - success
+   # 1       - generic or unspecified error
+   # 2       - invalid or excess argument(s)
+   # 3       - unimplemented feature (e.g. "reload")
+   # 4       - user had insufficient privileges
+   # 5       - program is not installed
+   # 6       - program is not configured
+   # 7       - program is not running
+   # 8--199  - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
+   # 
+   # Note that starting an already running service, stopping
+   # or restarting a not-running service as well as the restart
+   # with force-reload (in case signaling is not supported) are
+   # considered a success.
+
+   case "$ACTION" in
+      start)
+         if [ -f "${SYSCONFIG_FILE}" ]; then
+            if [ "${START_SERVICE}" = "NO" -o "${START_SERVICE}" = "no" ]; then
+               echo "${APP_NAME} not set to be started"
+               exit 0
+            fi
+         fi
+
+         echo -n "Starting ${APP_NAME} (${CONFIG}): "
+         ## create subfolder for lock files, on Debian systems needed
+         mkdir -p /var/lock/subsys
+
+         ## Start daemon with startproc(8). If this fails
+         ## the return value is set appropriately by startproc.
+         daemon --pidfile $PIDFILE $APP_BIN $DAEMON_ARGS \
+            && touch /var/lock/subsys/${SERVICE_NAME}-${CONFIG}
+         RETVAL=$?
+
+         if [ ! -e /var/lock/subsys/${SERVICE_NAME} ]
+         then
+            touch /var/lock/subsys/${SERVICE_NAME}
+         fi
+         echo
+         ;;
+      stop)
+         echo -n "Shutting down ${APP_NAME} (${CONFIG}): "
+         ## Stop daemon with killproc(8) and if this fails
+         ## killproc sets the return value according to LSB.
+
+         killproc -p $PIDFILE $APP_BIN && rm -f /var/lock/subsys/${SERVICE_NAME}-${CONFIG}
+         RETVAL=$?
+
+         count=$(find /var/lock/subsys/ -name ${SERVICE_NAME}-* | wc -l)
+         if [ $count -eq 0 ]
+         then
+            rm -f /var/lock/subsys/${SERVICE_NAME}
+         fi
+         echo
+         ;;
+      restart)
+         ## Stop the service and regardless of whether it was
+         ## running or not, start it again.
+         $0 stop $CONFIG
+         $0 start $CONFIG
+         RETVAL=$?
+         # Remember status and be quiet
+         ;;
+      status)
+         echo -n "Checking for service ${APP_NAME} (${CONFIG}): "
+         ## Check status with checkproc(8), if process is running
+         ## checkproc will return with exit status 0.
+
+         # Return value is slightly different for the status command:
+         # 0 - service up and running
+         # 1 - service dead, but /var/run/  pid  file exists
+         # 2 - service dead, but /var/lock/ lock file exists
+         # 3 - service not running (unused)
+         # 4 - service status unknown :-(
+         # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
+
+         status_multi -p $PIDFILE $APP_BIN
+         RETVAL=$?
+         echo
+         ;;
+      *)
+         echo "Usage: $0 {start|stop|status|restart} [CONFIGURATION_NAME]"
+         exit 3
+         ;;
+      esac
+   return $RETVAL
+}
+

+ 682 - 0
sh/start-stop-functions

@@ -0,0 +1,682 @@
+#!/bin/bash
+
+# The original version of this file was taken from the CentOS5 
+# initscripts-8.45.30-2.el5.x86_64 package and as this package is licensensed
+# under GPLv2 and GPLv2+ this entire file is provided under those licenses.
+
+# As the CentOS / RedHat version has severe bugs (see for example
+# https://bugzilla.redhat.com/show_bug.cgi?id=703426
+# we (the BeeGFS team) cannot rely on it and modified the original
+# version therefore
+#
+# 2011/05/10 Bernd Schubert <bernd.schubert@itwm.fraunhofer.de>
+
+# -*-Shell-script-*-
+#
+# functions	This file contains functions to be used by most or all
+#		shell scripts in the /etc/init.d directory.
+#
+
+TEXTDOMAIN=initscripts
+
+# Make sure umask is sane
+umask 022
+
+# Set up a default search path.
+PATH="/sbin:/usr/sbin:/bin:/usr/bin"
+export PATH
+
+# Get a sane screen width
+[ -z "${COLUMNS:-}" ] && COLUMNS=80
+
+if [ -z "${CONSOLETYPE:-}" -a -x "/sbin/consoletype" ]; then
+	CONSOLETYPE="`/sbin/consoletype`"
+fi
+
+if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then
+  . /etc/profile.d/lang.sh
+fi
+
+# Read in our configuration
+if [ -z "${BOOTUP:-}" ]; then
+  if [ -f /etc/sysconfig/init ]; then
+      . /etc/sysconfig/init
+  else
+    # This all seem confusing? Look in /etc/sysconfig/init,
+    # or in /usr/doc/initscripts-*/sysconfig.txt
+    BOOTUP=color
+    RES_COL=60
+    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
+    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
+    SETCOLOR_FAILURE="echo -en \\033[1;31m"
+    SETCOLOR_WARNING="echo -en \\033[1;33m"
+    SETCOLOR_NORMAL="echo -en \\033[0;39m"
+    LOGLEVEL=1
+  fi
+  if [ "$CONSOLETYPE" = "serial" ]; then
+      BOOTUP=serial
+      MOVE_TO_COL=
+      SETCOLOR_SUCCESS=
+      SETCOLOR_FAILURE=
+      SETCOLOR_WARNING=
+      SETCOLOR_NORMAL=
+  fi
+fi
+
+if [ "${BOOTUP:-}" != "verbose" ]; then
+   INITLOG_ARGS="-q"
+else
+   INITLOG_ARGS=
+fi
+
+# Interpret escape sequences in an fstab entry
+fstab_decode_str() {
+	fstab-decode echo "$1"
+}
+
+# Check if $pid (could be plural) are running
+checkpid() {
+	local base=$1
+	shift
+
+	local i
+	local RUNNING_PIDS=`pidof $base`
+
+	# pidof told us the daemon is not running, so we do not need to 
+	# do further check
+	[ -n "$RUNNING_PIDS" ] || return 1
+
+	for pid in $* ; do
+		[ -d "/proc/$pid" ] || continue
+
+		for rp in $RUNNING_PIDS; do
+			# check if `pidof` and provided pid to checkpid() match
+			# if so we found a running pid with the correct name
+			[ $rp -eq $pid ] && return 0
+		done
+	done
+	return 1
+}
+
+__readlink() {
+    ls -bl "$@" 2>/dev/null| awk '{ print $NF }'
+}
+
+# __umount_loop awk_program fstab_file first_msg retry_msg umount_args
+# awk_program should process fstab_file and return a list of fstab-encoded
+# paths; it doesn't have to handle comments in fstab_file.
+__umount_loop() {
+	local remaining sig=
+	local retry=3
+
+	remaining=$(LC_ALL=C awk "/^#/ {next} $1" "$2" | sort -r)
+	while [ -n "$remaining" -a "$retry" -gt 0 ]; do
+		if [ "$retry" -eq 3 ]; then
+			action "$3" fstab-decode umount $5 $remaining
+		else
+			action "$4" fstab-decode umount $5 $remaining
+		fi
+		sleep 2
+		remaining=$(LC_ALL=C awk "/^#/ {next} $1" "$2" | sort -r)
+		[ -z "$remaining" ] && break
+		fstab-decode /sbin/fuser -k -m $sig $remaining >/dev/null
+		sleep 5
+		retry=$(($retry -1))
+		sig=-9
+	done
+}
+
+# Similar to __umount loop above, specialized for loopback devices
+__umount_loopback_loop() {
+	local remaining devremaining sig=
+	local retry=3
+
+	remaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" {print $2}' /proc/mounts)
+	devremaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" {print $1}' /proc/mounts)
+	while [ -n "$remaining" -a "$retry" -gt 0 ]; do
+		if [ "$retry" -eq 3 ]; then
+			action $"Unmounting loopback filesystems: " \
+				fstab-decode umount $remaining
+		else
+			action $"Unmounting loopback filesystems (retry):" \
+				fstab-decode umount $remaining
+		fi
+		for dev in $devremaining ; do
+			losetup $dev > /dev/null 2>&1 && \
+				action $"Detaching loopback device $dev: " \
+				losetup -d $dev
+		done
+		remaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" {print $2}' /proc/mounts)
+		devremaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" {print $1}' /proc/mounts)
+		[ -z "$remaining" ] && break
+		fstab-decode /sbin/fuser -k -m $sig $remaining >/dev/null
+		sleep 5
+		retry=$(($retry -1))
+		sig=-9
+	done
+}
+
+# __proc_pids {program} [pidfile]
+# Set $pid to pids from /var/run* for {program}.  $pid should be declared
+# local in the caller.
+# Returns LSB exit code for the 'status' action.
+__pids_var_run_running() {
+	local base=${1##*/}
+	local pid_file=${2:-/var/run/$base.pid}
+
+	# checkpid already sets $pid globally, so we can't re-use it for now
+	local pids=
+	if [ -f "$pid_file" ]; then
+		local line=`cat $pid_file | tr '\n' ' '`
+		for entry in $line; do
+			checkpid $base $entry
+			[ $? -eq 0 ] || continue
+			
+			# found a matching pid
+			pids="$pids $entry"			
+		done < "$pid_file"
+
+	        if [ -n "$pids" ]; then
+			pid=$pids # globally we need $pid
+	                return 0
+	        fi
+		return 1 # "Program is dead and /var/run pid file exists"
+	fi
+	return 3 # "Program is not running"
+}
+
+# Output PIDs of matching processes, found using pidof
+__pids_pidof() {
+	pidof -c -o $$ -o $PPID -o %PPID -x "$1" || \
+		pidof -c -o $$ -o $PPID -o %PPID -x "${1##*/}"
+}
+
+
+# A function to start a program.
+daemon() {
+	# Test syntax.
+	local gotbase= force= nicelevel corelimit
+	local pid base= user= nice= bg= pid_file=
+	nicelevel=0
+	while [ "$1" != "${1##[-+]}" ]; do
+	  case $1 in
+	    '')    echo $"$0: Usage: daemon [+/-nicelevel] {program}"
+	           return 1;;
+	    --check)
+		   base=$2
+		   gotbase="yes"
+		   shift 2
+		   ;;
+	    --check=?*)
+	    	   base=${1#--check=}
+		   gotbase="yes"
+		   shift
+		   ;;
+	    --user)
+		   user=$2
+		   shift 2
+		   ;;
+	    --user=?*)
+	           user=${1#--user=}
+		   shift
+		   ;;
+	    --pidfile)
+		   pid_file=$2
+		   shift 2
+		   ;;
+	    --pidfile=?*)
+		   pid_file=${1#--pidfile=}
+		   shift
+		   ;;
+	    --force)
+	    	   force="force"
+		   shift
+		   ;;
+	    [-+][0-9]*)
+	    	   nice="nice -n $1"
+	           shift
+		   ;;
+	    *)     echo $"$0: Usage: daemon [+/-nicelevel] {program}"
+	           return 1;;
+	  esac
+	done
+
+        # Save basename.
+        [ -z "$gotbase" ] && base=${1##*/}
+
+        # See if it's already running. Look *only* at the pid file.
+	__pids_var_run_running "$base" "$pid_file"
+
+	[ -n "$pid" -a -z "$force" ] && return
+
+	# make sure it doesn't core dump anywhere unless requested
+	corelimit="ulimit -S -c ${DAEMON_COREFILE_LIMIT:-0}"
+	
+	# if they set NICELEVEL in /etc/sysconfig/foo, honor it
+	[ -n "${NICELEVEL:-}" ] && nice="nice -n $NICELEVEL"
+	
+	# Echo daemon
+        [ "${BOOTUP:-}" = "verbose" -a -z "${LSB:-}" ] && echo -n " $base"
+
+	# And start it up.
+	if [ -z "$user" ]; then
+	   $nice /bin/bash -c "$corelimit >/dev/null 2>&1 ; $*"
+	else
+	   $nice runuser -s /bin/bash - $user -c "$corelimit >/dev/null 2>&1 ; $*"
+	fi
+	[ "$?" -eq 0 ] && success $"$base startup" || failure $"$base startup"
+}
+
+# reall kill here, return 0 if kill succeeded, 1 if not
+do_killproc()
+{
+	level=$1
+	time=$2
+
+	kill -${level} $pid >/dev/null 2>&1
+	RC=0
+	count_time=0
+	while [ $RC -eq 0 -a $count_time -lt $time ]; do
+		checkpid $base $pid
+		if [ $? -ne 0 ]; then
+			return 0
+		fi
+		sleep 1
+		count=$(($count_time + 1))
+	done
+
+	return 1
+}
+
+remove_pidfile()
+{
+        # Remove pid file if any.
+	if [ -z "$killlevel" ]; then
+            rm -f "${pid_file:-/var/run/$base.pid}"
+	fi
+}
+
+# A function to stop a program.
+killproc() {
+	local RC killlevel= base pid pid_file= delay
+	local pidfile_only=0
+
+	RC=0; delay=3
+	# Test syntax.
+	if [ "$#" -eq 0 ]; then
+		echo $"Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]"
+		return 1
+	fi
+	if [ "$1" = "-p" ]; then
+		pid_file=$2
+		shift 2
+	fi
+	if [ "$1" = "-d" ]; then
+		delay=$2
+		shift 2
+	fi
+	
+        
+	# check for second arg to be kill level
+	[ -n "${2:-}" ] && killlevel=$2
+
+        # Save basename.
+        base=${1##*/}
+
+        # Find pid.
+	__pids_var_run_running "$1" "$pid_file"
+	if [ -z "$pid" ]; then
+		pid="$(__pids_pidof "$1")"
+	fi
+
+	if [ -z "$pid" ]; then
+		if [ -n "${LSB:-}" -a -n "$killlevel" ]; then
+			RC=7 # Program is not running
+		else
+			failure $"$base shutdown"
+			RC=0
+		fi
+
+		remove_pidfile
+		return $RC
+	fi
+
+        # Kill it.
+	[ "$BOOTUP" = "verbose" -a -z "${LSB:-}" ] && echo -n "$base "
+	if [ -z "$killlevel" ] ; then
+		# TERM first, then KILL if not dead
+		# use specified level only
+		do_killproc Kill 30
+		[ $? -ne 0 ] || do_killproc KILL 5
+
+	else
+               	do_killproc $killlevel 30 >/dev/null 2>&1
+	fi
+
+	# determine the exit code here after kill (depends on if kill succeeded)
+	checkpid $base $pid
+	RC=$?
+	[ "$RC" -eq 0 ] && failure $"$base shutdown" || success $"$base shutdown"
+	RC=$((! $RC))
+
+	remove_pidfile
+	return $RC
+}
+
+# A function to find the pid of a program. Looks *only* at the pidfile
+pidfileofproc() {
+	local pid
+
+	# Test syntax.
+	if [ "$#" = 0 ] ; then
+		echo $"Usage: pidfileofproc {program}"
+		return 1
+	fi
+
+	__pids_var_run_running "$1"
+	[ -n "$pid" ] && echo $pid
+	return 0
+}
+
+# A function to find the pid of a program.
+pidofproc() {
+	local RC pid pid_file=
+
+	# Test syntax.
+	if [ "$#" = 0 ]; then
+		echo $"Usage: pidofproc [-p pidfile] {program}"
+		return 1
+	fi
+	if [ "$1" = "-p" ]; then
+		pid_file=$2
+		shift 2
+	fi
+	fail_code=3 # "Program is not running"
+
+	# First try "/var/run/*.pid" files
+	__pids_var_run_running "$1" "$pid_file"
+	RC=$?
+	if [ -n "$pid" ]; then
+		echo $pid
+		return 0
+	fi
+
+	[ -n "$pid_file" ] && return $RC
+	__pids_pidof "$1" || return $RC
+}
+
+status() {
+	local base pid pid_file=
+
+	# Test syntax.
+	if [ "$#" = 0 ] ; then
+		echo $"Usage: status [-p pidfile] {program}"
+		return 1
+	fi
+	if [ "$1" = "-p" ]; then
+		pid_file=$2
+		shift 2
+	fi
+	base=${1##*/}
+
+	# First try "pidof"
+	__pids_var_run_running "$1" "$pid_file"
+	RC=$?
+	if [ -z "$pid_file" -a -z "$pid" ]; then
+		pid="$(__pids_pidof "$1")"
+	fi
+	if [ -n "$pid" ]; then
+	        echo $"${base} (pid $pid) is running..."
+	        return 0
+	fi
+
+	case "$RC" in
+		0)
+			echo $"${base} (pid $pid) is running..."
+			return 0
+			;;
+		1)
+	                echo $"${base} dead but pid file exists"
+	                return 1
+			;;
+	esac
+	# See if /var/lock/subsys/${base} exists
+	if [ -f /var/lock/subsys/${base} ]; then
+		echo $"${base} dead but subsys locked"
+		return 2
+	fi
+	echo $"${base} is stopped"
+	return 3
+}
+
+status_multi() {
+	local base pid pid_file=
+
+	# Test syntax.
+	if [ "$#" = 0 ] ; then
+		echo $"Usage: status [-p pidfile] {program}"
+		return 1
+	fi
+	if [ "$1" = "-p" ]; then
+		pid_file=$2
+		shift 2
+	fi
+	base=${1##*/}
+
+	# First try "pidof"
+	__pids_var_run_running "$1" "$pid_file"
+	RC=$?
+	if [ -z "$pid_file" -a -z "$pid" ]; then
+		pid="$(__pids_pidof "$1")"
+	fi
+	if [ -n "$pid" ]; then
+	        echo $"${base} (pid $pid) is running..."
+	        return 0
+	fi
+
+	case "$RC" in
+		0)
+			echo $"${base} (pid $pid) is running..."
+			return 0
+			;;
+		1)
+	                echo $"${base} dead but pid file exists"
+	                return 1
+			;;
+	esac
+	# See if /var/lock/subsys/${base}-$CONFIG exists
+	if [ -f /var/lock/subsys/${base}-$CONFIG ]; then
+		echo $"${base} dead but subsys locked"
+		return 2
+	fi
+	echo $"${base} is stopped"
+	return 3
+}
+
+echo_success() {
+  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
+  echo -n "["
+  [ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS
+  echo -n $"  OK  "
+  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
+  echo -n "]"
+  echo -ne "\r"
+  return 0
+}
+
+echo_failure() {
+  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
+  echo -n "["
+  [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
+  echo -n $"FAILED"
+  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
+  echo -n "]"
+  echo -ne "\r"
+  return 1
+}
+
+echo_passed() {
+  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
+  echo -n "["
+  [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
+  echo -n $"PASSED"
+  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
+  echo -n "]"
+  echo -ne "\r"
+  return 1
+}
+
+echo_warning() {
+  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
+  echo -n "["
+  [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
+  echo -n $"WARNING"
+  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
+  echo -n "]"
+  echo -ne "\r"
+  return 1
+}
+
+# Inform the graphical boot of our current state
+update_boot_stage() {
+  if [ "$GRAPHICAL" = "yes" -a -x /usr/bin/rhgb-client ]; then
+    /usr/bin/rhgb-client --update="$1"
+  fi
+  return 0
+}
+
+# Log that something succeeded
+success() {
+  #if [ -z "${IN_INITLOG:-}" ]; then
+  #   initlog $INITLOG_ARGS -n $0 -s "$1" -e 1
+  #fi
+  [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_success
+  return 0
+}
+
+# Log that something failed
+failure() {
+  local rc=$?
+  #if [ -z "${IN_INITLOG:-}" ]; then
+  #   initlog $INITLOG_ARGS -n $0 -s "$1" -e 2
+  #fi
+  [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_failure
+  [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --details=yes
+  return $rc
+}
+
+# Log that something passed, but may have had errors. Useful for fsck
+passed() {
+  local rc=$?
+  #if [ -z "${IN_INITLOG:-}" ]; then
+  #   initlog $INITLOG_ARGS -n $0 -s "$1" -e 1
+  #fi
+  [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_passed
+  return $rc
+}  
+
+# Log a warning
+warning() {
+  local rc=$?
+  #if [ -z "${IN_INITLOG:-}" ]; then
+  #   initlog $INITLOG_ARGS -n $0 -s "$1" -e 1
+  #fi
+  [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_warning
+  return $rc
+}  
+
+# Run some action. Log its output.
+action() {
+  local STRING rc
+
+  STRING=$1
+  echo -n "$STRING "
+  if [ "${RHGB_STARTED:-}" != "" -a -w /etc/rhgb/temp/rhgb-console ]; then
+      echo -n "$STRING " > /etc/rhgb/temp/rhgb-console
+  fi
+  shift
+  "$@" && success $"$STRING" || failure $"$STRING"
+  rc=$?
+  echo
+  if [ "${RHGB_STARTED:-}" != "" -a -w /etc/rhgb/temp/rhgb-console ]; then
+      if [ "$rc" = "0" ]; then
+      	echo_success > /etc/rhgb/temp/rhgb-console
+      else
+        echo_failure > /etc/rhgb/temp/rhgb-console
+	[ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --details=yes
+      fi
+      echo > /etc/rhgb/temp/rhgb-console
+  fi
+  return $rc
+}
+
+# returns OK if $1 contains $2
+strstr() {
+  [ "${1#*$2*}" = "$1" ] && return 1
+  return 0
+}
+
+# Confirm whether we really want to run this service
+confirm() {
+  [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --details=yes
+  while : ; do 
+      echo -n $"Start service $1 (Y)es/(N)o/(C)ontinue? [Y] "
+      read answer
+      if strstr $"yY" "$answer" || [ "$answer" = "" ] ; then
+         return 0
+      elif strstr $"cC" "$answer" ; then
+	 rm -f /var/run/confirm
+	 [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --details=no
+         return 2
+      elif strstr $"nN" "$answer" ; then
+         return 1
+      fi
+  done
+}
+
+# resolve a device node to its major:minor numbers in decimal or hex
+get_numeric_dev() {
+(
+    fmt="%d:%d"
+    if [ "$1" == "hex" ]; then
+        fmt="%x:%x"
+    fi
+    ls -lH "$2" | awk '{ sub(/,/, "", $5); printf("'"$fmt"'", $5, $6); }'
+) 2>/dev/null
+}
+
+# find the working name for a running dm device with the same table as one
+# that dmraid would create
+resolve_dm_name() {
+(
+    name="$1"
+
+    line=$(/sbin/dmraid -ay -t --ignorelocking | \
+        egrep -iv "no block devices found|No RAID disks" | \
+        awk -F ':' "{ if (\$1 ~ /^$name$/) { print \$2; }}")
+    for x in $line ; do
+        if [[ "$x" =~ "^/dev/" ]] ; then
+            majmin=$(get_numeric_dev dec $x)
+            line=$(echo "$line" | sed -e "s,$x\( \|$\),$majmin\1,g")
+        fi
+    done
+    line=$(echo "$line" | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' \
+               -e 's/ core [12] [[:digit:]]\+ / core [12] [[:digit:]]\\+ /')
+    /sbin/dmsetup table | \
+        sed -n -e "s/.*\(no block devices found\|No devices found\).*//" \
+               -e "s/\(^[^:]\+\): $line\( \+$\|$\)/\1/p"
+) 2>/dev/null
+}
+
+# Check whether file $1 is a backup or rpm-generated file and should be ignored
+is_ignored_file() {
+    case "$1" in
+	*~ | *.bak | *.orig | *.rpmnew | *.rpmorig | *.rpmsave)
+	    return 0
+	    ;;
+    esac
+    return 1
+}
+# A sed expression to filter out the files that is_ignored_file recognizes
+__sed_discard_ignored_files='/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
+

+ 25 - 0
tests/client.go

@@ -0,0 +1,25 @@
+// Copyright 2019 getensh.com. All rights reserved.
+// Use of this source code is governed by getensh.com.
+
+package tests
+
+import (
+	"log"
+
+	"adm-vehicle-style/pb"
+
+	"google.golang.org/grpc"
+)
+
+var client pb.VehicleStyleClient
+
+const ServerAddr = "127.0.0.1:50001"
+
+func init() {
+	// Set up a connection to the server.
+	conn, err := grpc.Dial(ServerAddr, grpc.WithInsecure())
+	if err != nil {
+		log.Fatalf("did not connect: %v", err)
+	}
+	client = pb.NewVehicleStyleClient(conn)
+}

Diferenças do arquivo suprimidas por serem muito extensas
+ 246 - 0
tests/v1_test.go


+ 20 - 0
utils/log.go

@@ -0,0 +1,20 @@
+package utils
+
+import "adm-vehicle-style/parser"
+
+func GetBrandLogoById(brandId string, hasImg int32) string {
+	// SY开头的品牌为映射不上的,使用默认图标
+	if hasImg == 0 || brandId == "" {
+		return parser.Conf.Oss.DefaultBrandImage
+	} else {
+		return parser.Conf.Oss.BrandImage + brandId + ".png"
+	}
+}
+
+func GetSeriesLogoById(seriesId string, hasImg int64) string {
+	if hasImg == 0 || seriesId == "" {
+		return parser.Conf.Oss.DefaultSeriesImage
+	} else {
+		return parser.Conf.Oss.SeriesImage + seriesId + ".png"
+	}
+}

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff