New feature: New API to add or update micro-service dependency. (#196)

* New feature: New API to add or update micro-service dependency.

* Bug fix: Could not delete old dependency after finding instances with diff service version.

* Change: Rename 'MircroServiceDependency' to 'ConsumerDependency'.

* Optimize code.
diff --git a/integration/microservices_test.go b/integration/microservices_test.go
index e54ce2f..6e0d981 100644
--- a/integration/microservices_test.go
+++ b/integration/microservices_test.go
@@ -445,6 +445,37 @@
 					}
 					Expect(foundMicroService).To(Equal(true))
 
+					providersArray = []interface{}{consumer}
+					body, _ = json.Marshal(bodyParams)
+					bodyBuf = bytes.NewReader(body)
+					req, _ = http.NewRequest(POST, SCURL+CREATEDEPENDENCIES, bodyBuf)
+					req.Header.Set("X-Domain-Name", "default")
+					resp, err = scclient.Do(req)
+					Expect(err).To(BeNil())
+					defer resp.Body.Close()
+
+					// Validate the dependency creation
+					Expect(resp.StatusCode).To(Equal(http.StatusOK))
+
+					//Get Provider by ConsumerID
+					url = strings.Replace(GETCONPRODEPENDENCY, ":consumerId", consumerServiceID, 1)
+					req, _ = http.NewRequest(GET, SCURL+url, nil)
+					req.Header.Set("X-Domain-Name", "default")
+					resp, _ = scclient.Do(req)
+					respbody, _ = ioutil.ReadAll(resp.Body)
+					Expect(resp.StatusCode).To(Equal(http.StatusOK))
+					servicesStruct = map[string][]map[string]interface{}{}
+
+					json.Unmarshal(respbody, &servicesStruct)
+					foundMicroService = false
+					for _, services := range servicesStruct["providers"] {
+						if services["serviceName"] == serviceName {
+							foundMicroService = true
+							break
+						}
+					}
+					Expect(foundMicroService).To(Equal(true))
+
 					//Delete Consumer and Provider
 					url = strings.Replace(UNREGISTERMICROSERVICE, ":serviceId", consumerServiceID, 1)
 					req, _ = http.NewRequest(DELETE, SCURL+url, nil)
diff --git a/pkg/tlsutil/tlsutil.go b/pkg/tlsutil/tlsutil.go
index 53b1066..76b7b26 100644
--- a/pkg/tlsutil/tlsutil.go
+++ b/pkg/tlsutil/tlsutil.go
@@ -108,7 +108,7 @@
 	if protocol, ok := TLS_VERSION_MAP[sprotocol]; ok {
 		result = protocol
 	} else {
-		util.Logger().Warnf(nil, "invalid ssl minimal version invalid(%s), use default.", sprotocol)
+		util.Logger().Warnf(nil, "invalid ssl minimal version(%s), use default.", sprotocol)
 	}
 
 	return result
diff --git a/server/core/common.go b/server/core/common.go
index 0e4886f..90edd34 100644
--- a/server/core/common.go
+++ b/server/core/common.go
@@ -39,9 +39,8 @@
 	GetSchemaExistsReqValidator   validate.Validator
 	GetServiceReqValidator        validate.Validator
 	GetSchemaReqValidator         validate.Validator
-	DependencyMSValidator         validate.Validator
+	ConsumerMsValidator           validate.Validator
 	ProviderMsValidator           validate.Validator
-	MSDependencyValidator         validate.Validator
 	TagReqValidator               validate.Validator
 	FindInstanceReqValidator      validate.Validator
 	GetInstanceValidator          validate.Validator
@@ -141,15 +140,12 @@
 	GetSchemaReqValidator.AddRule("ServiceId", ServiceIdRule)
 	GetSchemaReqValidator.AddRule("SchemaId", SchemaIdRule)
 
-	DependencyMSValidator.AddRules(MicroServiceKeyValidator.GetRules())
+	ConsumerMsValidator.AddRules(MicroServiceKeyValidator.GetRules())
 
 	ProviderMsValidator.AddRules(MicroServiceKeyValidator.GetRules())
 	ProviderMsValidator.AddRule("ServiceName", &validate.ValidateRule{Min: 1, Max: 128, Regexp: nameFuzzyRegex})
 	ProviderMsValidator.AddRule("Version", versionFuzzyRule)
 
-	MSDependencyValidator.AddSub("Consumer", &DependencyMSValidator)
-	MSDependencyValidator.AddSub("Providers", &ProviderMsValidator)
-
 	TagReqValidator.AddRule("ServiceId", ServiceIdRule)
 	TagReqValidator.AddRule("Tags", TagRule)
 	TagReqValidator.AddRule("Keys", &validate.ValidateRule{Regexp: tagRegex})
@@ -220,8 +216,6 @@
 		return SchemaValidator.Validate(v)
 	case *pb.ModifySchemasRequest:
 		return SchemasValidator.Validate(v)
-	case *pb.MicroServiceDependency:
-		return DependencyMSValidator.Validate(v)
 	case *pb.FindInstancesRequest:
 		return FindInstanceReqValidator.Validate(v)
 	case *pb.GetOneInstanceRequest, *pb.GetInstancesRequest:
diff --git a/server/core/key_generator.go b/server/core/key_generator.go
index ee50473..ea941b3 100644
--- a/server/core/key_generator.go
+++ b/server/core/key_generator.go
@@ -159,13 +159,13 @@
 	if len(strings.TrimSpace(appId)) == 0 {
 		key.AppId = REGISTRY_APP_ID
 	}
