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 ||