-	stage := key.Environment
-	if len(strings.TrimSpace(stage)) == 0 {
-		key.Environment = pb.ENV_DEV
+	env := key.Environment
+	if len(strings.TrimSpace(env)) == 0 {
+		env = pb.ENV_DEV
 	}
 	return util.StringJoin([]string{
 		GetServiceIndexRootKey(key.Tenant),
-		key.Environment,
+		env,
 		key.AppId,
 		key.ServiceName,
 		key.Version,
@@ -177,13 +177,13 @@
 	if len(strings.TrimSpace(appId)) == 0 {
 		key.AppId = REGISTRY_APP_ID
 	}
-	stage := key.Environment
-	if len(strings.TrimSpace(stage)) == 0 {
-		key.Environment = pb.ENV_DEV
+	env := key.Environment
+	if len(strings.TrimSpace(env)) == 0 {
+		env = pb.ENV_DEV
 	}
 	return util.StringJoin([]string{
 		GetServiceAliasRootKey(key.Tenant),
-		key.Environment,
+		env,
 		key.AppId,
 		key.Alias,
 		key.Version,
diff --git a/server/core/proto/services.pb.go b/server/core/proto/services.pb.go
index 1933584..58884ae 100644
--- a/server/core/proto/services.pb.go
+++ b/server/core/proto/services.pb.go
@@ -1,5 +1,6 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
+// Code generated by protoc-gen-go.
 // source: services.proto
+// DO NOT EDIT!
 
 /*
 Package proto is a generated protocol buffer package.
@@ -84,9 +85,11 @@
 	DeleteSchemaResponse
 	ModifySchemaRequest
 	ModifySchemaResponse
+	AddDependenciesRequest
+	AddDependenciesResponse
 	CreateDependenciesRequest
 	DependencyKey
-	MircroServiceDependency
+	ConsumerDependency
 	CreateDependenciesResponse
 	GetDependenciesRequest
 	GetConDependenciesResponse
@@ -2297,16 +2300,48 @@
 	return nil
 }
 
+type AddDependenciesRequest struct {
+	Dependencies []*ConsumerDependency `protobuf:"bytes,1,rep,name=dependencies" json:"dependencies,omitempty"`
+}
+
+func (m *AddDependenciesRequest) Reset()                    { *m = AddDependenciesRequest{} }
+func (m *AddDependenciesRequest) String() string            { return proto1.CompactTextString(m) }
+func (*AddDependenciesRequest) ProtoMessage()               {}
+func (*AddDependenciesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{76} }
+
+func (m *AddDependenciesRequest) GetDependencies() []*ConsumerDependency {
+	if m != nil {
+		return m.Dependencies
+	}
+	return nil
+}
+
+type AddDependenciesResponse struct {
+	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
+}
+
+func (m *AddDependenciesResponse) Reset()                    { *m = AddDependenciesResponse{} }
+func (m *AddDependenciesResponse) String() string            { return proto1.CompactTextString(m) }
+func (*AddDependenciesResponse) ProtoMessage()               {}
+func (*AddDependenciesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{77} }
+
+func (m *AddDependenciesResponse) GetResponse() *Response {
+	if m != nil {
+		return m.Response
+	}
+	return nil
+}
+
 type CreateDependenciesRequest struct {
-	Dependencies []*MircroServiceDependency `protobuf:"bytes,1,rep,name=dependencies" json:"dependencies,omitempty"`
+	Dependencies []*ConsumerDependency `protobuf:"bytes,1,rep,name=dependencies" json:"dependencies,omitempty"`
 }
 
 func (m *CreateDependenciesRequest) Reset()                    { *m = CreateDependenciesRequest{} }
 func (m *CreateDependenciesRequest) String() string            { return proto1.CompactTextString(m) }
 func (*CreateDependenciesRequest) ProtoMessage()               {}
-func (*CreateDependenciesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{76} }
+func (*CreateDependenciesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{78} }
 
-func (m *CreateDependenciesRequest) GetDependencies() []*MircroServiceDependency {
+func (m *CreateDependenciesRequest) GetDependencies() []*ConsumerDependency {
 	if m != nil {
 		return m.Dependencies
 	}
@@ -2323,7 +2358,7 @@
 func (m *DependencyKey) Reset()                    { *m = DependencyKey{} }
 func (m *DependencyKey) String() string            { return proto1.CompactTextString(m) }
 func (*DependencyKey) ProtoMessage()               {}
-func (*DependencyKey) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{77} }
+func (*DependencyKey) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{79} }
 
 func (m *DependencyKey) GetAppId() string {
 	if m != nil {
@@ -2353,24 +2388,24 @@
 	return ""
 }
 
-type MircroServiceDependency struct {
+type ConsumerDependency struct {
 	Consumer  *DependencyKey   `protobuf:"bytes,1,opt,name=consumer" json:"consumer,omitempty"`
 	Providers []*DependencyKey `protobuf:"bytes,2,rep,name=providers" json:"providers,omitempty"`
 }
 
-func (m *MircroServiceDependency) Reset()                    { *m = MircroServiceDependency{} }
-func (m *MircroServiceDependency) String() string            { return proto1.CompactTextString(m) }
-func (*MircroServiceDependency) ProtoMessage()               {}
-func (*MircroServiceDependency) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{78} }
+func (m *ConsumerDependency) Reset()                    { *m = ConsumerDependency{} }
+func (m *ConsumerDependency) String() string            { return proto1.CompactTextString(m) }
+func (*ConsumerDependency) ProtoMessage()               {}
+func (*ConsumerDependency) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{80} }
 
-func (m *MircroServiceDependency) GetConsumer() *DependencyKey {
+func (m *ConsumerDependency) GetConsumer() *DependencyKey {
 	if m != nil {
 		return m.Consumer
 	}
 	return nil
 }
 
-func (m *MircroServiceDependency) GetProviders() []*DependencyKey {
+func (m *ConsumerDependency) GetProviders() []*DependencyKey {
 	if m != nil {
 		return m.Providers
 	}
@@ -2384,7 +2419,7 @@
 func (m *CreateDependenciesResponse) Reset()                    { *m = CreateDependenciesResponse{} }
 func (m *CreateDependenciesResponse) String() string            { return proto1.CompactTextString(m) }
 func (*CreateDependenciesResponse) ProtoMessage()               {}
-func (*CreateDependenciesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{79} }
+func (*CreateDependenciesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{81} }
 
 func (m *CreateDependenciesResponse) GetResponse() *Response {
 	if m != nil {
@@ -2400,7 +2435,7 @@
 func (m *GetDependenciesRequest) Reset()                    { *m = GetDependenciesRequest{} }
 func (m *GetDependenciesRequest) String() string            { return proto1.CompactTextString(m) }
 func (*GetDependenciesRequest) ProtoMessage()               {}
-func (*GetDependenciesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{80} }
+func (*GetDependenciesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{82} }
 
 func (m *GetDependenciesRequest) GetServiceId() string {
 	if m != nil {
@@ -2417,7 +2452,7 @@
 func (m *GetConDependenciesResponse) Reset()                    { *m = GetConDependenciesResponse{} }
 func (m *GetConDependenciesResponse) String() string            { return proto1.CompactTextString(m) }
 func (*GetConDependenciesResponse) ProtoMessage()               {}
-func (*GetConDependenciesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{81} }
+func (*GetConDependenciesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{83} }
 
 func (m *GetConDependenciesResponse) GetResponse() *Response {
 	if m != nil {
@@ -2441,7 +2476,7 @@
 func (m *GetProDependenciesResponse) Reset()                    { *m = GetProDependenciesResponse{} }
 func (m *GetProDependenciesResponse) String() string            { return proto1.CompactTextString(m) }
 func (*GetProDependenciesResponse) ProtoMessage()               {}
-func (*GetProDependenciesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{82} }
+func (*GetProDependenciesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{84} }
 
 func (m *GetProDependenciesResponse) GetResponse() *Response {
 	if m != nil {
@@ -2472,7 +2507,7 @@
 func (m *ServiceDetail) Reset()                    { *m = ServiceDetail{} }
 func (m *ServiceDetail) String() string            { return proto1.CompactTextString(m) }
 func (*ServiceDetail) ProtoMessage()               {}
-func (*ServiceDetail) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{83} }
+func (*ServiceDetail) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{85} }
 
 func (m *ServiceDetail) GetMicroService() *MicroService {
 	if m != nil {
@@ -2539,7 +2574,7 @@
 func (m *GetServiceDetailResponse) Reset()                    { *m = GetServiceDetailResponse{} }
 func (m *GetServiceDetailResponse) String() string            { return proto1.CompactTextString(m) }
 func (*GetServiceDetailResponse) ProtoMessage()               {}
-func (*GetServiceDetailResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{84} }
+func (*GetServiceDetailResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{86} }
 
 func (m *GetServiceDetailResponse) GetResponse() *Response {
 	if m != nil {
@@ -2564,7 +2599,7 @@
 func (m *DelServicesRequest) Reset()                    { *m = DelServicesRequest{} }
 func (m *DelServicesRequest) String() string            { return proto1.CompactTextString(m) }
 func (*DelServicesRequest) ProtoMessage()               {}
-func (*DelServicesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{85} }
+func (*DelServicesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{87} }
 
 func (m *DelServicesRequest) GetServiceIds() []string {
 	if m != nil {
@@ -2589,7 +2624,7 @@
 func (m *DelServicesRspInfo) Reset()                    { *m = DelServicesRspInfo{} }
 func (m *DelServicesRspInfo) String() string            { return proto1.CompactTextString(m) }
 func (*DelServicesRspInfo) ProtoMessage()               {}
-func (*DelServicesRspInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{86} }
+func (*DelServicesRspInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{88} }
 
 func (m *DelServicesRspInfo) GetErrMessage() string {
 	if m != nil {
@@ -2614,7 +2649,7 @@
 func (m *DelServicesResponse) Reset()                    { *m = DelServicesResponse{} }
 func (m *DelServicesResponse) String() string            { return proto1.CompactTextString(m) }
 func (*DelServicesResponse) ProtoMessage()               {}
-func (*DelServicesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{87} }
+func (*DelServicesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{89} }
 
 func (m *DelServicesResponse) GetResponse() *Response {
 	if m != nil {
@@ -2637,7 +2672,7 @@
 func (m *GetAppsRequest) Reset()                    { *m = GetAppsRequest{} }
 func (m *GetAppsRequest) String() string            { return proto1.CompactTextString(m) }
 func (*GetAppsRequest) ProtoMessage()               {}
-func (*GetAppsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{88} }
+func (*GetAppsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{90} }
 
 func (m *GetAppsRequest) GetEnvironment() string {
 	if m != nil {
@@ -2654,7 +2689,7 @@
 func (m *GetAppsResponse) Reset()                    { *m = GetAppsResponse{} }
 func (m *GetAppsResponse) String() string            { return proto1.CompactTextString(m) }
 func (*GetAppsResponse) ProtoMessage()               {}
-func (*GetAppsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{89} }
+func (*GetAppsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{91} }
 
 func (m *GetAppsResponse) GetResponse() *Response {
 	if m != nil {
@@ -2747,9 +2782,11 @@
 	proto1.RegisterType((*DeleteSchemaResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.DeleteSchemaResponse")
 	proto1.RegisterType((*ModifySchemaRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.ModifySchemaRequest")
 	proto1.RegisterType((*ModifySchemaResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.ModifySchemaResponse")
+	proto1.RegisterType((*AddDependenciesRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.AddDependenciesRequest")
+	proto1.RegisterType((*AddDependenciesResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.AddDependenciesResponse")
 	proto1.RegisterType((*CreateDependenciesRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.CreateDependenciesRequest")
 	proto1.RegisterType((*DependencyKey)(nil), "com.huawei.paas.cse.serviceregistry.api.DependencyKey")
-	proto1.RegisterType((*MircroServiceDependency)(nil), "com.huawei.paas.cse.serviceregistry.api.MircroServiceDependency")
+	proto1.RegisterType((*ConsumerDependency)(nil), "com.huawei.paas.cse.serviceregistry.api.ConsumerDependency")
 	proto1.RegisterType((*CreateDependenciesResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.CreateDependenciesResponse")
 	proto1.RegisterType((*GetDependenciesRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.GetDependenciesRequest")
 	proto1.RegisterType((*GetConDependenciesResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.GetConDependenciesResponse")
@@ -2792,6 +2829,7 @@
 	DeleteSchema(ctx context.Context, in *DeleteSchemaRequest, opts ...grpc.CallOption) (*DeleteSchemaResponse, error)
 	ModifySchema(ctx context.Context, in *ModifySchemaRequest, opts ...grpc.CallOption) (*ModifySchemaResponse, error)
 	ModifySchemas(ctx context.Context, in *ModifySchemasRequest, opts ...grpc.CallOption) (*ModifySchemasResponse, error)
+	AddDependenciesForMicroServices(ctx context.Context, in *AddDependenciesRequest, opts ...grpc.CallOption) (*AddDependenciesResponse, error)
 	CreateDependenciesForMicroServices(ctx context.Context, in *CreateDependenciesRequest, opts ...grpc.CallOption) (*CreateDependenciesResponse, error)
 	GetProviderDependencies(ctx context.Context, in *GetDependenciesRequest, opts ...grpc.CallOption) (*GetProDependenciesResponse, error)
 	GetConsumerDependencies(ctx context.Context, in *GetDependenciesRequest, opts ...grpc.CallOption) (*GetConDependenciesResponse, error)
@@ -2968,6 +3006,15 @@
 	return out, nil
 }
 
+func (c *serviceCtrlClient) AddDependenciesForMicroServices(ctx context.Context, in *AddDependenciesRequest, opts ...grpc.CallOption) (*AddDependenciesResponse, error) {
+	out := new(AddDependenciesResponse)
+	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/addDependenciesForMicroServices", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *serviceCtrlClient) CreateDependenciesForMicroServices(ctx context.Context, in *CreateDependenciesRequest, opts ...grpc.CallOption) (*CreateDependenciesResponse, error) {
 	out := new(CreateDependenciesResponse)
 	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/createDependenciesForMicroServices", in, out, c.cc, opts...)
@@ -3025,6 +3072,7 @@
 	DeleteSchema(context.Context, *DeleteSchemaRequest) (*DeleteSchemaResponse, error)
 	ModifySchema(context.Context, *ModifySchemaRequest) (*ModifySchemaResponse, error)
 	ModifySchemas(context.Context, *ModifySchemasRequest) (*ModifySchemasResponse, error)
+	AddDependenciesForMicroServices(context.Context, *AddDependenciesRequest) (*AddDependenciesResponse, error)
 	CreateDependenciesForMicroServices(context.Context, *CreateDependenciesRequest) (*CreateDependenciesResponse, error)
 	GetProviderDependencies(context.Context, *GetDependenciesRequest) (*GetProDependenciesResponse, error)
 	GetConsumerDependencies(context.Context, *GetDependenciesRequest) (*GetConDependenciesResponse, error)
@@ -3359,6 +3407,24 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _ServiceCtrl_AddDependenciesForMicroServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(AddDependenciesRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ServiceCtrlServer).AddDependenciesForMicroServices(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/AddDependenciesForMicroServices",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ServiceCtrlServer).AddDependenciesForMicroServices(ctx, req.(*AddDependenciesRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _ServiceCtrl_CreateDependenciesForMicroServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(CreateDependenciesRequest)
 	if err := dec(in); err != nil {
@@ -3508,6 +3574,10 @@
 			Handler:    _ServiceCtrl_ModifySchemas_Handler,
 		},
 		{
+			MethodName: "addDependenciesForMicroServices",
+			Handler:    _ServiceCtrl_AddDependenciesForMicroServices_Handler,
+		},
+		{
 			MethodName: "createDependenciesForMicroServices",
 			Handler:    _ServiceCtrl_CreateDependenciesForMicroServices_Handler,
 		},
@@ -4050,210 +4120,213 @@
 func init() { proto1.RegisterFile("services.proto", fileDescriptor0) }
 
 var fileDescriptor0 = []byte{
-	// 3272 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3c, 0xcd, 0x6f, 0xdc, 0xc6,
-	0xf5, 0x98, 0xd5, 0xae, 0xa4, 0x7d, 0xfa, 0xb0, 0x35, 0x96, 0x2c, 0x7a, 0x7f, 0xf9, 0x05, 0x06,
-	0x11, 0xa0, 0x39, 0x04, 0x6a, 0xa2, 0x34, 0x89, 0xeb, 0xd8, 0x71, 0x24, 0xd9, 0x91, 0x65, 0xc7,
-	0xb1, 0xc3, 0x55, 0xe2, 0x26, 0x69, 0x1b, 0x50, 0xbb, 0xa3, 0x15, 0xe3, 0x5d, 0x92, 0x21, 0x67,
-	0x95, 0x6c, 0x2f, 0x45, 0xd2, 0xa4, 0x5f, 0x69, 0xd3, 0x06, 0x6d, 0x4f, 0x29, 0xd0, 0x43, 0xe1,
-	0x63, 0x0f, 0x2d, 0x0a, 0x04, 0x45, 0xd0, 0xa2, 0x68, 0xd0, 0x4b, 0xd1, 0xa0, 0x87, 0x1e, 0x7a,
-	0xea, 0x7f, 0xd0, 0x5b, 0xff, 0x80, 0x16, 0xf3, 0x41, 0x72, 0xf8, 0xa1, 0xf5, 0x92, 0x14, 0x13,
-	0xf4, 0x24, 0xce, 0x70, 0xe7, 0xcd, 0xfb, 0x9e, 0xf7, 0xde, 0x3c, 0x11, 0x16, 0x7d, 0xe2, 0x1d,
-	0x5a, 0x1d, 0xe2, 0xaf, 0xb9, 0x9e, 0x43, 0x1d, 0xfc, 0x85, 0x8e, 0x33, 0x58, 0x3b, 0x18, 0x9a,
-	0x6f, 0x10, 0x6b, 0xcd, 0x35, 0x4d, 0x7f, 0xad, 0xe3, 0x93, 0x35, 0xf9, 0x1b, 0x8f, 0xf4, 0x2c,
-	0x9f, 0x7a, 0xa3, 0x35, 0xd3, 0xb5, 0xf4, 0x6f, 0xc2, 0xf2, 0x0d, 0xa7, 0x6b, 0xed, 0x8f, 0xda,
-	0x9d, 0x03, 0x32, 0x30, 0x7d, 0x83, 0xbc, 0x3e, 0x24, 0x3e, 0xc5, 0xf7, 0x41, 0x53, 0xfe, 0x7c,
-	0xa7, 0xab, 0xa1, 0xb3, 0xe8, 0xc1, 0xa6, 0x11, 0x4d, 0xe0, 0x1d, 0x98, 0xf1, 0xc5, 0xef, 0xb5,
-	0xda, 0xd9, 0xa9, 0x07, 0xe7, 0xd6, 0xbf, 0xb8, 0x36, 0xe1, 0x86, 0x6b, 0x62, 0x1f, 0x23, 0x58,
-	0xaf, 0xbf, 0x08, 0xd3, 0x62, 0x0a, 0xb7, 0x60, 0x56, 0x4c, 0x86, 0x3b, 0x86, 0x63, 0xac, 0xc1,
-	0x8c, 0x3f, 0x1c, 0x0c, 0x4c, 0x6f, 0xa4, 0xd5, 0xf8, 0xab, 0x60, 0x88, 0x4f, 0xc3, 0xb4, 0xf8,
-	0x95, 0x36, 0xc5, 0x5f, 0xc8, 0x91, 0xbe, 0x0f, 0x2b, 0x09, 0xc2, 0x7c, 0xd7, 0xb1, 0x7d, 0x82,
-	0x6f, 0xc0, 0xac, 0x27, 0x9f, 0xf9, 0x36, 0x73, 0xeb, 0x8f, 0x4c, 0x8c, 0x7c, 0x00, 0xc4, 0x08,
-	0x41, 0xe8, 0xaf, 0xc3, 0xa9, 0xab, 0xc4, 0xf4, 0xe8, 0x1e, 0x31, 0x69, 0x9b, 0xd0, 0x80, 0x7f,
-	0x2f, 0x43, 0xd3, 0xb2, 0x7d, 0x6a, 0xda, 0x1d, 0xe2, 0x6b, 0x88, 0xf3, 0xe8, 0xc2, 0xc4, 0xdb,
-	0xa8, 0x00, 0xaf, 0xf4, 0xc9, 0x80, 0xd8, 0xd4, 0x88, 0xc0, 0xe9, 0xed, 0xf8, 0x96, 0xf2, 0x17,
-	0xf7, 0x10, 0xd9, 0xfd, 0x00, 0x01, 0x84, 0x9d, 0xae, 0x64, 0xa2, 0x32, 0xa3, 0x7f, 0x8c, 0x60,
-	0x39, 0x4e, 0x48, 0x25, 0xfc, 0xc2, 0xbb, 0x2a, 0x63, 0x84, 0xf2, 0x3c, 0x3e, 0x31, 0xbc, 0x1d,
-	0xb9, 0xf2, 0xea, 0x9e, 0xe1, 0xc7, 0x58, 0x32, 0x80, 0x85, 0xd8, 0xbb, 0x72, 0xcc, 0x60, 0xef,
-	0x89, 0xe7, 0xdd, 0x20, 0xbe, 0x6f, 0xf6, 0x88, 0x54, 0x2c, 0x65, 0x46, 0xdf, 0x82, 0x66, 0x9b,
-	0xb6, 0x05, 0x38, 0xbc, 0x0c, 0x8d, 0x8e, 0x33, 0xb4, 0x29, 0xdf, 0x66, 0xca, 0x10, 0x03, 0x7c,
-	0x16, 0xe6, 0x1c, 0xbb, 0x6f, 0xd9, 0x64, 0x8b, 0xbf, 0xab, 0xf1, 0x77, 0xea, 0x94, 0xae, 0x03,
-	0xb4, 0x69, 0x80, 0x75, 0x36, 0x14, 0xfd, 0xff, 0xa1, 0xd1, 0xa6, 0x1b, 0xae, 0x7b, 0xc4, 0xeb,
-	0x7f, 0x23, 0x06, 0xc3, 0xa4, 0x96, 0x4f, 0xad, 0x8e, 0x8f, 0x9f, 0x83, 0xd9, 0xc0, 0x0f, 0x48,
-	0x51, 0xad, 0x4f, 0x6e, 0x97, 0x01, 0x3d, 0x46, 0x08, 0x03, 0x3f, 0x1f, 0x97, 0x15, 0x03, 0xf8,
-	0x68, 0x0e, 0x80, 0x01, 0x6d, 0x8a, 0xa0, 0xf0, 0x26, 0xd4, 0x4d, 0xd7, 0xf5, 0x39, 0x4f, 0xe7,
-	0xd6, 0xd7, 0x72, 0x40, 0xdb, 0x70, 0x5d, 0x83, 0xaf, 0xd5, 0x5f, 0x83, 0xd3, 0xdb, 0x24, 0x40,
-	0xd7, 0xdf, 0xb1, 0xf7, 0x9d, 0xc0, 0xea, 0x34, 0x98, 0x71, 0x5c, 0x6a, 0x39, 0xb6, 0xb0, 0xb9,
-	0xa6, 0x11, 0x0c, 0x19, 0xff, 0x4c, 0xd7, 0x0d, 0x85, 0x2d, 0x06, 0x4c, 0x48, 0x72, 0xb3, 0xe7,
-	0xcc, 0x41, 0x20, 0x68, 0x75, 0x4a, 0xff, 0x65, 0x0d, 0x56, 0x53, 0x9b, 0x55, 0x63, 0x19, 0x5d,
-	0x58, 0x32, 0xfb, 0xfd, 0x60, 0xa7, 0xcb, 0x84, 0x9a, 0x56, 0x3f, 0xb7, 0x85, 0xc8, 0xe5, 0x62,
-	0xb5, 0x91, 0x06, 0x88, 0xdb, 0x00, 0x7e, 0xa8, 0x31, 0x52, 0x0c, 0x79, 0x84, 0x1a, 0x2c, 0x35,
-	0x14, 0x30, 0xfa, 0xa7, 0x08, 0x4e, 0xdc, 0xb0, 0x3a, 0x9e, 0x23, 0x37, 0xbb, 0x4e, 0xb8, 0x63,
-	0xa6, 0xc4, 0x36, 0xa5, 0xca, 0x36, 0x0d, 0x39, 0x62, 0x32, 0x72, 0x3d, 0xe7, 0x35, 0xd2, 0xa1,
-	0x81, 0x2b, 0x97, 0xc3, 0x48, 0x46, 0x53, 0x63, 0x64, 0x54, 0x4f, 0xc9, 0x88, 0x41, 0x3c, 0x24,
-	0x9e, 0x6f, 0x39, 0xb6, 0xd6, 0x10, 0x10, 0xe5, 0x90, 0xad, 0x25, 0xf6, 0xa1, 0xe5, 0x39, 0x36,
-	0xf3, 0x90, 0xda, 0xb4, 0x58, 0xab, 0x4c, 0xf1, 0x3d, 0xfb, 0x96, 0xe9, 0x6b, 0x33, 0x72, 0x4f,
-	0x36, 0xd0, 0xff, 0x32, 0x03, 0xf3, 0x2a, 0x3d, 0xf7, 0x70, 0x27, 0x05, 0x95, 0x4b, 0x45, 0xbc,
-	0x9e, 0x42, 0xbc, 0x4b, 0xfc, 0x8e, 0x67, 0x71, 0xf5, 0x95, 0x64, 0xa9, 0x53, 0x6c, 0xcf, 0x3e,
-	0x39, 0x24, 0x7d, 0x49, 0x94, 0x18, 0xf0, 0x73, 0x52, 0x1e, 0xcc, 0x33, 0xc2, 0x00, 0xe4, 0x10,
-	0x5f, 0x83, 0x86, 0x6b, 0xd2, 0x03, 0x5f, 0x03, 0xae, 0x51, 0x5f, 0xca, 0xab, 0x51, 0xb7, 0x4c,
-	0x7a, 0x60, 0x08, 0x10, 0xfc, 0xcc, 0xa5, 0x26, 0x1d, 0xfa, 0xda, 0xac, 0x3c, 0x73, 0xf9, 0x08,
-	0x13, 0x00, 0xd7, 0x73, 0x5c, 0xe2, 0x51, 0x8b, 0xf8, 0x5a, 0x93, 0x6f, 0x74, 0x65, 0xe2, 0x8d,
-	0x54, 0x86, 0xaf, 0xdd, 0x0a, 0xe1, 0x5c, 0xb1, 0xa9, 0x37, 0x32, 0x14, 0xc0, 0x4c, 0x18, 0xd4,
-	0x1a, 0x10, 0x9f, 0x9a, 0x03, 0x57, 0x9b, 0x13, 0xc2, 0x08, 0x27, 0xd8, 0x01, 0xe3, 0x7a, 0xce,
-	0xa1, 0xd5, 0x25, 0x9e, 0xaf, 0xcd, 0xe7, 0x34, 0x9f, 0xcb, 0xc4, 0x25, 0x76, 0x97, 0xd8, 0x9d,
-	0xd1, 0x75, 0x32, 0x32, 0x22, 0x40, 0x91, 0x9e, 0x2c, 0x28, 0x7a, 0xc2, 0x08, 0x7e, 0x76, 0xb3,
-	0x4d, 0x3d, 0x93, 0x92, 0xde, 0x48, 0x5b, 0x2c, 0x43, 0x70, 0x04, 0x47, 0x12, 0x1c, 0x4d, 0x60,
-	0x1d, 0xe6, 0x07, 0x4e, 0x77, 0x37, 0xa4, 0xf9, 0x04, 0xc7, 0x21, 0x36, 0x97, 0x54, 0xf5, 0x93,
-	0x69, 0x55, 0xbf, 0x1f, 0x40, 0x6c, 0x4f, 0xbc, 0xcd, 0x91, 0xb6, 0x24, 0x0e, 0xb5, 0x68, 0x06,
-	0x7f, 0x05, 0x9a, 0xcf, 0x78, 0xe6, 0x80, 0xdc, 0x76, 0xbc, 0x3b, 0x1a, 0xe6, 0x8e, 0xe1, 0xfc,
-	0xc4, 0xb4, 0x84, 0x2b, 0xa5, 0xe0, 0x46, 0x46, 0x04, 0xac, 0x75, 0x11, 0x4e, 0x24, 0xe4, 0x89,
-	0x4f, 0xc2, 0xd4, 0x1d, 0x32, 0x92, 0xa6, 0xc4, 0x1e, 0x19, 0x87, 0x0f, 0xcd, 0xfe, 0x90, 0x04,
-	0x46, 0xc4, 0x07, 0xe7, 0x6b, 0xe7, 0x10, 0x5b, 0x9e, 0xe0, 0x4e, 0x9e, 0xe5, 0xfa, 0x06, 0x2c,
-	0xa5, 0xb0, 0xc3, 0x18, 0xea, 0x36, 0xb3, 0x4a, 0x01, 0x81, 0x3f, 0xab, 0xe6, 0x58, 0x8b, 0x99,
-	0xa3, 0xfe, 0x4f, 0x04, 0x73, 0xc1, 0xf1, 0x38, 0xec, 0x13, 0x66, 0x00, 0xde, 0xb0, 0x1f, 0xf9,
-	0x02, 0x39, 0x62, 0x21, 0x2c, 0x7b, 0xda, 0x1d, 0xb9, 0x01, 0x1e, 0xe1, 0x98, 0x69, 0xad, 0x49,
-	0xa9, 0x67, 0xed, 0x0d, 0x69, 0xe0, 0x0c, 0xa2, 0x09, 0xee, 0x15, 0x4d, 0x4a, 0x89, 0x17, 0xba,
-	0x02, 0x39, 0x9c, 0xc0, 0x15, 0xc4, 0xec, 0x61, 0x3a, 0x69, 0x0f, 0x49, 0xe5, 0x99, 0x49, 0x2b,
-	0x8f, 0xfe, 0x3e, 0x82, 0xd3, 0x1b, 0xdd, 0xee, 0x4d, 0xef, 0x05, 0xb7, 0x6b, 0x52, 0xa2, 0x92,
-	0xaa, 0x92, 0x84, 0xc6, 0x91, 0x54, 0x1b, 0x43, 0xd2, 0xd4, 0x58, 0x92, 0xea, 0x29, 0x92, 0xf4,
-	0x3f, 0x44, 0x0c, 0x67, 0x8e, 0x87, 0x89, 0x8b, 0xb9, 0x9e, 0x40, 0x5c, 0xec, 0x19, 0x7f, 0x1d,
-	0x66, 0xa5, 0x53, 0x18, 0xc9, 0x63, 0x72, 0xb3, 0x88, 0x53, 0x0b, 0x5c, 0x8d, 0xb4, 0xbb, 0x10,
-	0x66, 0xeb, 0x49, 0x58, 0x88, 0xbd, 0xca, 0xa5, 0x74, 0xe7, 0x60, 0x36, 0x8c, 0x13, 0x30, 0xd4,
-	0x3b, 0x4e, 0x57, 0xb0, 0xaf, 0x61, 0xf0, 0x67, 0xc6, 0x9c, 0x81, 0x0c, 0x2f, 0xa5, 0xae, 0xc9,
-	0xa1, 0xfe, 0x0f, 0x04, 0xa7, 0xb6, 0x09, 0xbd, 0xf2, 0x26, 0xb3, 0x4b, 0x16, 0x3d, 0xc9, 0xd8,
-	0x06, 0x43, 0x9d, 0x46, 0x42, 0xe0, 0xcf, 0x15, 0x1c, 0x3c, 0xb1, 0x83, 0xae, 0x91, 0x3c, 0xe8,
-	0xd4, 0x14, 0x6d, 0x3a, 0x91, 0xa2, 0x25, 0x1c, 0xd0, 0x4c, 0xca, 0x01, 0xe9, 0xbf, 0x43, 0xb0,
-	0x1c, 0xa7, 0xac, 0x9a, 0x40, 0x2a, 0x46, 0x43, 0x6d, 0x1c, 0x0d, 0x53, 0x47, 0xa7, 0x99, 0xf5,
-	0x58, 0x9a, 0xa9, 0xff, 0x7a, 0x0a, 0x96, 0xb7, 0x3c, 0xa2, 0x18, 0x87, 0x14, 0xcb, 0x4d, 0x98,
-	0x91, 0xb0, 0x25, 0xea, 0x8f, 0x15, 0xf2, 0xff, 0x46, 0x00, 0x05, 0xbf, 0x00, 0x0d, 0x66, 0x60,
-	0x41, 0x72, 0x74, 0x69, 0x62, 0x70, 0xd9, 0x06, 0x6c, 0x08, 0x68, 0xf8, 0x15, 0xa8, 0x53, 0xb3,
-	0xc7, 0x22, 0x3e, 0x06, 0x75, 0x7b, 0x62, 0xa8, 0x59, 0x44, 0xaf, 0xed, 0x9a, 0x3d, 0x79, 0x2e,
-	0x73, 0xa0, 0xf8, 0x15, 0x35, 0x51, 0xa8, 0xf3, 0x1d, 0x2e, 0x16, 0x62, 0x43, 0x46, 0xca, 0xd0,
-	0x7a, 0x02, 0x9a, 0xe1, 0x7e, 0xb9, 0x6c, 0xf0, 0x1d, 0x04, 0x2b, 0x09, 0xf4, 0x3f, 0x07, 0x85,
-	0xd3, 0xaf, 0xc1, 0xf2, 0x65, 0xd2, 0x27, 0x29, 0xcd, 0xb9, 0x67, 0x4c, 0xb9, 0xef, 0x78, 0x1d,
-	0x41, 0xd6, 0xac, 0x21, 0x06, 0xfa, 0x3e, 0xac, 0x24, 0x60, 0x55, 0x53, 0xd5, 0x78, 0x04, 0x96,
-	0xa2, 0xac, 0x67, 0x22, 0x84, 0xf5, 0xdf, 0x22, 0xc0, 0xea, 0x9a, 0x6a, 0x58, 0xad, 0x98, 0x5b,
-	0xed, 0x38, 0xcc, 0x4d, 0x5f, 0x56, 0xb1, 0x0e, 0xca, 0x5f, 0xfa, 0x47, 0xc2, 0x09, 0x47, 0xd3,
-	0xd5, 0x50, 0xf3, 0xbc, 0x92, 0xb0, 0x0b, 0x73, 0x2f, 0x48, 0x4e, 0x08, 0x46, 0xff, 0x17, 0x82,
-	0x33, 0x31, 0x27, 0xc0, 0xce, 0xb0, 0x09, 0xcb, 0x7a, 0x5e, 0x2c, 0x7e, 0x17, 0x08, 0x19, 0x13,
-	0x23, 0x74, 0xe4, 0xae, 0xe3, 0x82, 0xf9, 0x92, 0xb1, 0xa1, 0x7e, 0x07, 0x5a, 0x59, 0xfb, 0x56,
-	0x63, 0x15, 0x8f, 0xab, 0x85, 0x07, 0xe6, 0x5c, 0xfd, 0x89, 0x4d, 0x63, 0x35, 0xb5, 0xb0, 0x1a,
-	0x8d, 0xba, 0x16, 0x3f, 0x3d, 0x72, 0xa7, 0x79, 0xca, 0x91, 0xa1, 0xdf, 0x45, 0xa0, 0xa5, 0xcf,
-	0x93, 0x89, 0x34, 0x29, 0x0a, 0x90, 0x6b, 0xb1, 0x00, 0xb9, 0x0d, 0x75, 0xf6, 0x24, 0xeb, 0x0e,
-	0xa5, 0xcf, 0x36, 0x0e, 0x4c, 0x7f, 0x2d, 0xa1, 0xf1, 0x02, 0xcd, 0x6a, 0x54, 0xe0, 0x87, 0x22,
-	0x52, 0xce, 0xad, 0x03, 0x15, 0x1d, 0xeb, 0xfa, 0xdb, 0x08, 0x56, 0x53, 0xf8, 0x54, 0xa3, 0x5a,
-	0x1a, 0xcc, 0x18, 0x5c, 0x8a, 0x82, 0x86, 0xa6, 0x11, 0x0c, 0xf5, 0x36, 0x9c, 0x89, 0x9f, 0x4a,
-	0x93, 0xb3, 0x45, 0x83, 0x19, 0x2f, 0x0e, 0x54, 0x0e, 0x99, 0x65, 0x67, 0x01, 0xad, 0x46, 0xac,
-	0x8f, 0xc1, 0x4a, 0x64, 0xa0, 0x2c, 0xda, 0x98, 0xcc, 0xb0, 0xff, 0x83, 0x54, 0x8f, 0x20, 0xd6,
-	0x55, 0xc3, 0xfc, 0xaf, 0xc9, 0xf0, 0x4d, 0x68, 0xcf, 0xce, 0xc4, 0xa0, 0xb2, 0xb1, 0x4b, 0x06,
-	0x70, 0xc5, 0x63, 0xac, 0x57, 0x61, 0x35, 0xa6, 0x9b, 0xbb, 0x66, 0x6f, 0x32, 0xc1, 0xcb, 0x4d,
-	0x6a, 0x19, 0x9b, 0x4c, 0x29, 0x9b, 0xe8, 0x56, 0xc2, 0x07, 0xf1, 0x0d, 0xaa, 0x51, 0x82, 0xbf,
-	0x22, 0x58, 0x89, 0x6c, 0x69, 0x62, 0x2d, 0xc0, 0x5f, 0x8d, 0xc9, 0xe6, 0x6a, 0x1e, 0xcb, 0x4e,
-	0xef, 0x75, 0x7c, 0xa2, 0xe9, 0xa9, 0x9e, 0xaa, 0x42, 0xdd, 0xd4, 0x9f, 0x05, 0x2d, 0x66, 0xa9,
-	0x93, 0x73, 0x0e, 0x43, 0xfd, 0x0e, 0x19, 0x05, 0xa6, 0xcf, 0x9f, 0x99, 0x37, 0xcf, 0x80, 0x56,
-	0x0d, 0xe6, 0x23, 0x98, 0xbb, 0x4a, 0xcc, 0x3e, 0x3d, 0xd8, 0x3a, 0x20, 0x9d, 0x3b, 0x0c, 0x9d,
-	0x41, 0x90, 0xa8, 0x37, 0x0d, 0xfe, 0xcc, 0x2b, 0x0f, 0x8e, 0x27, 0x6a, 0xd5, 0x0d, 0x83, 0x3f,
-	0xb3, 0x14, 0xd2, 0xb2, 0x29, 0xf1, 0x0e, 0xcd, 0x3e, 0x57, 0xd6, 0x86, 0x11, 0x8e, 0x99, 0x3c,
-	0x78, 0xed, 0x85, 0x27, 0x90, 0x0d, 0x43, 0x0c, 0x98, 0xdc, 0x86, 0x5e, 0x5f, 0x26, 0xd4, 0xec,
-	0x51, 0xff, 0x5b, 0x1d, 0x96, 0xb3, 0x32, 0x9f, 0xc4, 0xdd, 0x14, 0x4a, 0xdd, 0x4d, 0x8d, 0xcf,
-	0x6e, 0xef, 0x83, 0x26, 0xb1, 0xbb, 0xae, 0x63, 0xd9, 0x54, 0xe4, 0x7a, 0x4d, 0x23, 0x9a, 0x60,
-	0x88, 0x1f, 0x38, 0x3e, 0x55, 0x0a, 0xe9, 0xe1, 0x58, 0x29, 0xea, 0x36, 0x62, 0x45, 0xdd, 0x41,
-	0x2c, 0x28, 0x9c, 0xe6, 0x3a, 0x7e, 0xa3, 0x54, 0x72, 0x37, 0xb6, 0xb8, 0xfb, 0x22, 0xcc, 0x1d,
-	0x44, 0x22, 0xe1, 0x65, 0x84, 0x3c, 0x61, 0x8c, 0x22, 0x4e, 0x43, 0x05, 0x14, 0x2f, 0x92, 0xcd,
-	0x26, 0x8b, 0x64, 0xaf, 0xc2, 0x62, 0xd7, 0xa4, 0xe6, 0x16, 0x61, 0x62, 0xdc, 0xb1, 0xf7, 0x1d,
-	0xad, 0xc9, 0x37, 0x7e, 0x62, 0xf2, 0xca, 0x71, 0x6c, 0xb9, 0x91, 0x00, 0x97, 0xaa, 0xc2, 0x41,
-	0xba, 0x0a, 0x57, 0x36, 0x14, 0xde, 0x83, 0xc5, 0x38, 0x12, 0x99, 0x45, 0x4e, 0x16, 0x99, 0x91,
-	0x5e, 0x54, 0xe3, 0x94, 0x23, 0xfc, 0x00, 0x2c, 0x98, 0x87, 0xa6, 0xd5, 0x37, 0xf7, 0xfa, 0xe4,
-	0x65, 0xc7, 0x0e, 0xbc, 0x70, 0x7c, 0x52, 0xbf, 0x0d, 0xab, 0x59, 0x12, 0xbd, 0x4e, 0x46, 0xe5,
-	0xf4, 0x56, 0xa7, 0xb0, 0x6a, 0xc8, 0x52, 0x74, 0x58, 0x03, 0x90, 0x2e, 0xe4, 0x25, 0x66, 0x6d,
-	0x62, 0x4a, 0xda, 0x7c, 0xc9, 0xda, 0x42, 0x08, 0x4e, 0xff, 0x1e, 0x02, 0x2d, 0xbd, 0x6d, 0x35,
-	0x27, 0xf8, 0xbd, 0x2e, 0xe0, 0x5f, 0x82, 0x33, 0x2f, 0xd8, 0xde, 0x11, 0x3c, 0x28, 0x77, 0xb7,
-	0xcf, 0x92, 0xa4, 0x0c, 0xd0, 0xd5, 0xf8, 0xd4, 0x5b, 0x70, 0x32, 0xec, 0x23, 0x38, 0x1e, 0xf4,
-	0xf7, 0x60, 0x49, 0x81, 0x58, 0x0d, 0xd6, 0xbf, 0x41, 0xb0, 0xfc, 0x8c, 0x65, 0x77, 0x03, 0xee,
-	0x84, 0x07, 0xd8, 0x43, 0xb0, 0xd4, 0x71, 0x6c, 0x7f, 0x38, 0x20, 0x5e, 0x3b, 0x41, 0x42, 0xfa,
-	0x45, 0xe1, 0x82, 0xec, 0x59, 0x98, 0x93, 0x15, 0x58, 0x16, 0xe6, 0x06, 0x15, 0x71, 0x65, 0x8a,
-	0x97, 0x7f, 0x59, 0x90, 0xd1, 0x10, 0x47, 0x25, 0x7b, 0xd6, 0x3f, 0x41, 0xb0, 0x92, 0x40, 0xba,
-	0x1a, 0xdd, 0x7d, 0x25, 0xdd, 0xb4, 0x71, 0x6c, 0xf5, 0x3d, 0xfd, 0x23, 0xc4, 0x83, 0xef, 0x9b,
-	0x36, 0x49, 0x6a, 0x7d, 0x3e, 0xde, 0x3f, 0x04, 0x4b, 0xc1, 0x7d, 0x5d, 0x3b, 0xe1, 0x68, 0xd2,
-	0x2f, 0xf0, 0x1a, 0xe0, 0x60, 0x72, 0x27, 0x52, 0x3e, 0x21, 0x9a, 0x8c, 0x37, 0x21, 0xff, 0xeb,
-	0x0a, 0xff, 0xff, 0x24, 0xc2, 0xff, 0x18, 0xe6, 0xd5, 0x08, 0x40, 0xf5, 0x81, 0xb5, 0xe3, 0xf5,
-	0x81, 0xef, 0x8a, 0x52, 0x57, 0x49, 0xc5, 0xcf, 0xc7, 0x7c, 0xac, 0x14, 0xa3, 0x15, 0x66, 0x2e,
-	0xc7, 0xf1, 0xf8, 0x1f, 0xd4, 0x65, 0x1f, 0xfe, 0x4f, 0x64, 0x2b, 0xc1, 0xcb, 0x36, 0x0f, 0xa2,
-	0x8e, 0xc5, 0x0f, 0x2a, 0x11, 0xda, 0x94, 0x1a, 0xa1, 0xe9, 0x03, 0xb8, 0x2f, 0x7b, 0xd3, 0x6a,
-	0x5c, 0xe5, 0xfb, 0xb5, 0xa0, 0xe6, 0x16, 0xec, 0x97, 0xa3, 0xc4, 0x78, 0x2f, 0x1a, 0xfd, 0x58,
-	0xb4, 0x29, 0x2e, 0x2b, 0xda, 0x39, 0x4b, 0x90, 0x59, 0x68, 0x55, 0x59, 0x83, 0xec, 0x27, 0x85,
-	0x5e, 0x69, 0x11, 0xf2, 0x02, 0x2c, 0xdf, 0x36, 0x69, 0xe7, 0x20, 0xe9, 0x2c, 0x1f, 0x80, 0x05,
-	0x9f, 0xf4, 0xf7, 0x93, 0xb6, 0x1a, 0x9f, 0xd4, 0xef, 0xd6, 0x60, 0x25, 0xb1, 0xbc, 0x1a, 0x33,
-	0x3b, 0x0d, 0xd3, 0x66, 0x87, 0x2a, 0x71, 0xa6, 0x18, 0xe1, 0x6b, 0x82, 0xb1, 0xa2, 0x00, 0x78,
-	0xae, 0x90, 0xe1, 0x5d, 0x27, 0x23, 0x21, 0x12, 0xd5, 0x2b, 0xd6, 0x8f, 0xd7, 0x2b, 0x3e, 0x0b,
-	0x27, 0xb7, 0x09, 0x95, 0xcd, 0xaa, 0x13, 0x69, 0xb6, 0x7a, 0xaf, 0x58, 0x8b, 0xdf, 0x2b, 0xea,
-	0xdf, 0x10, 0xd7, 0x29, 0x12, 0x5a, 0x65, 0x0c, 0x97, 0x8d, 0xb0, 0xb5, 0x58, 0x23, 0xec, 0x4d,
-	0x38, 0x25, 0xf3, 0xe9, 0x63, 0x22, 0x86, 0x84, 0xf7, 0x59, 0x55, 0xd2, 0xa3, 0xbf, 0x85, 0xe0,
-	0x94, 0xda, 0xc1, 0x5b, 0x1a, 0xf1, 0xa3, 0x5a, 0x85, 0xc7, 0xdc, 0xfa, 0x92, 0x78, 0x77, 0x74,
-	0x85, 0xa4, 0x9e, 0x11, 0x17, 0x95, 0x61, 0xff, 0x91, 0x15, 0x1d, 0xc4, 0x5d, 0x98, 0xef, 0x2a,
-	0xd3, 0xb2, 0x9b, 0xf8, 0xe9, 0x1c, 0x9a, 0xee, 0x45, 0xaa, 0x1e, 0x35, 0x38, 0x19, 0x31, 0xa8,
-	0xfa, 0xb7, 0x10, 0x2c, 0xc4, 0xba, 0x9f, 0xa2, 0x58, 0x16, 0x8d, 0x89, 0x65, 0x6b, 0x63, 0x9b,
-	0x0b, 0xa6, 0xc6, 0xb6, 0xe3, 0xd5, 0xd3, 0x2d, 0x02, 0x9f, 0x20, 0x96, 0x60, 0x66, 0xe2, 0x8b,
-	0x0d, 0x98, 0x0d, 0xe2, 0x0e, 0xc9, 0xf4, 0xa2, 0x7d, 0x5d, 0x21, 0x9c, 0x78, 0xb3, 0x58, 0xed,
-	0x98, 0x9a, 0xc5, 0x58, 0xbe, 0x95, 0x25, 0xce, 0x2a, 0x2f, 0xa5, 0xb2, 0x14, 0x67, 0x7c, 0xed,
-	0xfa, 0x8f, 0x08, 0x5a, 0xdb, 0x84, 0x6e, 0x39, 0xf6, 0x67, 0x80, 0x25, 0x6e, 0xa7, 0x19, 0x5d,
-	0xf0, 0xaa, 0x53, 0xe1, 0xb3, 0x24, 0xe1, 0x96, 0xe7, 0x7c, 0x46, 0x24, 0x04, 0x7a, 0x53, 0x96,
-	0x84, 0x10, 0x8e, 0xfe, 0xf7, 0x06, 0x2c, 0xc4, 0x7a, 0x76, 0xf1, 0x4b, 0x30, 0x3f, 0x50, 0x7e,
-	0x5c, 0xae, 0xab, 0x24, 0x06, 0xaa, 0xd2, 0xd0, 0x17, 0x3f, 0x0f, 0x73, 0xd2, 0xd3, 0xda, 0xfb,
-	0x4e, 0x10, 0xba, 0xe5, 0xfe, 0xbf, 0x10, 0x15, 0x46, 0x74, 0x99, 0x59, 0x2f, 0x7d, 0x99, 0x19,
-	0x57, 0xc0, 0xc6, 0xf1, 0x28, 0x60, 0x5c, 0x25, 0xa6, 0x8f, 0x47, 0x25, 0xf0, 0xae, 0x4c, 0x8e,
-	0x66, 0x72, 0xfa, 0xf9, 0x98, 0x1a, 0xa5, 0x5a, 0x74, 0xd6, 0x61, 0x59, 0xd5, 0x85, 0x17, 0x85,
-	0x4b, 0xf6, 0xb5, 0x59, 0x9e, 0x82, 0x65, 0xbe, 0x2b, 0x7e, 0xf5, 0xf0, 0x31, 0x02, 0x2d, 0xba,
-	0x79, 0x92, 0xcd, 0xe8, 0x15, 0x99, 0xe5, 0xad, 0x64, 0x47, 0x48, 0xd1, 0x66, 0xf9, 0xb0, 0x25,
-	0xe4, 0x1a, 0xe0, 0xcb, 0xa4, 0x9f, 0x68, 0x09, 0x61, 0x99, 0x4b, 0xe8, 0x3c, 0x83, 0x7f, 0x2f,
-	0x50, 0x66, 0x8e, 0x68, 0xd8, 0x31, 0xe2, 0xb0, 0x7c, 0x97, 0x17, 0x66, 0xe3, 0xff, 0x5f, 0x82,
-	0x92, 0xff, 0x5f, 0x72, 0x8f, 0x5a, 0xe9, 0xef, 0x11, 0x0f, 0xe9, 0xaa, 0x6e, 0x4e, 0xb9, 0x9d,
-	0x6a, 0x4e, 0x79, 0x32, 0xc7, 0xd1, 0x98, 0xa4, 0x59, 0x69, 0x51, 0x59, 0x87, 0xc5, 0x6d, 0x42,
-	0x37, 0xdc, 0x28, 0x67, 0x4c, 0x04, 0x06, 0x28, 0x1d, 0x18, 0xbc, 0x09, 0x27, 0xc2, 0x35, 0xd5,
-	0x25, 0x2c, 0x2c, 0xc2, 0x09, 0x6e, 0xa3, 0xe4, 0x68, 0xfd, 0xe7, 0x67, 0xc2, 0x56, 0xd4, 0x2d,
-	0xea, 0xf5, 0xf1, 0x3b, 0x08, 0x1a, 0xe4, 0x4d, 0xcb, 0xa7, 0xf8, 0x42, 0x9e, 0x5b, 0xd8, 0x64,
-	0x3f, 0x67, 0xeb, 0x62, 0xc1, 0xd5, 0x12, 0xdd, 0xef, 0x20, 0x98, 0xee, 0xf0, 0x20, 0x03, 0x5f,
-	0x2c, 0xd5, 0xcc, 0xd7, 0x7a, 0xaa, 0xe8, 0x72, 0x05, 0x93, 0x2e, 0x4f, 0x08, 0x72, 0x60, 0x92,
-	0xd5, 0x11, 0x97, 0x03, 0x93, 0xec, 0x26, 0xb8, 0xb7, 0x10, 0x4c, 0xf7, 0x78, 0x3d, 0x0e, 0x9f,
-	0x2f, 0x70, 0x43, 0x1e, 0xa0, 0xf1, 0x64, 0xa1, 0xb5, 0x12, 0x87, 0xef, 0x22, 0x98, 0xeb, 0x45,
-	0x9d, 0x63, 0xb8, 0x08, 0xb0, 0xc0, 0x2e, 0x5a, 0x17, 0x8a, 0x2d, 0x96, 0xa8, 0x7c, 0x88, 0xe0,
-	0xe4, 0x90, 0x17, 0x26, 0xa2, 0xea, 0x06, 0xde, 0x2c, 0xdf, 0xcf, 0xd5, 0xda, 0x2a, 0x05, 0x43,
-	0x62, 0xf7, 0x03, 0x04, 0x33, 0x66, 0xb7, 0xcb, 0x8b, 0xdb, 0x97, 0x0a, 0xdc, 0x99, 0xab, 0x4d,
-	0x26, 0xad, 0xa7, 0x8b, 0x03, 0x50, 0xd0, 0xe9, 0x11, 0x9a, 0x13, 0x9d, 0xec, 0x76, 0xb0, 0x1c,
-	0xe8, 0x1c, 0xd5, 0x16, 0xf6, 0x13, 0x04, 0x20, 0x64, 0xc7, 0x31, 0xda, 0x28, 0xc6, 0x71, 0xa5,
-	0x61, 0xab, 0xb5, 0x59, 0x06, 0x84, 0xc4, 0xea, 0x67, 0x08, 0x40, 0x98, 0x3a, 0xc7, 0x6a, 0xb3,
-	0xa0, 0xbd, 0xaa, 0xac, 0xda, 0x2a, 0x05, 0x43, 0xe2, 0xf5, 0x7d, 0xa1, 0x4b, 0x2c, 0x58, 0xc1,
-	0x4f, 0x95, 0xeb, 0xbf, 0x68, 0x5d, 0x2a, 0xbc, 0x5e, 0x41, 0xa6, 0x47, 0x68, 0x4e, 0x64, 0x32,
-	0xdb, 0x8f, 0x5a, 0x97, 0x4a, 0x36, 0xfa, 0xe0, 0x1f, 0x23, 0x68, 0x0a, 0x3d, 0xda, 0x35, 0x7b,
-	0xf8, 0xe9, 0x62, 0x3a, 0x10, 0x35, 0xf5, 0xb4, 0x36, 0x4a, 0x40, 0x50, 0x54, 0x5b, 0x28, 0x11,
-	0x67, 0xd1, 0x46, 0x31, 0x05, 0x50, 0xb9, 0xb4, 0x59, 0x06, 0x84, 0xc4, 0xea, 0xdb, 0x08, 0x16,
-	0x7a, 0x41, 0x8d, 0x8e, 0x07, 0x69, 0x5f, 0xce, 0xc5, 0x7b, 0xb5, 0x46, 0xd5, 0x3a, 0x5f, 0x64,
-	0xa9, 0x44, 0xe4, 0x3d, 0x04, 0xf3, 0x5d, 0xa5, 0xbe, 0x96, 0x23, 0xcc, 0xc8, 0xa8, 0xf3, 0xb5,
-	0x2e, 0x16, 0x5c, 0xad, 0x60, 0x33, 0x50, 0x4a, 0x60, 0x39, 0xb0, 0xc9, 0x28, 0xde, 0xe5, 0xc0,
-	0x26, 0xb3, 0xee, 0xf6, 0x3e, 0x82, 0x05, 0x15, 0x1b, 0x1f, 0x17, 0x03, 0xe8, 0xe7, 0x8f, 0x38,
-	0xb2, 0x3f, 0x26, 0xf0, 0x2b, 0x04, 0x7a, 0x27, 0x55, 0xea, 0x79, 0xc6, 0xf1, 0xd4, 0xe4, 0x2e,
-	0xcf, 0xa1, 0x7b, 0x64, 0x19, 0x30, 0x87, 0xa3, 0x1c, 0x53, 0x7b, 0xfa, 0x05, 0x82, 0xd5, 0x1e,
-	0xaf, 0x98, 0xf0, 0x0c, 0x56, 0xfd, 0x4d, 0xbe, 0x53, 0xaf, 0x1c, 0x86, 0x63, 0x8a, 0x36, 0x12,
-	0xc3, 0x2d, 0x99, 0x0e, 0x7f, 0x8e, 0x18, 0x1e, 0x55, 0x19, 0x7b, 0x0f, 0xc1, 0x62, 0x57, 0xf5,
-	0x23, 0x79, 0x82, 0xbc, 0x74, 0x62, 0xd9, 0xba, 0x50, 0x6c, 0xb1, 0xc0, 0x66, 0xfd, 0xd3, 0x39,
-	0x38, 0x95, 0xa8, 0xca, 0xf0, 0x34, 0xe5, 0x47, 0x88, 0xa5, 0x47, 0xa2, 0xe5, 0x23, 0x87, 0xdf,
-	0x3f, 0xa2, 0x09, 0x27, 0x87, 0xdf, 0x3f, 0xb2, 0x9f, 0x86, 0x05, 0x0f, 0xc3, 0xb0, 0x0d, 0x25,
-	0x4f, 0x20, 0x7a, 0x54, 0x5b, 0x4c, 0x9e, 0x40, 0xf4, 0xe8, 0xfe, 0x97, 0xb7, 0x11, 0x34, 0x0f,
-	0x82, 0xfe, 0x92, 0x1c, 0x5e, 0x3f, 0xd9, 0xe5, 0x92, 0xc3, 0xeb, 0xa7, 0xdb, 0x59, 0xde, 0x45,
-	0x50, 0xdf, 0xb7, 0xec, 0x6e, 0x0e, 0x87, 0x96, 0xd5, 0xae, 0x92, 0xc3, 0xa1, 0x65, 0x37, 0x8e,
-	0x30, 0x7f, 0xdf, 0x53, 0x6e, 0xe1, 0xf3, 0x25, 0xb9, 0x29, 0x74, 0x2e, 0x16, 0x5c, 0x2d, 0xb1,
-	0xf9, 0x00, 0xc1, 0x62, 0x2f, 0xd6, 0x60, 0x91, 0x2f, 0xa2, 0x4a, 0xf7, 0x94, 0xe4, 0x8b, 0xa8,
-	0xb2, 0x3a, 0x3b, 0x3e, 0x44, 0x30, 0x2f, 0x22, 0x2a, 0x71, 0xcd, 0x8e, 0x2f, 0x17, 0xbc, 0x9e,
-	0x8e, 0xb5, 0x06, 0xb4, 0xae, 0x94, 0x84, 0x22, 0xb1, 0xbb, 0x8b, 0x40, 0x1b, 0xa6, 0x2e, 0xa3,
-	0x65, 0xee, 0xb7, 0x75, 0x0c, 0x17, 0xe9, 0xad, 0xcb, 0xe5, 0x80, 0x44, 0x69, 0x72, 0xe3, 0x0d,
-	0x93, 0x76, 0x0e, 0x72, 0x28, 0x7c, 0xd6, 0xb5, 0x77, 0x0e, 0x85, 0xcf, 0xbc, 0xf6, 0x7e, 0x18,
-	0x71, 0x95, 0x3f, 0x50, 0xbe, 0x7c, 0x83, 0x8b, 0x7d, 0xa8, 0x27, 0xbf, 0xca, 0x67, 0x7d, 0x6e,
-	0x67, 0xfd, 0xcf, 0x53, 0xb0, 0xb4, 0xed, 0x1c, 0x12, 0xcf, 0x56, 0x8b, 0x4e, 0x1f, 0x20, 0x38,
-	0xd9, 0x4b, 0x14, 0x54, 0x4b, 0xd5, 0x38, 0x36, 0x0a, 0xac, 0x4d, 0xd4, 0x71, 0x7f, 0x8a, 0xe0,
-	0x44, 0x2f, 0xfe, 0x69, 0x94, 0x42, 0x99, 0xb3, 0xfa, 0x05, 0x97, 0x42, 0x99, 0x73, 0xfc, 0xab,
-	0x2c, 0xef, 0x08, 0xb4, 0x36, 0x5c, 0xb7, 0x6f, 0x75, 0x4c, 0xf1, 0xf5, 0x97, 0x27, 0xf2, 0x40,
-	0x55, 0x0a, 0x93, 0xad, 0x73, 0xf9, 0x17, 0x0a, 0x34, 0x36, 0x1f, 0x86, 0x49, 0xbf, 0xc1, 0xf5,
-	0x72, 0x83, 0x7f, 0xb3, 0x6b, 0x6f, 0x9a, 0xff, 0x79, 0xf4, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff,
-	0x47, 0xcc, 0x18, 0xae, 0xcc, 0x4b, 0x00, 0x00,
+	// 3314 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xd4, 0x1c, 0x4d, 0x6f, 0x24, 0x47,
+	0x55, 0x35, 0x9e, 0xb1, 0x3d, 0xcf, 0x6b, 0xef, 0xba, 0xd6, 0x5e, 0xf7, 0x0e, 0x21, 0xac, 0x5a,
+	0x91, 0xc8, 0x21, 0x32, 0x89, 0x43, 0x92, 0x65, 0x3f, 0xb2, 0xb1, 0xbd, 0x1b, 0xaf, 0x77, 0xb3,
+	0xd9, 0x4d, 0x8f, 0x93, 0x25, 0x09, 0x10, 0xb5, 0x67, 0xca, 0xe3, 0xce, 0xce, 0x74, 0x77, 0xba,
+	0x6b, 0x9c, 0x0c, 0x42, 0x42, 0x09, 0x09, 0x5f, 0x81, 0x40, 0x04, 0x9c, 0x72, 0xe0, 0x00, 0x39,
+	0x72, 0x00, 0x21, 0x45, 0x28, 0x22, 0x42, 0x44, 0x5c, 0x10, 0x11, 0x07, 0x0e, 0x9c, 0xf8, 0x07,
+	0xdc, 0xf8, 0x01, 0xa0, 0xfa, 0xe8, 0xee, 0xea, 0x0f, 0xcf, 0x4e, 0x77, 0xbb, 0x13, 0x71, 0x72,
+	0x57, 0xf5, 0xd4, 0xab, 0xf7, 0x5d, 0xef, 0xbd, 0x7a, 0x6e, 0x58, 0xf0, 0x89, 0x77, 0x60, 0x75,
+	0x88, 0xbf, 0xea, 0x7a, 0x0e, 0x75, 0xf0, 0x17, 0x3b, 0xce, 0x60, 0x75, 0x7f, 0x68, 0xbe, 0x4a,
+	0xac, 0x55, 0xd7, 0x34, 0xfd, 0xd5, 0x8e, 0x4f, 0x56, 0xe5, 0x6f, 0x3c, 0xd2, 0xb3, 0x7c, 0xea,
+	0x8d, 0x56, 0x4d, 0xd7, 0xd2, 0xbf, 0x0d, 0x4b, 0x37, 0x9c, 0xae, 0xb5, 0x37, 0x6a, 0x77, 0xf6,
+	0xc9, 0xc0, 0xf4, 0x0d, 0xf2, 0xca, 0x90, 0xf8, 0x14, 0xdf, 0x03, 0x4d, 0xf9, 0xf3, 0xed, 0xae,
+	0x86, 0xce, 0xa0, 0xfb, 0x9b, 0x46, 0x34, 0x81, 0xb7, 0x61, 0xc6, 0x17, 0xbf, 0xd7, 0x6a, 0x67,
+	0xa6, 0xee, 0x9f, 0x5b, 0xfb, 0xd2, 0xea, 0x84, 0x1b, 0xae, 0x8a, 0x7d, 0x8c, 0x60, 0xbd, 0xfe,
+	0x1c, 0x4c, 0x8b, 0x29, 0xdc, 0x82, 0x59, 0x31, 0x19, 0xee, 0x18, 0x8e, 0xb1, 0x06, 0x33, 0xfe,
+	0x70, 0x30, 0x30, 0xbd, 0x91, 0x56, 0xe3, 0xaf, 0x82, 0x21, 0x3e, 0x05, 0xd3, 0xe2, 0x57, 0xda,
+	0x14, 0x7f, 0x21, 0x47, 0xfa, 0x1e, 0x2c, 0x27, 0x08, 0xf3, 0x5d, 0xc7, 0xf6, 0x09, 0xbe, 0x01,
+	0xb3, 0x9e, 0x7c, 0xe6, 0xdb, 0xcc, 0xad, 0x3d, 0x34, 0x31, 0xf2, 0x01, 0x10, 0x23, 0x04, 0xa1,
+	0xbf, 0x02, 0x27, 0xaf, 0x12, 0xd3, 0xa3, 0xbb, 0xc4, 0xa4, 0x6d, 0x42, 0x03, 0xfe, 0xbd, 0x00,
+	0x4d, 0xcb, 0xf6, 0xa9, 0x69, 0x77, 0x88, 0xaf, 0x21, 0xce, 0xa3, 0x0b, 0x13, 0x6f, 0xa3, 0x02,
+	0xbc, 0xd2, 0x27, 0x03, 0x62, 0x53, 0x23, 0x02, 0xa7, 0xb7, 0xe3, 0x5b, 0xca, 0x5f, 0xdc, 0x45,
+	0x64, 0xf7, 0x02, 0x04, 0x10, 0xb6, 0xbb, 0x92, 0x89, 0xca, 0x8c, 0xfe, 0x21, 0x82, 0xa5, 0x38,
+	0x21, 0x95, 0xf0, 0x0b, 0xef, 0xa8, 0x8c, 0x11, 0xca, 0xf3, 0xe8, 0xc4, 0xf0, 0xb6, 0xe5, 0xca,
+	0xab, 0xbb, 0x86, 0x1f, 0x63, 0xc9, 0x00, 0xe6, 0x63, 0xef, 0xca, 0x31, 0x83, 0xbd, 0x27, 0x9e,
+	0x77, 0x83, 0xf8, 0xbe, 0xd9, 0x23, 0x52, 0xb1, 0x94, 0x19, 0x7d, 0x13, 0x9a, 0x6d, 0xda, 0x16,
+	0xe0, 0xf0, 0x12, 0x34, 0x3a, 0xce, 0xd0, 0xa6, 0x7c, 0x9b, 0x29, 0x43, 0x0c, 0xf0, 0x19, 0x98,
+	0x73, 0xec, 0xbe, 0x65, 0x93, 0x4d, 0xfe, 0xae, 0xc6, 0xdf, 0xa9, 0x53, 0xba, 0x0e, 0xd0, 0xa6,
+	0x01, 0xd6, 0xd9, 0x50, 0xf4, 0xcf, 0x43, 0xa3, 0x4d, 0xd7, 0x5d, 0xf7, 0x90, 0xd7, 0xff, 0x41,
+	0x0c, 0x86, 0x49, 0x2d, 0x9f, 0x5a, 0x1d, 0x1f, 0x3f, 0x0d, 0xb3, 0x81, 0x1f, 0x90, 0xa2, 0x5a,
+	0x9b, 0xdc, 0x2e, 0x03, 0x7a, 0x8c, 0x10, 0x06, 0x7e, 0x26, 0x2e, 0x2b, 0x06, 0xf0, 0xe1, 0x1c,
+	0x00, 0x03, 0xda, 0x14, 0x41, 0xe1, 0x0d, 0xa8, 0x9b, 0xae, 0xeb, 0x73, 0x9e, 0xce, 0xad, 0xad,
+	0xe6, 0x80, 0xb6, 0xee, 0xba, 0x06, 0x5f, 0xab, 0xbf, 0x0c, 0xa7, 0xb6, 0x48, 0x80, 0xae, 0xbf,
+	0x6d, 0xef, 0x39, 0x81, 0xd5, 0x69, 0x30, 0xe3, 0xb8, 0xd4, 0x72, 0x6c, 0x61, 0x73, 0x4d, 0x23,
+	0x18, 0x32, 0xfe, 0x99, 0xae, 0x1b, 0x0a, 0x5b, 0x0c, 0x98, 0x90, 0xe4, 0x66, 0x4f, 0x9b, 0x83,
+	0x40, 0xd0, 0xea, 0x94, 0xfe, 0xab, 0x1a, 0xac, 0xa4, 0x36, 0xab, 0xc6, 0x32, 0xba, 0xb0, 0x68,
+	0xf6, 0xfb, 0xc1, 0x4e, 0x97, 0x09, 0x35, 0xad, 0x7e, 0x6e, 0x0b, 0x91, 0xcb, 0xc5, 0x6a, 0x23,
+	0x0d, 0x10, 0xb7, 0x01, 0xfc, 0x50, 0x63, 0xa4, 0x18, 0xf2, 0x08, 0x35, 0x58, 0x6a, 0x28, 0x60,
+	0xf4, 0x4f, 0x10, 0x1c, 0xbf, 0x61, 0x75, 0x3c, 0x47, 0x6e, 0x76, 0x9d, 0x70, 0xc7, 0x4c, 0x89,
+	0x6d, 0x4a, 0x95, 0x6d, 0x1a, 0x72, 0xc4, 0x64, 0xe4, 0x7a, 0xce, 0xcb, 0xa4, 0x43, 0x03, 0x57,
+	0x2e, 0x87, 0x91, 0x8c, 0xa6, 0xc6, 0xc8, 0xa8, 0x9e, 0x92, 0x11, 0x83, 0x78, 0x40, 0x3c, 0xdf,
+	0x72, 0x6c, 0xad, 0x21, 0x20, 0xca, 0x21, 0x5b, 0x4b, 0xec, 0x03, 0xcb, 0x73, 0x6c, 0xe6, 0x21,
+	0xb5, 0x69, 0xb1, 0x56, 0x99, 0xe2, 0x7b, 0xf6, 0x2d, 0xd3, 0xd7, 0x66, 0xe4, 0x9e, 0x6c, 0xa0,
+	0xff, 0x75, 0x06, 0x8e, 0xa9, 0xf4, 0xdc, 0xc5, 0x9d, 0x14, 0x54, 0x2e, 0x15, 0xf1, 0x7a, 0x0a,
+	0xf1, 0x2e, 0xf1, 0x3b, 0x9e, 0xc5, 0xd5, 0x57, 0x92, 0xa5, 0x4e, 0xb1, 0x3d, 0xfb, 0xe4, 0x80,
+	0xf4, 0x25, 0x51, 0x62, 0xc0, 0xcf, 0x49, 0x79, 0x30, 0xcf, 0x08, 0x03, 0x90, 0x43, 0x7c, 0x0d,
+	0x1a, 0xae, 0x49, 0xf7, 0x7d, 0x0d, 0xb8, 0x46, 0x7d, 0x39, 0xaf, 0x46, 0xdd, 0x32, 0xe9, 0xbe,
+	0x21, 0x40, 0xf0, 0x33, 0x97, 0x9a, 0x74, 0xe8, 0x6b, 0xb3, 0xf2, 0xcc, 0xe5, 0x23, 0x4c, 0x00,
+	0x5c, 0xcf, 0x71, 0x89, 0x47, 0x2d, 0xe2, 0x6b, 0x4d, 0xbe, 0xd1, 0x95, 0x89, 0x37, 0x52, 0x19,
+	0xbe, 0x7a, 0x2b, 0x84, 0x73, 0xc5, 0xa6, 0xde, 0xc8, 0x50, 0x00, 0x33, 0x61, 0x50, 0x6b, 0x40,
+	0x7c, 0x6a, 0x0e, 0x5c, 0x6d, 0x4e, 0x08, 0x23, 0x9c, 0x60, 0x07, 0x8c, 0xeb, 0x39, 0x07, 0x56,
+	0x97, 0x78, 0xbe, 0x76, 0x2c, 0xa7, 0xf9, 0x5c, 0x26, 0x2e, 0xb1, 0xbb, 0xc4, 0xee, 0x8c, 0xae,
+	0x93, 0x91, 0x11, 0x01, 0x8a, 0xf4, 0x64, 0x5e, 0xd1, 0x13, 0x46, 0xf0, 0x53, 0x1b, 0x6d, 0xea,
+	0x99, 0x94, 0xf4, 0x46, 0xda, 0x42, 0x19, 0x82, 0x23, 0x38, 0x92, 0xe0, 0x68, 0x02, 0xeb, 0x70,
+	0x6c, 0xe0, 0x74, 0x77, 0x42, 0x9a, 0x8f, 0x73, 0x1c, 0x62, 0x73, 0x49, 0x55, 0x3f, 0x91, 0x56,
+	0xf5, 0x7b, 0x01, 0xc4, 0xf6, 0xc4, 0xdb, 0x18, 0x69, 0x8b, 0xe2, 0x50, 0x8b, 0x66, 0xf0, 0x57,
+	0xa1, 0xb9, 0xe7, 0x99, 0x03, 0xf2, 0xaa, 0xe3, 0xdd, 0xd1, 0x30, 0x77, 0x0c, 0xe7, 0x26, 0xa6,
+	0xe5, 0x49, 0xb6, 0xf2, 0xb6, 0xe3, 0xdd, 0x91, 0x82, 0x1b, 0x19, 0x11, 0xb0, 0xd6, 0x45, 0x38,
+	0x9e, 0x90, 0x27, 0x3e, 0x01, 0x53, 0x77, 0xc8, 0x48, 0x9a, 0x12, 0x7b, 0x64, 0x1c, 0x3e, 0x30,
+	0xfb, 0x43, 0x12, 0x18, 0x11, 0x1f, 0x9c, 0xab, 0x9d, 0x45, 0x6c, 0x79, 0x82, 0x3b, 0x79, 0x96,
+	0xeb, 0xeb, 0xb0, 0x98, 0xc2, 0x0e, 0x63, 0xa8, 0xdb, 0xcc, 0x2a, 0x05, 0x04, 0xfe, 0xac, 0x9a,
+	0x63, 0x2d, 0x66, 0x8e, 0xfa, 0xbf, 0x10, 0xcc, 0x05, 0xc7, 0xe3, 0xb0, 0x4f, 0x98, 0x01, 0x78,
+	0xc3, 0x7e, 0xe4, 0x0b, 0xe4, 0x88, 0x85, 0xb0, 0xec, 0x69, 0x67, 0xe4, 0x06, 0x78, 0x84, 0x63,
+	0xa6, 0xb5, 0x26, 0xa5, 0x9e, 0xb5, 0x3b, 0xa4, 0x81, 0x33, 0x88, 0x26, 0xb8, 0x57, 0x34, 0x29,
+	0x25, 0x5e, 0xe8, 0x0a, 0xe4, 0x70, 0x02, 0x57, 0x10, 0xb3, 0x87, 0xe9, 0xa4, 0x3d, 0x24, 0x95,
+	0x67, 0x26, 0xad, 0x3c, 0xfa, 0x3b, 0x08, 0x4e, 0xad, 0x77, 0xbb, 0x37, 0xbd, 0x67, 0xdd, 0xae,
+	0x49, 0x89, 0x4a, 0xaa, 0x4a, 0x12, 0x1a, 0x47, 0x52, 0x6d, 0x0c, 0x49, 0x53, 0x63, 0x49, 0xaa,
+	0xa7, 0x48, 0xd2, 0x3f, 0x8a, 0x18, 0xce, 0x1c, 0x0f, 0x13, 0x17, 0x73, 0x3d, 0x81, 0xb8, 0xd8,
+	0x33, 0xfe, 0x06, 0xcc, 0x4a, 0xa7, 0x30, 0x92, 0xc7, 0xe4, 0x46, 0x11, 0xa7, 0x16, 0xb8, 0x1a,
+	0x69, 0x77, 0x21, 0xcc, 0xd6, 0x79, 0x98, 0x8f, 0xbd, 0xca, 0xa5, 0x74, 0x67, 0x61, 0x36, 0x8c,
+	0x13, 0x30, 0xd4, 0x3b, 0x4e, 0x57, 0xb0, 0xaf, 0x61, 0xf0, 0x67, 0xc6, 0x9c, 0x81, 0x0c, 0x2f,
+	0xa5, 0xae, 0xc9, 0xa1, 0xfe, 0x4f, 0x04, 0x27, 0xb7, 0x08, 0xbd, 0xf2, 0x1a, 0xb3, 0x4b, 0x16,
+	0x3d, 0xc9, 0xd8, 0x06, 0x43, 0x9d, 0x46, 0x42, 0xe0, 0xcf, 0x15, 0x1c, 0x3c, 0xb1, 0x83, 0xae,
+	0x91, 0x3c, 0xe8, 0xd4, 0x14, 0x6d, 0x3a, 0x91, 0xa2, 0x25, 0x1c, 0xd0, 0x4c, 0xca, 0x01, 0xe9,
+	0x7f, 0x40, 0xb0, 0x14, 0xa7, 0xac, 0x9a, 0x40, 0x2a, 0x46, 0x43, 0x6d, 0x1c, 0x0d, 0x53, 0x87,
+	0xa7, 0x99, 0xf5, 0x58, 0x9a, 0xa9, 0xff, 0x76, 0x0a, 0x96, 0x36, 0x3d, 0xa2, 0x18, 0x87, 0x14,
+	0xcb, 0x4d, 0x98, 0x91, 0xb0, 0x25, 0xea, 0x8f, 0x14, 0xf2, 0xff, 0x46, 0x00, 0x05, 0x3f, 0x0b,
+	0x0d, 0x66, 0x60, 0x41, 0x72, 0x74, 0x69, 0x62, 0x70, 0xd9, 0x06, 0x6c, 0x08, 0x68, 0xf8, 0x45,
+	0xa8, 0x53, 0xb3, 0xc7, 0x22, 0x3e, 0x06, 0x75, 0x6b, 0x62, 0xa8, 0x59, 0x44, 0xaf, 0xee, 0x98,
+	0x3d, 0x79, 0x2e, 0x73, 0xa0, 0xf8, 0x45, 0x35, 0x51, 0xa8, 0xf3, 0x1d, 0x2e, 0x16, 0x62, 0x43,
+	0x46, 0xca, 0xd0, 0x7a, 0x0c, 0x9a, 0xe1, 0x7e, 0xb9, 0x6c, 0xf0, 0x4d, 0x04, 0xcb, 0x09, 0xf4,
+	0x3f, 0x03, 0x85, 0xd3, 0xaf, 0xc1, 0xd2, 0x65, 0xd2, 0x27, 0x29, 0xcd, 0xb9, 0x6b, 0x4c, 0xb9,
+	0xe7, 0x78, 0x1d, 0x41, 0xd6, 0xac, 0x21, 0x06, 0xfa, 0x1e, 0x2c, 0x27, 0x60, 0x55, 0x53, 0xd5,
+	0x78, 0x08, 0x16, 0xa3, 0xac, 0x67, 0x22, 0x84, 0xf5, 0xdf, 0x23, 0xc0, 0xea, 0x9a, 0x6a, 0x58,
+	0xad, 0x98, 0x5b, 0xed, 0x28, 0xcc, 0x4d, 0x5f, 0x52, 0xb1, 0x0e, 0xca, 0x5f, 0xfa, 0x07, 0xc2,
+	0x09, 0x47, 0xd3, 0xd5, 0x50, 0xf3, 0x8c, 0x92, 0xb0, 0x0b, 0x73, 0x2f, 0x48, 0x4e, 0x08, 0x46,
+	0xff, 0x37, 0x82, 0xd3, 0x31, 0x27, 0xc0, 0xce, 0xb0, 0x09, 0xcb, 0x7a, 0x5e, 0x2c, 0x7e, 0x17,
+	0x08, 0x19, 0x13, 0x23, 0x74, 0xe8, 0xae, 0xe3, 0x82, 0xf9, 0x92, 0xb1, 0xa1, 0x7e, 0x07, 0x5a,
+	0x59, 0xfb, 0x56, 0x63, 0x15, 0x8f, 0xaa, 0x85, 0x07, 0xe6, 0x5c, 0xfd, 0x89, 0x4d, 0x63, 0x25,
+	0xb5, 0xb0, 0x1a, 0x8d, 0xba, 0x16, 0x3f, 0x3d, 0x72, 0xa7, 0x79, 0xca, 0x91, 0xa1, 0xbf, 0x8f,
+	0x40, 0x4b, 0x9f, 0x27, 0x13, 0x69, 0x52, 0x14, 0x20, 0xd7, 0x62, 0x01, 0x72, 0x1b, 0xea, 0xec,
+	0x49, 0xd6, 0x1d, 0x4a, 0x9f, 0x6d, 0x1c, 0x98, 0xfe, 0x72, 0x42, 0xe3, 0x05, 0x9a, 0xd5, 0xa8,
+	0xc0, 0x8f, 0x45, 0xa4, 0x9c, 0x5b, 0x07, 0x2a, 0x3a, 0xd6, 0xf5, 0x37, 0x10, 0xac, 0xa4, 0xf0,
+	0xa9, 0x46, 0xb5, 0x34, 0x98, 0x31, 0xb8, 0x14, 0x05, 0x0d, 0x4d, 0x23, 0x18, 0xea, 0x6d, 0x38,
+	0x1d, 0x3f, 0x95, 0x26, 0x67, 0x8b, 0x06, 0x33, 0x5e, 0x1c, 0xa8, 0x1c, 0x32, 0xcb, 0xce, 0x02,
+	0x5a, 0x8d, 0x58, 0x1f, 0x81, 0xe5, 0xc8, 0x40, 0x59, 0xb4, 0x31, 0x99, 0x61, 0xff, 0x17, 0xa9,
+	0x1e, 0x41, 0xac, 0xab, 0x86, 0xf9, 0x5f, 0x97, 0xe1, 0x9b, 0xd0, 0x9e, 0xed, 0x89, 0x41, 0x65,
+	0x63, 0x97, 0x0c, 0xe0, 0x8a, 0xc7, 0x58, 0x2f, 0xc1, 0x4a, 0x4c, 0x37, 0x77, 0xcc, 0xde, 0x64,
+	0x82, 0x97, 0x9b, 0xd4, 0x32, 0x36, 0x99, 0x52, 0x36, 0xd1, 0xad, 0x84, 0x0f, 0xe2, 0x1b, 0x54,
+	0xa3, 0x04, 0x7f, 0x43, 0xb0, 0x1c, 0xd9, 0xd2, 0xc4, 0x5a, 0x80, 0xbf, 0x16, 0x93, 0xcd, 0xd5,
+	0x3c, 0x96, 0x9d, 0xde, 0xeb, 0xe8, 0x44, 0xd3, 0x53, 0x3d, 0x55, 0x85, 0xba, 0xa9, 0x3f, 0x05,
+	0x5a, 0xcc, 0x52, 0x27, 0xe7, 0x1c, 0x86, 0xfa, 0x1d, 0x32, 0x0a, 0x4c, 0x9f, 0x3f, 0x33, 0x6f,
+	0x9e, 0x01, 0xad, 0x1a, 0xcc, 0x47, 0x30, 0x77, 0x95, 0x98, 0x7d, 0xba, 0xbf, 0xb9, 0x4f, 0x3a,
+	0x77, 0x18, 0x3a, 0x83, 0x20, 0x51, 0x6f, 0x1a, 0xfc, 0x99, 0x57, 0x1e, 0x1c, 0x4f, 0xd4, 0xaa,
+	0x1b, 0x06, 0x7f, 0x66, 0x29, 0xa4, 0x65, 0x53, 0xe2, 0x1d, 0x98, 0x7d, 0xae, 0xac, 0x0d, 0x23,
+	0x1c, 0x33, 0x79, 0xf0, 0xda, 0x0b, 0x4f, 0x20, 0x1b, 0x86, 0x18, 0x30, 0xb9, 0x0d, 0xbd, 0xbe,
+	0x4c, 0xa8, 0xd9, 0xa3, 0xfe, 0xf7, 0x3a, 0x2c, 0x65, 0x65, 0x3e, 0x89, 0xbb, 0x29, 0x94, 0xba,
+	0x9b, 0x1a, 0x9f, 0xdd, 0xde, 0x03, 0x4d, 0x62, 0x77, 0x5d, 0xc7, 0xb2, 0xa9, 0xc8, 0xf5, 0x9a,
+	0x46, 0x34, 0xc1, 0x10, 0xdf, 0x77, 0x7c, 0xaa, 0x14, 0xd2, 0xc3, 0xb1, 0x52, 0xd4, 0x6d, 0xc4,
+	0x8a, 0xba, 0x83, 0x58, 0x50, 0x38, 0xcd, 0x75, 0xfc, 0x46, 0xa9, 0xe4, 0x6e, 0x6c, 0x71, 0xf7,
+	0x39, 0x98, 0xdb, 0x8f, 0x44, 0xc2, 0xcb, 0x08, 0x79, 0xc2, 0x18, 0x45, 0x9c, 0x86, 0x0a, 0x28,
+	0x5e, 0x24, 0x9b, 0x4d, 0x16, 0xc9, 0x5e, 0x82, 0x85, 0xae, 0x49, 0xcd, 0x4d, 0xc2, 0xc4, 0xb8,
+	0x6d, 0xef, 0x39, 0x5a, 0x93, 0x6f, 0xfc, 0xd8, 0xe4, 0x95, 0xe3, 0xd8, 0x72, 0x23, 0x01, 0x2e,
+	0x55, 0x85, 0x83, 0x74, 0x15, 0xae, 0x6c, 0x28, 0xbc, 0x0b, 0x0b, 0x71, 0x24, 0x32, 0x8b, 0x9c,
+	0x2c, 0x32, 0x23, 0xbd, 0xa8, 0xc6, 0x29, 0x47, 0xf8, 0x3e, 0x98, 0x37, 0x0f, 0x4c, 0xab, 0x6f,
+	0xee, 0xf6, 0xc9, 0x0b, 0x8e, 0x1d, 0x78, 0xe1, 0xf8, 0xa4, 0x7e, 0x1b, 0x56, 0xb2, 0x24, 0x7a,
+	0x9d, 0x8c, 0xca, 0xe9, 0xad, 0x4e, 0x61, 0xc5, 0x90, 0xa5, 0xe8, 0xb0, 0x06, 0x20, 0x5d, 0xc8,
+	0xf3, 0xcc, 0xda, 0xc4, 0x94, 0xb4, 0xf9, 0x92, 0xb5, 0x85, 0x10, 0x9c, 0xfe, 0x03, 0x04, 0x5a,
+	0x7a, 0xdb, 0x6a, 0x4e, 0xf0, 0xbb, 0x5d, 0xc0, 0x3f, 0x0f, 0xa7, 0x9f, 0xb5, 0xbd, 0x43, 0x78,
+	0x50, 0xee, 0x6e, 0x9f, 0x25, 0x49, 0x19, 0xa0, 0xab, 0xf1, 0xa9, 0xb7, 0xe0, 0x44, 0xd8, 0x47,
+	0x70, 0x34, 0xe8, 0xef, 0xc2, 0xa2, 0x02, 0xb1, 0x1a, 0xac, 0x7f, 0x87, 0x60, 0xe9, 0x49, 0xcb,
+	0xee, 0x06, 0xdc, 0x09, 0x0f, 0xb0, 0x07, 0x60, 0xb1, 0xe3, 0xd8, 0xfe, 0x70, 0x40, 0xbc, 0x76,
+	0x82, 0x84, 0xf4, 0x8b, 0xc2, 0x05, 0xd9, 0x33, 0x30, 0x27, 0x2b, 0xb0, 0x2c, 0xcc, 0x0d, 0x2a,
+	0xe2, 0xca, 0x14, 0x2f, 0xff, 0xb2, 0x20, 0xa3, 0x21, 0x8e, 0x4a, 0xf6, 0xac, 0x7f, 0x8c, 0x60,
+	0x39, 0x81, 0x74, 0x35, 0xba, 0xfb, 0x62, 0xba, 0x69, 0xe3, 0xc8, 0xea, 0x7b, 0xfa, 0x07, 0x88,
+	0x07, 0xdf, 0x37, 0x6d, 0x92, 0xd4, 0xfa, 0x7c, 0xbc, 0x7f, 0x00, 0x16, 0x83, 0xfb, 0xba, 0x76,
+	0xc2, 0xd1, 0xa4, 0x5f, 0xe0, 0x55, 0xc0, 0xc1, 0xe4, 0x76, 0xa4, 0x7c, 0x42, 0x34, 0x19, 0x6f,
+	0x42, 0xfe, 0xd7, 0x15, 0xfe, 0xff, 0x59, 0x84, 0xff, 0x31, 0xcc, 0xab, 0x11, 0x80, 0xea, 0x03,
+	0x6b, 0x47, 0xeb, 0x03, 0xdf, 0x12, 0xa5, 0xae, 0x92, 0x8a, 0x9f, 0x8f, 0xf9, 0x58, 0x29, 0x46,
+	0x2b, 0xcc, 0x5c, 0x8a, 0xe3, 0xf1, 0x7f, 0xa8, 0xcb, 0x3e, 0x7c, 0x4e, 0x64, 0x2b, 0xc1, 0xcb,
+	0x36, 0x0f, 0xa2, 0x8e, 0xc4, 0x0f, 0x2a, 0x11, 0xda, 0x94, 0x1a, 0xa1, 0xe9, 0x03, 0xb8, 0x27,
+	0x7b, 0xd3, 0x6a, 0x5c, 0xe5, 0x3b, 0xb5, 0xa0, 0xe6, 0x16, 0xec, 0x97, 0xa3, 0xc4, 0x78, 0x37,
+	0x1a, 0xfd, 0x58, 0xb4, 0x29, 0x2e, 0x2b, 0xda, 0x39, 0x4b, 0x90, 0x59, 0x68, 0x55, 0x59, 0x83,
+	0xec, 0x27, 0x85, 0x5e, 0x69, 0x11, 0xf2, 0x02, 0x2c, 0xdd, 0x36, 0x69, 0x67, 0x3f, 0xe9, 0x2c,
+	0xef, 0x83, 0x79, 0x9f, 0xf4, 0xf7, 0x92, 0xb6, 0x1a, 0x9f, 0xd4, 0xdf, 0xaf, 0xc1, 0x72, 0x62,
+	0x79, 0x35, 0x66, 0x76, 0x0a, 0xa6, 0xcd, 0x0e, 0x55, 0xe2, 0x4c, 0x31, 0xc2, 0xd7, 0x04, 0x63,
+	0x45, 0x01, 0xf0, 0x6c, 0x21, 0xc3, 0xbb, 0x4e, 0x46, 0x42, 0x24, 0xaa, 0x57, 0xac, 0x1f, 0xad,
+	0x57, 0x7c, 0x0a, 0x4e, 0x6c, 0x11, 0x2a, 0x9b, 0x55, 0x27, 0xd2, 0x6c, 0xf5, 0x5e, 0xb1, 0x16,
+	0xbf, 0x57, 0xd4, 0xbf, 0x29, 0xae, 0x53, 0x24, 0xb4, 0xca, 0x18, 0x2e, 0x1b, 0x61, 0x6b, 0xb1,
+	0x46, 0xd8, 0x9b, 0x70, 0x52, 0xe6, 0xd3, 0x47, 0x44, 0x0c, 0x09, 0xef, 0xb3, 0xaa, 0xa4, 0x47,
+	0x7f, 0x1d, 0xc1, 0x49, 0xb5, 0x83, 0xb7, 0x34, 0xe2, 0x87, 0xb5, 0x0a, 0x8f, 0xb9, 0xf5, 0x25,
+	0xf1, 0xee, 0xe8, 0xea, 0xca, 0x10, 0xa7, 0xd6, 0xbb, 0xdd, 0xb0, 0xf7, 0xc8, 0x8a, 0x0e, 0xe1,
+	0x97, 0xe0, 0x58, 0x57, 0x99, 0x96, 0x9d, 0xc4, 0xe7, 0x27, 0xbf, 0xbd, 0x95, 0x07, 0x75, 0xd4,
+	0xd7, 0x64, 0xc4, 0x00, 0xea, 0xfb, 0xbc, 0x7c, 0x1c, 0xdf, 0xba, 0x1a, 0x22, 0xbf, 0x05, 0xa7,
+	0xc5, 0x65, 0xec, 0x67, 0x42, 0xe7, 0x77, 0x10, 0xcc, 0xc7, 0x9a, 0xbb, 0xa2, 0x50, 0x1d, 0x8d,
+	0x09, 0xd5, 0x6b, 0x63, 0x7b, 0x27, 0xa6, 0xc6, 0x76, 0x1b, 0xd6, 0xd3, 0x1d, 0x10, 0x1f, 0x21,
+	0xc0, 0x69, 0x54, 0xb1, 0x01, 0xb3, 0x41, 0x44, 0x25, 0x39, 0x5d, 0xb4, 0x63, 0x2d, 0x84, 0x13,
+	0x6f, 0x83, 0xab, 0x1d, 0x51, 0x1b, 0x1c, 0xcb, 0x24, 0xb3, 0x84, 0x58, 0xe5, 0x75, 0x5b, 0x96,
+	0xba, 0x8c, 0xaf, 0xca, 0xff, 0x09, 0x41, 0x6b, 0x8b, 0xd0, 0x4d, 0xc7, 0xfe, 0x14, 0xb0, 0xc4,
+	0xed, 0x34, 0xa3, 0x0b, 0x5e, 0xe2, 0x2a, 0x7c, 0x96, 0x24, 0xdc, 0xf2, 0x9c, 0x4f, 0x89, 0x84,
+	0x40, 0x6f, 0xca, 0x92, 0x10, 0xc2, 0xd1, 0xff, 0xd1, 0x80, 0xf9, 0x58, 0x37, 0x32, 0x7e, 0x1e,
+	0x8e, 0x0d, 0x94, 0x1f, 0x97, 0xeb, 0x97, 0x89, 0x81, 0xaa, 0x34, 0xa8, 0xc7, 0xcf, 0xc0, 0x9c,
+	0x3c, 0x43, 0xec, 0x3d, 0x27, 0x08, 0x4a, 0x73, 0xff, 0xc7, 0x8b, 0x0a, 0x23, 0xba, 0xa6, 0xad,
+	0x97, 0xbe, 0xa6, 0x8d, 0x2b, 0x60, 0xe3, 0x68, 0x14, 0x30, 0xae, 0x12, 0xd3, 0x47, 0xa3, 0x12,
+	0x78, 0x47, 0xa6, 0x7d, 0x33, 0x1c, 0xde, 0x13, 0xc5, 0x9a, 0xda, 0x53, 0xcd, 0x47, 0x6b, 0xb0,
+	0xa4, 0xea, 0xc2, 0x73, 0xc2, 0x1b, 0xfb, 0xda, 0x2c, 0x4f, 0x2e, 0x33, 0xdf, 0x15, 0xbf, 0x54,
+	0xf9, 0x10, 0x81, 0x16, 0xdd, 0xa9, 0xc9, 0x36, 0xfb, 0x8a, 0xcc, 0xf2, 0x56, 0xb2, 0xd7, 0xa5,
+	0xe8, 0xbf, 0x01, 0x84, 0xcd, 0x2e, 0xd7, 0x00, 0x5f, 0x26, 0xfd, 0x44, 0xb3, 0x0b, 0xcb, 0xc9,
+	0x42, 0xe7, 0x19, 0xfc, 0xe3, 0x84, 0x32, 0x73, 0x48, 0x2b, 0x92, 0x11, 0x87, 0xe5, 0xbb, 0xbc,
+	0xe4, 0x1c, 0xff, 0xcf, 0x19, 0x94, 0xfc, 0xcf, 0x99, 0xbb, 0x54, 0x81, 0xff, 0x88, 0x78, 0xb0,
+	0x5a, 0x75, 0xdb, 0xcd, 0xed, 0x54, 0xdb, 0xcd, 0xf9, 0x1c, 0x47, 0x63, 0x92, 0x66, 0xa5, 0xf9,
+	0x66, 0x0d, 0x16, 0xb6, 0x08, 0x5d, 0x77, 0xa3, 0x6c, 0x38, 0x11, 0x13, 0xa0, 0x74, 0x4c, 0xf0,
+	0x1a, 0x1c, 0x0f, 0xd7, 0x54, 0x97, 0x8a, 0xb1, 0xe0, 0x26, 0xb8, 0x67, 0x93, 0xa3, 0xb5, 0x8f,
+	0x5b, 0x61, 0x93, 0xed, 0x26, 0xf5, 0xfa, 0xf8, 0x4d, 0x04, 0x0d, 0xf2, 0x9a, 0xe5, 0x53, 0x7c,
+	0x21, 0xcf, 0xfd, 0x72, 0xb2, 0x53, 0xb5, 0x75, 0xb1, 0xe0, 0x6a, 0x89, 0xee, 0xf7, 0x10, 0x4c,
+	0x77, 0x78, 0x90, 0x81, 0x2f, 0x96, 0x6a, 0x53, 0x6c, 0x3d, 0x5e, 0x74, 0xb9, 0x82, 0x49, 0x97,
+	0xa7, 0x3a, 0x39, 0x30, 0xc9, 0xea, 0xf5, 0xcb, 0x81, 0x49, 0x76, 0x7b, 0xdf, 0xeb, 0x08, 0xa6,
+	0x7b, 0xbc, 0xd2, 0x88, 0xcf, 0x15, 0xb8, 0xfb, 0x0f, 0xd0, 0x38, 0x5f, 0x68, 0xad, 0xc4, 0xe1,
+	0xfb, 0x08, 0xe6, 0x7a, 0x51, 0x4f, 0x1c, 0x2e, 0x02, 0x2c, 0xb0, 0x8b, 0xd6, 0x85, 0x62, 0x8b,
+	0x25, 0x2a, 0xef, 0x21, 0x38, 0x31, 0xe4, 0x25, 0x97, 0xa8, 0x6e, 0x83, 0x37, 0xca, 0x77, 0xaa,
+	0xb5, 0x36, 0x4b, 0xc1, 0x90, 0xd8, 0xfd, 0x08, 0xc1, 0x8c, 0xd9, 0xed, 0xf2, 0xb2, 0xfd, 0xa5,
+	0x02, 0xdd, 0x00, 0x6a, 0xfb, 0x4c, 0xeb, 0x89, 0xe2, 0x00, 0x14, 0x74, 0x7a, 0x84, 0xe6, 0x44,
+	0x27, 0xbb, 0xd1, 0x2d, 0x07, 0x3a, 0x87, 0x35, 0xbc, 0xfd, 0x0c, 0x01, 0x08, 0xd9, 0x71, 0x8c,
+	0xd6, 0x8b, 0x71, 0x5c, 0x69, 0x45, 0x6b, 0x6d, 0x94, 0x01, 0x21, 0xb1, 0xfa, 0x05, 0x02, 0x10,
+	0xa6, 0xce, 0xb1, 0xda, 0x28, 0x68, 0xaf, 0x2a, 0xab, 0x36, 0x4b, 0xc1, 0x90, 0x78, 0xfd, 0x50,
+	0xe8, 0x12, 0x0b, 0x56, 0xf0, 0xe3, 0xe5, 0x3a, 0x4b, 0x5a, 0x97, 0x0a, 0xaf, 0x57, 0x90, 0xe9,
+	0x11, 0x9a, 0x13, 0x99, 0xcc, 0xc6, 0xaa, 0xd6, 0xa5, 0x92, 0x2d, 0x4c, 0xf8, 0xa7, 0x08, 0x9a,
+	0x42, 0x8f, 0x76, 0xcc, 0x1e, 0x7e, 0xa2, 0x98, 0x0e, 0x44, 0xed, 0x4a, 0xad, 0xf5, 0x12, 0x10,
+	0x14, 0xd5, 0x16, 0x4a, 0xc4, 0x59, 0xb4, 0x5e, 0x4c, 0x01, 0x54, 0x2e, 0x6d, 0x94, 0x01, 0x21,
+	0xb1, 0xfa, 0x2e, 0x82, 0xf9, 0x5e, 0x50, 0x7d, 0xe4, 0x41, 0xda, 0x57, 0x72, 0xf1, 0x5e, 0xad,
+	0xbe, 0xb5, 0xce, 0x15, 0x59, 0x2a, 0x11, 0x79, 0x1b, 0xc1, 0xb1, 0xae, 0x52, 0x39, 0xcc, 0x11,
+	0x66, 0x64, 0x54, 0x30, 0x5b, 0x17, 0x0b, 0xae, 0x56, 0xb0, 0x19, 0x28, 0xc5, 0xbd, 0x1c, 0xd8,
+	0x64, 0x94, 0x25, 0x73, 0x60, 0x93, 0x59, 0x51, 0x7c, 0x07, 0xc1, 0xbc, 0x8a, 0x8d, 0x8f, 0x8b,
+	0x01, 0xf4, 0xf3, 0x47, 0x1c, 0xd9, 0x9f, 0x49, 0xf8, 0x35, 0x82, 0x2f, 0x98, 0xf1, 0xca, 0xe0,
+	0x93, 0x8e, 0xa7, 0x66, 0x76, 0x7e, 0xbe, 0xc3, 0x2d, 0xa3, 0x8e, 0x93, 0xef, 0x70, 0xcb, 0xac,
+	0x84, 0xfc, 0x06, 0x81, 0xde, 0x49, 0x55, 0xa4, 0x52, 0x98, 0x6e, 0xe4, 0x8c, 0x04, 0xb3, 0x90,
+	0xdd, 0x2c, 0x05, 0x43, 0xe2, 0xfb, 0x4b, 0x04, 0x2b, 0x3d, 0x5e, 0xd8, 0xe1, 0x89, 0xb6, 0xfa,
+	0x9b, 0x7c, 0x87, 0x73, 0x39, 0x0c, 0xc7, 0xd4, 0x96, 0x24, 0x86, 0xa9, 0x32, 0xe5, 0xa7, 0x8f,
+	0xe1, 0x61, 0x05, 0xbc, 0xb7, 0x11, 0x2c, 0x74, 0x55, 0x77, 0x97, 0x27, 0x16, 0x4d, 0xe7, 0xbf,
+	0xad, 0x0b, 0xc5, 0x16, 0x0b, 0x6c, 0xd6, 0x3e, 0x99, 0x83, 0x93, 0x89, 0xe2, 0x11, 0xcf, 0xa6,
+	0x7e, 0x82, 0x58, 0x16, 0x27, 0x7a, 0x6e, 0x72, 0x1c, 0x4f, 0x87, 0x74, 0x41, 0xe5, 0x38, 0x9e,
+	0x0e, 0x6d, 0x68, 0x62, 0x31, 0xce, 0x30, 0xec, 0x03, 0xca, 0x13, 0x2f, 0x1f, 0xd6, 0x97, 0x94,
+	0x27, 0x5e, 0x3e, 0xbc, 0x01, 0xe9, 0x0d, 0x04, 0xcd, 0xfd, 0xa0, 0xc1, 0x27, 0xc7, 0xe1, 0x94,
+	0x6c, 0x33, 0xca, 0x71, 0x38, 0xa5, 0xfb, 0x89, 0xde, 0x42, 0x50, 0xdf, 0xb3, 0xec, 0x6e, 0x0e,
+	0xbf, 0x9b, 0xd5, 0x2f, 0x94, 0xc3, 0xef, 0x66, 0x77, 0xee, 0xb0, 0x63, 0xa9, 0xa7, 0xb4, 0x41,
+	0xe4, 0xcb, 0xc5, 0x53, 0xe8, 0x5c, 0x2c, 0xb8, 0x5a, 0x62, 0xf3, 0x2e, 0x82, 0x85, 0x5e, 0xac,
+	0xc3, 0x25, 0x5f, 0xe0, 0x97, 0x6e, 0xea, 0xc9, 0x17, 0xf8, 0x65, 0xb5, 0xd6, 0xbc, 0x87, 0xe0,
+	0x98, 0x08, 0xfc, 0x44, 0x9f, 0x03, 0xbe, 0x5c, 0xb0, 0x3f, 0x20, 0xd6, 0x9b, 0xd1, 0xba, 0x52,
+	0x12, 0x8a, 0xc4, 0xee, 0x7d, 0x04, 0xda, 0x30, 0xd5, 0x0d, 0x20, 0x53, 0xd4, 0xcd, 0x23, 0xe8,
+	0x64, 0x68, 0x5d, 0x2e, 0x07, 0x24, 0xca, 0xe6, 0x1b, 0xaf, 0x9a, 0xb4, 0xb3, 0x9f, 0x43, 0xe1,
+	0xb3, 0xfa, 0x0e, 0x72, 0x28, 0x7c, 0x66, 0xdf, 0xc1, 0x83, 0x88, 0xab, 0xfc, 0xbe, 0xf2, 0xe9,
+	0x21, 0x5c, 0xec, 0x4b, 0x49, 0xf9, 0x55, 0x3e, 0xeb, 0x7b, 0x47, 0x6b, 0x7f, 0x99, 0x82, 0xc5,
+	0x2d, 0xe7, 0x80, 0x78, 0xb6, 0x5a, 0x1b, 0x7b, 0x17, 0xc1, 0x89, 0x5e, 0xa2, 0xee, 0x5b, 0xaa,
+	0x14, 0xb3, 0x5e, 0x60, 0x6d, 0xa2, 0xdc, 0xfc, 0x73, 0x04, 0xc7, 0x7b, 0xf1, 0x6f, 0xd3, 0x14,
+	0x4a, 0xf0, 0xd5, 0x4f, 0xe8, 0x14, 0x4a, 0xf0, 0xe3, 0x9f, 0xc5, 0x79, 0x53, 0xa0, 0xb5, 0xee,
+	0xba, 0x7d, 0xab, 0x63, 0x8a, 0xcf, 0xef, 0x3c, 0x96, 0x07, 0xaa, 0x52, 0x3f, 0x6d, 0x9d, 0xcd,
+	0xbf, 0x50, 0xa0, 0xb1, 0xf1, 0x20, 0x4c, 0xfa, 0x11, 0xb4, 0x17, 0x1a, 0xfc, 0xa3, 0x69, 0xbb,
+	0xd3, 0xfc, 0xcf, 0xc3, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x30, 0x9e, 0x95, 0xa4, 0x4d, 0x4d,
+	0x00, 0x00,
 }
diff --git a/server/core/proto/services.proto b/server/core/proto/services.proto
index 25bf8a0..c6c2e72 100644
--- a/server/core/proto/services.proto
+++ b/server/core/proto/services.proto
@@ -28,6 +28,7 @@
     rpc modifySchema (ModifySchemaRequest) returns (ModifySchemaResponse);
     rpc modifySchemas (ModifySchemasRequest) returns (ModifySchemasResponse);
 
+    rpc addDependenciesForMicroServices (AddDependenciesRequest) returns (AddDependenciesResponse);
     rpc createDependenciesForMicroServices (CreateDependenciesRequest) returns (CreateDependenciesResponse);
     rpc getProviderDependencies (GetDependenciesRequest) returns (GetProDependenciesResponse);
     rpc getConsumerDependencies (GetDependenciesRequest) returns (GetConDependenciesResponse);
@@ -492,8 +493,16 @@
     Response response = 1;
 }
 
+message AddDependenciesRequest {
+    repeated ConsumerDependency dependencies = 1;
+}
+
+message AddDependenciesResponse {
+    Response response = 1;
+}
+
 message CreateDependenciesRequest {
-    repeated MircroServiceDependency dependencies = 1;
+    repeated ConsumerDependency dependencies = 1;
 }
 
 message DependencyKey {
@@ -503,7 +512,7 @@
     string environment = 4;
 }
 
-message MircroServiceDependency {
+message ConsumerDependency {
     DependencyKey consumer = 1;
     repeated DependencyKey providers = 2;
 }
diff --git a/server/plugin/infra/registry/buildin/buildin.go b/server/plugin/infra/registry/buildin/buildin.go
index d3c9fb4..d3a90b1 100644
--- a/server/plugin/infra/registry/buildin/buildin.go
+++ b/server/plugin/infra/registry/buildin/buildin.go
@@ -25,53 +25,53 @@
 	mgr.RegisterPlugin(mgr.Plugin{mgr.STATIC, mgr.REGISTRY, "buildin", NewRegistry})
 }
 
-var noClientPluginErr = fmt.Errorf("register center client plugin does not exist")
+var noPluginErr = fmt.Errorf("register center plugin does not exist")
 
-type ErrorRegisterCenterClient struct {
+type BuildinRegistry struct {
 	ready chan int
 }
 
-func (ec *ErrorRegisterCenterClient) safeClose(chan int) {
+func (ec *BuildinRegistry) safeClose(chan int) {
 	defer util.RecoverAndReport()
 	close(ec.ready)
 }
-func (ec *ErrorRegisterCenterClient) Err() (err <-chan error) {
+func (ec *BuildinRegistry) Err() (err <-chan error) {
 	return
 }
-func (ec *ErrorRegisterCenterClient) Ready() <-chan int {
+func (ec *BuildinRegistry) Ready() <-chan int {
 	ec.safeClose(ec.ready)
 	return ec.ready
 }
-func (ec *ErrorRegisterCenterClient) PutNoOverride(ctx context.Context, opts ...registry.PluginOpOption) (bool, error) {
-	return false, noClientPluginErr
+func (ec *BuildinRegistry) PutNoOverride(ctx context.Context, opts ...registry.PluginOpOption) (bool, error) {
+	return false, noPluginErr
 }
-func (ec *ErrorRegisterCenterClient) Do(ctx context.Context, opts ...registry.PluginOpOption) (*registry.PluginResponse, error) {
-	return nil, noClientPluginErr
+func (ec *BuildinRegistry) Do(ctx context.Context, opts ...registry.PluginOpOption) (*registry.PluginResponse, error) {
+	return nil, noPluginErr
 }
-func (ec *ErrorRegisterCenterClient) Txn(ctx context.Context, ops []registry.PluginOp) (*registry.PluginResponse, error) {
-	return nil, noClientPluginErr
+func (ec *BuildinRegistry) Txn(ctx context.Context, ops []registry.PluginOp) (*registry.PluginResponse, error) {
+	return nil, noPluginErr
 }
-func (ec *ErrorRegisterCenterClient) TxnWithCmp(ctx context.Context, success []registry.PluginOp, cmp []registry.CompareOp, fail []registry.PluginOp) (*registry.PluginResponse, error) {
-	return nil, noClientPluginErr
+func (ec *BuildinRegistry) TxnWithCmp(ctx context.Context, success []registry.PluginOp, cmp []registry.CompareOp, fail []registry.PluginOp) (*registry.PluginResponse, error) {
+	return nil, noPluginErr
 }
-func (ec *ErrorRegisterCenterClient) LeaseGrant(ctx context.Context, TTL int64) (leaseID int64, err error) {
-	return 0, noClientPluginErr
+func (ec *BuildinRegistry) LeaseGrant(ctx context.Context, TTL int64) (leaseID int64, err error) {
+	return 0, noPluginErr
 }
-func (ec *ErrorRegisterCenterClient) LeaseRenew(ctx context.Context, leaseID int64) (TTL int64, err error) {
-	return 0, noClientPluginErr
+func (ec *BuildinRegistry) LeaseRenew(ctx context.Context, leaseID int64) (TTL int64, err error) {
+	return 0, noPluginErr
 }
-func (ec *ErrorRegisterCenterClient) LeaseRevoke(ctx context.Context, leaseID int64) error {
-	return noClientPluginErr
+func (ec *BuildinRegistry) LeaseRevoke(ctx context.Context, leaseID int64) error {
+	return noPluginErr
 }
-func (ec *ErrorRegisterCenterClient) Watch(ctx context.Context, opts ...registry.PluginOpOption) error {
-	return noClientPluginErr
+func (ec *BuildinRegistry) Watch(ctx context.Context, opts ...registry.PluginOpOption) error {
+	return noPluginErr
 }
-func (ec *ErrorRegisterCenterClient) Close() {
+func (ec *BuildinRegistry) Close() {
 	ec.safeClose(ec.ready)
 }
 
 func NewRegistry() mgr.PluginInstance {
-	return &ErrorRegisterCenterClient{
+	return &BuildinRegistry{
 		ready: make(chan int),
 	}
 }
diff --git a/server/rest/controller/v3/dependency_controller.go b/server/rest/controller/v3/dependency_controller.go
index 88bdf80..cb3084b 100644
--- a/server/rest/controller/v3/dependency_controller.go
+++ b/server/rest/controller/v3/dependency_controller.go
@@ -14,16 +14,8 @@
 package v3
 
 import (
-	"encoding/json"
 	"github.com/ServiceComb/service-center/pkg/rest"
-	"github.com/ServiceComb/service-center/pkg/util"
-	"github.com/ServiceComb/service-center/server/core"
-	pb "github.com/ServiceComb/service-center/server/core/proto"
-	scerr "github.com/ServiceComb/service-center/server/error"
-	"github.com/ServiceComb/service-center/server/rest/controller"
 	"github.com/ServiceComb/service-center/server/rest/controller/v4"
-	"io/ioutil"
-	"net/http"
 )
 
 type DependencyService struct {
@@ -32,47 +24,9 @@
 
 func (this *DependencyService) URLPatterns() []rest.Route {
 	return []rest.Route{
+		{rest.HTTP_METHOD_POST, "/registry/v3/dependencies", this.AddDependenciesForMicroServices},
 		{rest.HTTP_METHOD_PUT, "/registry/v3/dependencies", this.CreateDependenciesForMicroServices},
 		{rest.HTTP_METHOD_GET, "/registry/v3/microservices/:consumerId/providers", this.GetConProDependencies},
 		{rest.HTTP_METHOD_GET, "/registry/v3/microservices/:providerId/consumers", this.GetProConDependencies},
 	}
 }
-
-func (this *DependencyService) CreateDependenciesForMicroServices(w http.ResponseWriter, r *http.Request) {
-	requestBody, err := ioutil.ReadAll(r.Body)
-	if err != nil {
-		util.Logger().Error("body err", err)
-		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
-		return
-	}
-	request := &pb.CreateDependenciesRequest{}
-	err = json.Unmarshal(requestBody, request)
-	if err != nil {
-		util.Logger().Error("Invalid json", err)
-		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
-		return
-	}
-
-	resp, err := core.ServiceAPI.CreateDependenciesForMicroServices(r.Context(), request)
-	controller.WriteResponse(w, resp.Response, nil)
-}
-
-func (this *DependencyService) GetConProDependencies(w http.ResponseWriter, r *http.Request) {
-	request := &pb.GetDependenciesRequest{
-		ServiceId: r.URL.Query().Get(":consumerId"),
-	}
-	resp, _ := core.ServiceAPI.GetConsumerDependencies(r.Context(), request)
-	respInternal := resp.Response
-	resp.Response = nil
-	controller.WriteResponse(w, respInternal, resp)
-}
-
-func (this *DependencyService) GetProConDependencies(w http.ResponseWriter, r *http.Request) {
-	request := &pb.GetDependenciesRequest{
-		ServiceId: r.URL.Query().Get(":providerId"),
-	}
-	resp, _ := core.ServiceAPI.GetProviderDependencies(r.Context(), request)
-	respInternal := resp.Response
-	resp.Response = nil
-	controller.WriteResponse(w, respInternal, resp)
-}
diff --git a/server/rest/controller/v4/dependency_controller.go b/server/rest/controller/v4/dependency_controller.go
index 762bd0e..55772cc 100644
--- a/server/rest/controller/v4/dependency_controller.go
+++ b/server/rest/controller/v4/dependency_controller.go
@@ -31,12 +31,32 @@
 
 func (this *DependencyService) URLPatterns() []rest.Route {
 	return []rest.Route{
+		{rest.HTTP_METHOD_POST, "/v4/:domain/registry/dependencies", this.AddDependenciesForMicroServices},
 		{rest.HTTP_METHOD_PUT, "/v4/:domain/registry/dependencies", this.CreateDependenciesForMicroServices},
 		{rest.HTTP_METHOD_GET, "/v4/:domain/registry/microservices/:consumerId/providers", this.GetConProDependencies},
 		{rest.HTTP_METHOD_GET, "/v4/:domain/registry/microservices/:providerId/consumers", this.GetProConDependencies},
 	}
 }
 
+func (this *DependencyService) AddDependenciesForMicroServices(w http.ResponseWriter, r *http.Request) {
+	requestBody, err := ioutil.ReadAll(r.Body)
+	if err != nil {
+		util.Logger().Error("body err", err)
+		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
+		return
+	}
+	request := &pb.AddDependenciesRequest{}
+	err = json.Unmarshal(requestBody, request)
+	if err != nil {
+		util.Logger().Error("Invalid json", err)
+		controller.WriteError(w, scerr.ErrInvalidParams, err.Error())
+		return
+	}
+
+	resp, err := core.ServiceAPI.AddDependenciesForMicroServices(r.Context(), request)
+	controller.WriteResponse(w, resp.Response, nil)
+}
+
 func (this *DependencyService) CreateDependenciesForMicroServices(w http.ResponseWriter, r *http.Request) {
 	requestBody, err := ioutil.ReadAll(r.Body)
 	if err != nil {
diff --git a/server/service/concurrent_test.go b/server/service/concurrent_test.go
index faaf568..3dd2c29 100644
--- a/server/service/concurrent_test.go
+++ b/server/service/concurrent_test.go
@@ -60,7 +60,7 @@
 		go func(i int) {
 			serviceName := fmt.Sprintf("service%d", i)
 			_, err := serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-				Dependencies: []*pb.MircroServiceDependency{
+				Dependencies: []*pb.ConsumerDependency{
 					{
 						Consumer: &pb.DependencyKey{
 							AppId:       "test_deps",
diff --git a/server/service/microservices.go b/server/service/microservices.go
index 8cfa44b..437c27d 100644
--- a/server/service/microservices.go
+++ b/server/service/microservices.go
@@ -70,7 +70,7 @@
 	service := in.Service
 	serviceFlag := util.StringJoin([]string{service.AppId, service.ServiceName, service.Version}, "/")
 
-	serviceUtil.SetDefault(service)
+	serviceUtil.SetServiceDefaultValue(service)
 
 	err := apt.Validate(service)
 	if err != nil {
diff --git a/server/service/service_dependency.go b/server/service/service_dependency.go
index ec2105e..5c251a6 100644
--- a/server/service/service_dependency.go
+++ b/server/service/service_dependency.go
@@ -23,84 +23,81 @@
 	"golang.org/x/net/context"
 )
 
+func (s *MicroServiceService) AddDependenciesForMicroServices(ctx context.Context, in *pb.AddDependenciesRequest) (*pb.AddDependenciesResponse, error) {
+	resp, err := s.AddOrUpdateDependencies(ctx, in.Dependencies, false)
+	return &pb.AddDependenciesResponse{
+		Response: resp,
+	}, err
+}
+
 func (s *MicroServiceService) CreateDependenciesForMicroServices(ctx context.Context, in *pb.CreateDependenciesRequest) (*pb.CreateDependenciesResponse, error) {
-	dependencyInfos := in.Dependencies
+	resp, err := s.AddOrUpdateDependencies(ctx, in.Dependencies, true)
+	return &pb.CreateDependenciesResponse{
+		Response: resp,
+	}, err
+}
+
+func (s *MicroServiceService) AddOrUpdateDependencies(ctx context.Context, dependencyInfos []*pb.ConsumerDependency, override bool) (*pb.Response, error) {
 	if len(dependencyInfos) == 0 {
-		return serviceUtil.BadParamsResponse("Invalid request body."), nil
+		return serviceUtil.BadParamsResponse("Invalid request body.").Response, nil
 	}
 	domainProject := util.ParseDomainProject(ctx)
 	for _, dependencyInfo := range dependencyInfos {
-		consumerFlag := util.StringJoin([]string{dependencyInfo.Consumer.AppId, dependencyInfo.Consumer.ServiceName, dependencyInfo.Consumer.Version}, "/")
-
-		dep := new(serviceUtil.Dependency)
-		dep.DomainProject = domainProject
+		if len(dependencyInfo.Providers) == 0 || dependencyInfo.Consumer == nil {
+			return serviceUtil.BadParamsResponse("Provider is invalid").Response, nil
+		}
 
 		util.Logger().Infof("start create dependency, data info %v", dependencyInfo)
 
+		serviceUtil.SetDependencyDefaultValue(dependencyInfo)
+
+		consumerFlag := util.StringJoin([]string{dependencyInfo.Consumer.AppId, dependencyInfo.Consumer.ServiceName, dependencyInfo.Consumer.Version}, "/")
 		consumerInfo := pb.DependenciesToKeys([]*pb.DependencyKey{dependencyInfo.Consumer}, domainProject)[0]
 		providersInfo := pb.DependenciesToKeys(dependencyInfo.Providers, domainProject)
 
-		dep.Consumer = consumerInfo
-		dep.ProvidersRule = providersInfo
-
 		rsp := serviceUtil.ParamsChecker(consumerInfo, providersInfo)
 		if rsp != nil {
 			util.Logger().Errorf(nil, "create dependency failed, conusmer %s: invalid params.%s", consumerFlag, rsp.Response.Message)
-			return rsp, nil
+			return rsp.Response, nil
 		}
 
 		consumerId, err := serviceUtil.GetServiceId(ctx, consumerInfo)
 		util.Logger().Debugf("consumerId is %s", consumerId)
 		if err != nil {
 			util.Logger().Errorf(err, "create dependency failed, consumer %s: get consumer failed.", consumerFlag)
-			return &pb.CreateDependenciesResponse{
-				Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
-			}, err
+			return pb.CreateResponse(scerr.ErrInternal, err.Error()), err
 		}
 		if len(consumerId) == 0 {
 			util.Logger().Errorf(nil, "create dependency failed, consumer %s: consumer not exist.", consumerFlag)
-			return &pb.CreateDependenciesResponse{
-				Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Get consumer's serviceId is empty."),
-			}, nil
-		}
-
-		if len(dependencyInfo.Providers) == 0 {
-			return serviceUtil.BadParamsResponse("Provider is invalid"), nil
-		}
-
-		dep.ConsumerId = consumerId
-		//更新服务的内容,把providers加入
-		err = serviceUtil.UpdateServiceForAddDependency(ctx, consumerId, dependencyInfo.Providers, domainProject)
-		if err != nil {
-			util.Logger().Errorf(err, "create dependency failed, consumer %s: Update service failed.", consumerFlag)
-			return &pb.CreateDependenciesResponse{
-				Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
-			}, err
+			return pb.CreateResponse(scerr.ErrServiceNotExists, "Get consumer's serviceId is empty."), nil
 		}
 
 		//建立依赖规则,用于维护依赖关系
 		lock, err := mux.Lock(mux.GLOBAL_LOCK)
 		if err != nil {
 			util.Logger().Errorf(err, "create dependency failed, consumer %s: create lock failed.", consumerFlag)
-			return &pb.CreateDependenciesResponse{
-				Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
-			}, err
+			return pb.CreateResponse(scerr.ErrInternal, err.Error()), err
 		}
 
-		err = serviceUtil.CreateDependencyRule(ctx, dep)
+		var dep serviceUtil.Dependency
+		dep.DomainProject = domainProject
+		dep.Consumer = consumerInfo
+		dep.ProvidersRule = providersInfo
+		dep.ConsumerId = consumerId
+		if override {
+			err = serviceUtil.CreateDependencyRule(ctx, &dep)
+		} else {
+			err = serviceUtil.AddDependencyRule(ctx, &dep)
+		}
 		lock.Unlock()
 
 		if err != nil {
 			util.Logger().Errorf(err, "create dependency rule failed: consumer %s", consumerFlag)
-			return &pb.CreateDependenciesResponse{
-				Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
-			}, err
+			return pb.CreateResponse(scerr.ErrInternal, err.Error()), err
 		}
 		util.Logger().Infof("Create dependency success: consumer %s, %s  from remote %s", consumerFlag, consumerId, util.GetIPFromContext(ctx))
 	}
-	return &pb.CreateDependenciesResponse{
-		Response: pb.CreateResponse(pb.Response_SUCCESS, "Create dependency successfully."),
-	}, nil
+	return pb.CreateResponse(pb.Response_SUCCESS, "Create dependency successfully."), nil
 }
 
 func (s *MicroServiceService) GetProviderDependencies(ctx context.Context, in *pb.GetDependenciesRequest) (*pb.GetProDependenciesResponse, error) {
diff --git a/server/service/service_dependency_test.go b/server/service/service_dependency_test.go
index 789d127..884932c 100644
--- a/server/service/service_dependency_test.go
+++ b/server/service/service_dependency_test.go
@@ -102,7 +102,7 @@
 
 				By("consumer does not exist")
 				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: &pb.DependencyKey{
 								AppId:       "noexistapp",
@@ -118,7 +118,7 @@
 
 				By("consumer version is invalid")
 				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: &pb.DependencyKey{
 								AppId:       "create_dep_group",
@@ -134,7 +134,7 @@
 
 				By("consumer serviceName is invalid")
 				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: &pb.DependencyKey{
 								AppId:       "create_dep_group",
@@ -150,7 +150,7 @@
 
 				By("provider is nil")
 				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: consumer,
 						},
@@ -161,7 +161,7 @@
 
 				By("provider app is invalid")
 				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: consumer,
 							Providers: []*pb.DependencyKey{
@@ -179,7 +179,7 @@
 
 				By("provider serviceName is invalid")
 				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: consumer,
 							Providers: []*pb.DependencyKey{
@@ -197,7 +197,7 @@
 
 				By("provider version is invalid")
 				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: consumer,
 							Providers: []*pb.DependencyKey{
@@ -215,7 +215,7 @@
 
 				By("provider in diff env")
 				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: consumer,
 							Providers: []*pb.DependencyKey{
@@ -242,7 +242,7 @@
 				By("consumer in diff env")
 				consumer.Environment = pb.ENV_PROD
 				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: consumer,
 							Providers: []*pb.DependencyKey{
@@ -277,7 +277,7 @@
 
 				By("add latest")
 				respCreateDependency, err := serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: consumer,
 							Providers: []*pb.DependencyKey{
@@ -295,7 +295,7 @@
 
 				By("add 1.0.0+")
 				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: consumer,
 							Providers: []*pb.DependencyKey{
@@ -313,7 +313,7 @@
 
 				By("add *")
 				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: consumer,
 							Providers: []*pb.DependencyKey{
@@ -329,7 +329,7 @@
 
 				By("add multiple providers")
 				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: consumer,
 							Providers: []*pb.DependencyKey{
@@ -350,7 +350,7 @@
 
 				By("add 1.0.0-2.0.0")
 				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.MircroServiceDependency{
+					Dependencies: []*pb.ConsumerDependency{
 						{
 							Consumer: consumer,
 							Providers: []*pb.DependencyKey{
@@ -365,6 +365,24 @@
 				})
 				Expect(err).To(BeNil())
 				Expect(respCreateDependency.Response.Code).To(Equal(pb.Response_SUCCESS))
+
+				By("add not override")
+				respAddDependency, err := serviceResource.AddDependenciesForMicroServices(getContext(), &pb.AddDependenciesRequest{
+					Dependencies: []*pb.ConsumerDependency{
+						{
+							Consumer: consumer,
+							Providers: []*pb.DependencyKey{
+								{
+									AppId:       "create_dep_group",
+									ServiceName: "create_dep_provider",
+									Version:     "1.0.0-2.0.0",
+								},
+							},
+						},
+					},
+				})
+				Expect(err).To(BeNil())
+				Expect(respAddDependency.Response.Code).To(Equal(pb.Response_SUCCESS))
 			})
 		})
 	})
diff --git a/server/service/util/dependency.go b/server/service/util/dependency.go
index 724a165..9f02e92 100644
--- a/server/service/util/dependency.go
+++ b/server/service/util/dependency.go
@@ -258,35 +258,6 @@
 	return err
 }
 
-func UpdateServiceForAddDependency(ctx context.Context, consumerId string, providers []*pb.DependencyKey, domainProject string) error {
-	conServiceKey := apt.GenerateServiceKey(domainProject, consumerId)
-	service, err := GetService(ctx, domainProject, consumerId)
-	if err != nil {
-		util.Logger().Errorf(err, "create dependency faild: get service failed. consumerId %s", consumerId)
-		return err
-	}
-	if service == nil {
-		util.Logger().Errorf(nil, "create dependency faild: service not exist.serviceId %s", consumerId)
-		return errors.New("Get service is empty")
-	}
-
-	service.Providers = providers
-	data, err := json.Marshal(service)
-	if err != nil {
-		util.Logger().Errorf(err, "create dependency faild: marshal service failed.")
-		return err
-	}
-	_, err = backend.Registry().Do(ctx,
-		registry.PUT,
-		registry.WithStrKey(conServiceKey),
-		registry.WithValue(data))
-	if err != nil {
-		util.Logger().Errorf(err, "create dependency faild: commit service data into etcd failed.")
-		return err
-	}
-	return nil
-}
-
 func DeleteDependencyForService(ctx context.Context, consumer *pb.MicroServiceKey, serviceId string) ([]registry.PluginOp, error) {
 	ops := []registry.PluginOp{}
 	opsTmps := []registry.PluginOp{}
@@ -400,6 +371,16 @@
 	return false
 }
 
+func diffServiceVersion(serviceA *pb.MicroServiceKey, serviceB *pb.MicroServiceKey) bool {
+	stringA := toString(serviceA)
+	stringB := toString(serviceB)
+	if stringA != stringB &&
+		stringA[:strings.LastIndex(stringA, "/")+1] == stringB[:strings.LastIndex(stringB, "/")+1] {
+		return true
+	}
+	return false
+}
+
 func toString(in *pb.MicroServiceKey) string {
 	return apt.GenerateProviderDependencyRuleKey(in.Tenant, in)
 }
@@ -441,24 +422,67 @@
 	return ops, nil
 }
 
-func CreateDependencyRule(ctx context.Context, dep *Dependency) error {
-	//更新consumer的providers的值,consumer的版本是确定的
-	consumerFlag := strings.Join([]string{dep.Consumer.AppId, dep.Consumer.ServiceName, dep.Consumer.Version}, "/")
-
+func parseAddOrUpdateRules(ctx context.Context, dep *Dependency) (newDependencyRuleList, existDependencyRuleList, deleteDependencyRuleList []*pb.MicroServiceKey) {
 	conKey := apt.GenerateConsumerDependencyRuleKey(dep.DomainProject, dep.Consumer)
 
 	oldProviderRules, err := TransferToMicroServiceDependency(ctx, conKey)
 	if err != nil {
-		util.Logger().Errorf(err, "maintain dependency rule failed, consumer %s: get consumer depedency rule failed.", consumerFlag)
-		return err
+		util.Logger().Errorf(err, "maintain dependency rule failed, consumer %s/%s/%s: get consumer depedency rule failed.",
+			dep.Consumer.AppId, dep.Consumer.ServiceName, dep.Consumer.Version)
+		return
 	}
 
-	unExistDependencyRuleList := make([]*pb.MicroServiceKey, 0, len(oldProviderRules.Dependency))
-	newDependencyRuleList := make([]*pb.MicroServiceKey, 0, len(dep.ProvidersRule))
-	existDependencyRuleList := make([]*pb.MicroServiceKey, 0, len(oldProviderRules.Dependency))
+	deleteDependencyRuleList = make([]*pb.MicroServiceKey, 0, len(oldProviderRules.Dependency))
+	newDependencyRuleList = make([]*pb.MicroServiceKey, 0, len(dep.ProvidersRule))
+	existDependencyRuleList = make([]*pb.MicroServiceKey, 0, len(oldProviderRules.Dependency))
+	for _, tmpProviderRule := range dep.ProvidersRule {
+		if ok, _ := containServiceDependency(oldProviderRules.Dependency, tmpProviderRule); ok {
+			continue
+		}
+
+		if tmpProviderRule.ServiceName == "*" {
+			newDependencyRuleList = append([]*pb.MicroServiceKey{}, tmpProviderRule)
+			deleteDependencyRuleList = oldProviderRules.Dependency
+			break
+		}
+
+		newDependencyRuleList = append(newDependencyRuleList, tmpProviderRule)
+		old := isNeedUpdate(oldProviderRules.Dependency, tmpProviderRule)
+		if old != nil {
+			deleteDependencyRuleList = append(deleteDependencyRuleList, old)
+		}
+	}
+	for _, oldProviderRule := range oldProviderRules.Dependency {
+		if oldProviderRule.ServiceName == "*" {
+			newDependencyRuleList = nil
+			deleteDependencyRuleList = nil
+			return
+		}
+		if ok, _ := containServiceDependency(deleteDependencyRuleList, oldProviderRule); !ok {
+			existDependencyRuleList = append(existDependencyRuleList, oldProviderRule)
+		}
+	}
+
+	dep.ProvidersRule = append(newDependencyRuleList, existDependencyRuleList...)
+	return
+}
+
+func parseOverrideRules(ctx context.Context, dep *Dependency) (newDependencyRuleList, existDependencyRuleList, deleteDependencyRuleList []*pb.MicroServiceKey) {
+	conKey := apt.GenerateConsumerDependencyRuleKey(dep.DomainProject, dep.Consumer)
+
+	oldProviderRules, err := TransferToMicroServiceDependency(ctx, conKey)
+	if err != nil {
+		util.Logger().Errorf(err, "maintain dependency rule failed, consumer %s/%s/%s: get consumer depedency rule failed.",
+			dep.Consumer.AppId, dep.Consumer.ServiceName, dep.Consumer.Version)
+		return
+	}
+
+	deleteDependencyRuleList = make([]*pb.MicroServiceKey, 0, len(oldProviderRules.Dependency))
+	newDependencyRuleList = make([]*pb.MicroServiceKey, 0, len(dep.ProvidersRule))
+	existDependencyRuleList = make([]*pb.MicroServiceKey, 0, len(oldProviderRules.Dependency))
 	for _, oldProviderRule := range oldProviderRules.Dependency {
 		if ok, _ := containServiceDependency(dep.ProvidersRule, oldProviderRule); !ok {
-			unExistDependencyRuleList = append(unExistDependencyRuleList, oldProviderRule)
+			deleteDependencyRuleList = append(deleteDependencyRuleList, oldProviderRule)
 		} else {
 			existDependencyRuleList = append(existDependencyRuleList, oldProviderRule)
 		}
@@ -468,12 +492,23 @@
 			newDependencyRuleList = append(newDependencyRuleList, tmpProviderRule)
 		}
 	}
+	return
+}
+
+func syncDependencyRule(ctx context.Context, dep *Dependency, filter func(context.Context, *Dependency) (_, _, _ []*pb.MicroServiceKey)) error {
+	//更新consumer的providers的值,consumer的版本是确定的
+	consumerFlag := strings.Join([]string{dep.Consumer.AppId, dep.Consumer.ServiceName, dep.Consumer.Version}, "/")
+
+	newDependencyRuleList, existDependencyRuleList, deleteDependencyRuleList := filter(ctx, dep)
+	if len(newDependencyRuleList) == 0 && len(existDependencyRuleList) == 0 && len(deleteDependencyRuleList) == 0 {
+		return nil
+	}
 
 	dep.err = make(chan error, 5)
 	dep.chanNum = 0
-	if len(unExistDependencyRuleList) != 0 {
-		util.Logger().Infof("Unexist dependency rule remove for consumer %s, %v, ", consumerFlag, unExistDependencyRuleList)
-		dep.removedDependencyRuleList = unExistDependencyRuleList
+	if len(deleteDependencyRuleList) != 0 {
+		util.Logger().Infof("Delete dependency rule remove for consumer %s, %v, ", consumerFlag, deleteDependencyRuleList)
+		dep.removedDependencyRuleList = deleteDependencyRuleList
 		dep.RemoveConsumerOfProviderRule()
 	}
 
@@ -483,7 +518,8 @@
 		dep.AddConsumerOfProviderRule()
 	}
 
-	err = dep.UpdateProvidersRuleOfConsumer(conKey)
+	conKey := apt.GenerateConsumerDependencyRuleKey(dep.DomainProject, dep.Consumer)
+	err := dep.UpdateProvidersRuleOfConsumer(conKey)
 	if err != nil {
 		return err
 	}
@@ -502,6 +538,14 @@
 	return nil
 }
 
+func AddDependencyRule(ctx context.Context, dep *Dependency) error {
+	return syncDependencyRule(ctx, dep, parseAddOrUpdateRules)
+}
+
+func CreateDependencyRule(ctx context.Context, dep *Dependency) error {
+	return syncDependencyRule(ctx, dep, parseOverrideRules)
+}
+
 func CreateDependencyRuleForFind(ctx context.Context, domainProject string, provider *pb.MicroServiceKey, consumer *pb.MicroServiceKey) error {
 	//更新consumer的providers的值,consumer的版本是确定的
 	consumerFlag := strings.Join([]string{consumer.AppId, consumer.ServiceName, consumer.Version}, "/")
@@ -577,7 +621,7 @@
 	return nil
 }
 
-func updateProviderRuleDep(ctx context.Context, domainProject string, providerRule , consumer *pb.MicroServiceKey) (registry.PluginOp, error) {
+func updateProviderRuleDep(ctx context.Context, domainProject string, providerRule, consumer *pb.MicroServiceKey) (registry.PluginOp, error) {
 	proKey := apt.GenerateProviderDependencyRuleKey(domainProject, providerRule)
 	consumerDepRules, err := TransferToMicroServiceDependency(ctx, proKey)
 	opt := registry.PluginOp{}
@@ -647,10 +691,7 @@
 func updateDepRuleUtil(key string, deps *pb.MicroServiceDependency, updateDepRule *pb.MicroServiceKey) (string, registry.PluginOp, error) {
 	oldRule := ""
 	for _, serviceRule := range deps.Dependency {
-		if serviceRule.Environment == updateDepRule.Environment &&
-			serviceRule.AppId == updateDepRule.AppId &&
-			serviceRule.ServiceName == updateDepRule.ServiceName &&
-			serviceRule.Version != updateDepRule.Version {
+		if diffServiceVersion(serviceRule, updateDepRule) {
 			oldRule = serviceRule.Version
 			serviceRule.Version = updateDepRule.Version
 			break
@@ -665,10 +706,7 @@
 
 func isNeedUpdate(services []*pb.MicroServiceKey, service *pb.MicroServiceKey) *pb.MicroServiceKey {
 	for _, tmp := range services {
-		if tmp.Environment == service.Environment &&
-			tmp.AppId == service.AppId &&
-			tmp.ServiceName == service.ServiceName &&
-			tmp.Version != service.Version {
+		if diffServiceVersion(tmp, service) {
 			return tmp
 		}
 	}
@@ -694,7 +732,7 @@
 		// provider的ServiceName, Version支持模糊规则
 		return apt.ProviderMsValidator.Validate(in)
 	} else {
-		return apt.DependencyMSValidator.Validate(in)
+		return apt.ConsumerMsValidator.Validate(in)
 	}
 }
 
@@ -1118,3 +1156,14 @@
 	}
 	return allConsumers, nil
 }
+
+func SetDependencyDefaultValue(dep *pb.ConsumerDependency) {
+	if len(dep.Consumer.Environment) == 0 {
+		dep.Consumer.Environment = pb.ENV_DEV
+	}
+	for _, p := range dep.Providers {
+		if len(p.Environment) == 0 {
+			p.Environment = pb.ENV_DEV
+		}
+	}
+}
diff --git a/server/service/util/dependency_test.go b/server/service/util/dependency_test.go
index f8b7777..2e7d3a9 100644
--- a/server/service/util/dependency_test.go
+++ b/server/service/util/dependency_test.go
@@ -69,6 +69,18 @@
 		fmt.Printf(`deleteDependencyUtil failed`)
 		t.FailNow()
 	}
+
+	_, err = deleteConsumerDepOfProviderRule(context.Background(), "", &proto.MicroServiceKey{}, &proto.MicroServiceKey{})
+	if err == nil {
+		fmt.Printf(`deleteConsumerDepOfProviderRule failed`)
+		t.FailNow()
+	}
+
+	_, err = deleteDepRuleUtil("", &proto.MicroServiceDependency{}, &proto.MicroServiceKey{})
+	if err != nil {
+		fmt.Printf(`deleteDepRuleUtil failed`)
+		t.FailNow()
+	}
 }
 
 func TestTransferToMicroServiceDependency(t *testing.T) {
@@ -107,11 +119,37 @@
 	err := CreateDependencyRule(context.Background(), &Dependency{
 		Consumer: &proto.MicroServiceKey{},
 	})
-	if err == nil {
+	if err != nil {
 		fmt.Printf(`CreateDependencyRule failed`)
 		t.FailNow()
 	}
 
+	err = AddDependencyRule(context.Background(), &Dependency{
+		Consumer: &proto.MicroServiceKey{},
+	})
+	if err != nil {
+		fmt.Printf(`AddDependencyRule failed`)
+		t.FailNow()
+	}
+
+	err = AddServiceVersionRule(context.Background(), "", &proto.MicroServiceKey{}, &proto.MicroServiceKey{}, "")
+	if err == nil {
+		fmt.Printf(`AddServiceVersionRule failed`)
+		t.FailNow()
+	}
+
+	err = CreateDependencyRuleForFind(context.Background(), "", &proto.MicroServiceKey{}, &proto.MicroServiceKey{})
+	if err == nil {
+		fmt.Printf(`CreateDependencyRuleForFind failed`)
+		t.FailNow()
+	}
+
+	_, err = addDepRuleUtil("", &proto.MicroServiceDependency{}, &proto.MicroServiceKey{})
+	if err != nil {
+		fmt.Printf(`addDepRuleUtil failed`)
+		t.FailNow()
+	}
+
 	b, err := containServiceDependency([]*proto.MicroServiceKey{
 		{AppId: "a"},
 	}, &proto.MicroServiceKey{
@@ -138,6 +176,20 @@
 		t.FailNow()
 	}
 
+	ok := diffServiceVersion(&proto.MicroServiceKey{
+		AppId:       "a",
+		ServiceName: "a",
+		Version:     "1",
+	}, &proto.MicroServiceKey{
+		AppId:       "a",
+		ServiceName: "a",
+		Version:     "2",
+	})
+	if !ok {
+		fmt.Printf(`diffServiceVersion failed`)
+		t.FailNow()
+	}
+
 	err = validateMicroServiceKey(&proto.MicroServiceKey{}, false)
 	if err == nil {
 		fmt.Printf(`validateMicroServiceKey false invalid failed`)
@@ -169,6 +221,36 @@
 		fmt.Printf(`validateMicroServiceKey false failed`)
 		t.FailNow()
 	}
+
+	ok = isDependencyAll(&proto.MicroServiceDependency{})
+	if ok {
+		fmt.Printf(`isDependencyAll not * failed`)
+		t.FailNow()
+	}
+
+	ok = isDependencyAll(&proto.MicroServiceDependency{
+		Dependency: []*proto.MicroServiceKey{
+			{
+				ServiceName: "*",
+			},
+		},
+	})
+	if !ok {
+		fmt.Printf(`isDependencyAll * failed`)
+		t.FailNow()
+	}
+
+	ok = isExist([]*proto.MicroServiceKey{
+		{
+			ServiceName: "*",
+		},
+	}, &proto.MicroServiceKey{
+		ServiceName: "*",
+	})
+	if !ok {
+		fmt.Printf(`isExist failed`)
+		t.FailNow()
+	}
 }
 
 func TestBadParamsResponse(t *testing.T) {
@@ -249,9 +331,25 @@
 }
 
 func TestUpdateServiceForAddDependency(t *testing.T) {
-	err := UpdateServiceForAddDependency(context.Background(), "", []*proto.DependencyKey{}, "")
-	if err == nil {
-		fmt.Printf(`UpdateServiceForAddDependency failed`)
+	_, _, err := updateDepRuleUtil("", &proto.MicroServiceDependency{}, &proto.MicroServiceKey{})
+	if err != nil {
+		fmt.Printf(`updateDepRuleUtil failed`)
+		t.FailNow()
+	}
+
+	old := isNeedUpdate([]*proto.MicroServiceKey{
+		{
+			AppId:       "a",
+			ServiceName: "a",
+			Version:     "1",
+		},
+	}, &proto.MicroServiceKey{
+		AppId:       "a",
+		ServiceName: "a",
+		Version:     "2",
+	})
+	if old == nil {
+		fmt.Printf(`isNeedUpdate failed`)
 		t.FailNow()
 	}
 }
diff --git a/server/service/util/microservice_util.go b/server/service/util/microservice_util.go
index f416e39..e1f636e 100644
--- a/server/service/util/microservice_util.go
+++ b/server/service/util/microservice_util.go
@@ -277,7 +277,7 @@
 	return resp.Count, nil
 }
 
-func SetDefault(service *pb.MicroService) {
+func SetServiceDefaultValue(service *pb.MicroService) {
 	if len(service.Level) == 0 {
 		service.Level = "BACK"
 	}
diff --git a/server/service/util/util_suite_test.go b/server/service/util/util_suite_test.go
index ac97a34..fc9cf96 100644
--- a/server/service/util/util_suite_test.go
+++ b/server/service/util/util_suite_test.go
@@ -174,7 +174,7 @@
 
 func TestSetDefault(t *testing.T) {
 	service := &proto.MicroService{}
-	serviceUtil.SetDefault(service)
+	serviceUtil.SetServiceDefaultValue(service)
 	if len(service.Level) == 0 ||
 		len(service.Environment) == 0 ||
 		len(service.RegisterBy) == 0 ||