diff --git a/internal/rpc/user_devices.go b/internal/rpc/user_devices.go index 4ca813d14..69a852a5f 100644 --- a/internal/rpc/user_devices.go +++ b/internal/rpc/user_devices.go @@ -79,6 +79,10 @@ func (s *userDeviceRPCServer) GetUserDevice(ctx context.Context, req *pb.GetUser models.VehicleNFTRels.Claim, ), ), + qm.Load( + qm.Rels(models.UserDeviceRels.VehicleNFT, + models.VehicleNFTRels.VehicleTokenSyntheticDevice), + ), ).One(ctx, s.dbs().Reader) if err != nil { if errors.Is(err, sql.ErrNoRows) { @@ -105,6 +109,10 @@ func (s *userDeviceRPCServer) GetUserDeviceByVIN(ctx context.Context, req *pb.Ge models.VehicleNFTRels.Claim, ), ), + qm.Load( + qm.Rels(models.UserDeviceRels.VehicleNFT, + models.VehicleNFTRels.VehicleTokenSyntheticDevice), + ), ).One(ctx, s.dbs().Reader) if err != nil { if errors.Is(err, sql.ErrNoRows) { @@ -154,6 +162,7 @@ func (s *userDeviceRPCServer) GetUserDeviceByEthAddr(ctx context.Context, req *p models.VehicleNFTRels.Claim, ), ), + qm.Load(qm.Rels(models.UserDeviceRels.VehicleNFT, models.VehicleNFTRels.VehicleTokenSyntheticDevice)), ).One(ctx, s.dbs().Reader) if err != nil { @@ -212,6 +221,7 @@ func (s *userDeviceRPCServer) ListUserDevicesForUser(ctx context.Context, req *p query = append(query, qm.Load(qm.Rels(models.UserDeviceRels.VehicleNFT, models.VehicleNFTRels.VehicleTokenAftermarketDevice)), + qm.Load(qm.Rels(models.UserDeviceRels.VehicleNFT, models.VehicleNFTRels.VehicleTokenSyntheticDevice)), qm.Load(models.UserDeviceRels.UserDeviceAPIIntegrations), qm.OrderBy(models.UserDeviceTableColumns.CreatedAt+" DESC"), ) @@ -369,8 +379,9 @@ func (s *userDeviceRPCServer) GetUserDeviceByAutoPIUnitId(ctx context.Context, r func (s *userDeviceRPCServer) GetAllUserDevice(req *pb.GetAllUserDeviceRequest, stream pb.UserDeviceService_GetAllUserDeviceServer) error { ctx := context.Background() all, err := models.UserDevices( - models.UserDeviceWhere.VinConfirmed.EQ(true)). - All(ctx, s.dbs().Reader) + models.UserDeviceWhere.VinConfirmed.EQ(true), + qm.Load(qm.Rels(models.UserDeviceRels.VehicleNFT, models.VehicleNFTRels.VehicleTokenSyntheticDevice)), + ).All(ctx, s.dbs().Reader) if err != nil { s.logger.Err(err).Msg("Database failure retrieving all user devices.") return status.Error(codes.Internal, "Internal error.") @@ -448,6 +459,15 @@ func (s *userDeviceRPCServer) deviceModelToAPI(ud *models.UserDevice) *pb.UserDe Expiration: timestamppb.New(vc.ExpirationDate), } } + + if sd := vnft.R.VehicleTokenSyntheticDevice; sd != nil && !sd.TokenID.IsZero() { + stk, _ := sd.TokenID.Uint64() + iTkID, _ := sd.IntegrationTokenID.Uint64() + out.SyntheticDevice = &pb.SyntheticDevice{ + TokenId: stk, + IntegrationTokenId: iTkID, + } + } } for i, udai := range ud.R.UserDeviceAPIIntegrations { diff --git a/internal/rpc/user_devices_test.go b/internal/rpc/user_devices_test.go index d4578e2e7..18e767436 100644 --- a/internal/rpc/user_devices_test.go +++ b/internal/rpc/user_devices_test.go @@ -33,6 +33,7 @@ func populateDB(ctx context.Context, pdb db.Store) (string, error) { userID := ksuid.New().String() ownerAddress := null.BytesFrom(common.Hex2Bytes("448cF8Fd88AD914e3585401241BC434FbEA94bbb")) claimID := ksuid.New().String() + _, childWallet, _ := test.GenerateWallet() ud := models.UserDevice{ ID: ksuid.New().String(), @@ -66,6 +67,15 @@ func populateDB(ctx context.Context, pdb db.Store) (string, error) { DeviceManufacturerTokenID: types.NewDecimal(new(decimal.Big).SetBigMantScale(big.NewInt(42), 0)), } + sd := models.SyntheticDevice{ + VehicleTokenID: vnft.TokenID, + IntegrationTokenID: types.NewDecimal(new(decimal.Big).SetBigMantScale(big.NewInt(19), 0)), + MintRequestID: vnft.MintRequestID, + WalletChildNumber: 100, + TokenID: types.NewNullDecimal(decimal.New(6, 0)), + WalletAddress: childWallet.Bytes(), + } + credential := models.VerifiableCredential{ ClaimID: claimID, Credential: []byte{}, @@ -97,6 +107,10 @@ func populateDB(ctx context.Context, pdb db.Store) (string, error) { return "", err } + if err := sd.Insert(ctx, pdb.DBS().Writer, boil.Infer()); err != nil { + return "", err + } + return ud.ID, nil } @@ -178,5 +192,62 @@ func TestGetUserDevice_PopulateDeprecatedFields(t *testing.T) { assert.Equal(udResult.AftermarketDevice.Beneficiary, udResult.AftermarketDeviceBeneficiaryAddress) //nolint:staticcheck assert.Equal(udResult.AftermarketDevice.TokenId, *udResult.AftermarketDeviceTokenId) //nolint:staticcheck assert.NotEmpty(udResult.AftermarketDeviceBeneficiaryAddress) //nolint:staticcheck +} + +func TestGetUserDevice_PopulateSyntheticDeviceFields(t *testing.T) { + assert := assert.New(t) + ctx := context.Background() + pdb, container := test.StartContainerDatabase(ctx, t, migrationsDirRelPath) + defer func() { + if err := container.Terminate(ctx); err != nil { + t.Fatal(err) + } + }() + + userDeviceID, err := populateDB(ctx, pdb) + assert.NoError(err) + + logger := zerolog.Logger{} + userDeviceSvc := services.NewUserDeviceService(nil, logger, pdb.DBS, nil) + udService := NewUserDeviceRPCService(pdb.DBS, nil, nil, nil, nil, nil, nil, userDeviceSvc) + + udResult, err := udService.GetUserDevice(ctx, &pb_devices.GetUserDeviceRequest{Id: userDeviceID}) + assert.NoError(err) + + assert.Equal(udResult.SyntheticDevice.TokenId, uint64(6)) + assert.Equal(udResult.SyntheticDevice.IntegrationTokenId, uint64(19)) +} + +func TestGetUserDevice_NoSyntheticDeviceFields_WhenNoTokenID(t *testing.T) { + assert := assert.New(t) + ctx := context.Background() + pdb, container := test.StartContainerDatabase(ctx, t, migrationsDirRelPath) + defer func() { + if err := container.Terminate(ctx); err != nil { + t.Fatal(err) + } + }() + + userDeviceID, err := populateDB(ctx, pdb) + assert.NoError(err) + + sd, err := models.SyntheticDevices( + models.SyntheticDeviceWhere.TokenID.EQ(types.NewNullDecimal(decimal.New(6, 0))), + models.SyntheticDeviceWhere.IntegrationTokenID.EQ(types.NewDecimal(new(decimal.Big).SetBigMantScale(big.NewInt(19), 0))), + ).One(ctx, pdb.DBS().Reader) + assert.NoError(err) + + sd.TokenID = types.NullDecimal{} + + _, err = sd.Update(ctx, pdb.DBS().Writer, boil.Whitelist(models.SyntheticDeviceColumns.TokenID)) + assert.NoError(err) + + logger := zerolog.Logger{} + userDeviceSvc := services.NewUserDeviceService(nil, logger, pdb.DBS, nil) + udService := NewUserDeviceRPCService(pdb.DBS, nil, nil, nil, nil, nil, nil, userDeviceSvc) + + udResult, err := udService.GetUserDevice(ctx, &pb_devices.GetUserDeviceRequest{Id: userDeviceID}) + assert.NoError(err) + assert.Nil(udResult.SyntheticDevice) } diff --git a/pkg/grpc/user_devices.pb.go b/pkg/grpc/user_devices.pb.go index e4e373f47..b8d33035a 100644 --- a/pkg/grpc/user_devices.pb.go +++ b/pkg/grpc/user_devices.pb.go @@ -360,6 +360,7 @@ type UserDevice struct { GeoDecodedCountry string `protobuf:"bytes,18,opt,name=geo_decoded_country,json=geoDecodedCountry,proto3" json:"geo_decoded_country,omitempty"` GeoDecodedStateProv string `protobuf:"bytes,19,opt,name=geo_decoded_state_prov,json=geoDecodedStateProv,proto3" json:"geo_decoded_state_prov,omitempty"` AftermarketDevice *AftermarketDevice `protobuf:"bytes,20,opt,name=aftermarket_device,json=aftermarketDevice,proto3,oneof" json:"aftermarket_device,omitempty"` + SyntheticDevice *SyntheticDevice `protobuf:"bytes,21,opt,name=syntheticDevice,proto3,oneof" json:"syntheticDevice,omitempty"` } func (x *UserDevice) Reset() { @@ -536,6 +537,68 @@ func (x *UserDevice) GetAftermarketDevice() *AftermarketDevice { return nil } +func (x *UserDevice) GetSyntheticDevice() *SyntheticDevice { + if x != nil { + return x.SyntheticDevice + } + return nil +} + +type SyntheticDevice struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TokenId uint64 `protobuf:"varint,1,opt,name=token_id,json=tokenId,proto3" json:"token_id,omitempty"` + IntegrationTokenId uint64 `protobuf:"varint,2,opt,name=integration_token_id,json=integrationTokenId,proto3" json:"integration_token_id,omitempty"` +} + +func (x *SyntheticDevice) Reset() { + *x = SyntheticDevice{} + if protoimpl.UnsafeEnabled { + mi := &file_pkg_grpc_user_devices_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SyntheticDevice) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SyntheticDevice) ProtoMessage() {} + +func (x *SyntheticDevice) ProtoReflect() protoreflect.Message { + mi := &file_pkg_grpc_user_devices_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SyntheticDevice.ProtoReflect.Descriptor instead. +func (*SyntheticDevice) Descriptor() ([]byte, []int) { + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{7} +} + +func (x *SyntheticDevice) GetTokenId() uint64 { + if x != nil { + return x.TokenId + } + return 0 +} + +func (x *SyntheticDevice) GetIntegrationTokenId() uint64 { + if x != nil { + return x.IntegrationTokenId + } + return 0 +} + type UserDeviceIntegration struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -549,7 +612,7 @@ type UserDeviceIntegration struct { func (x *UserDeviceIntegration) Reset() { *x = UserDeviceIntegration{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[7] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -562,7 +625,7 @@ func (x *UserDeviceIntegration) String() string { func (*UserDeviceIntegration) ProtoMessage() {} func (x *UserDeviceIntegration) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[7] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -575,7 +638,7 @@ func (x *UserDeviceIntegration) ProtoReflect() protoreflect.Message { // Deprecated: Use UserDeviceIntegration.ProtoReflect.Descriptor instead. func (*UserDeviceIntegration) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{7} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{8} } func (x *UserDeviceIntegration) GetId() string { @@ -613,7 +676,7 @@ type UserDeviceAutoPIUnitResponse struct { func (x *UserDeviceAutoPIUnitResponse) Reset() { *x = UserDeviceAutoPIUnitResponse{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[8] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -626,7 +689,7 @@ func (x *UserDeviceAutoPIUnitResponse) String() string { func (*UserDeviceAutoPIUnitResponse) ProtoMessage() {} func (x *UserDeviceAutoPIUnitResponse) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[8] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -639,7 +702,7 @@ func (x *UserDeviceAutoPIUnitResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UserDeviceAutoPIUnitResponse.ProtoReflect.Descriptor instead. func (*UserDeviceAutoPIUnitResponse) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{8} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{9} } func (x *UserDeviceAutoPIUnitResponse) GetUserDeviceId() string { @@ -683,7 +746,7 @@ type ListUserDevicesForUserRequest struct { func (x *ListUserDevicesForUserRequest) Reset() { *x = ListUserDevicesForUserRequest{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[9] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -696,7 +759,7 @@ func (x *ListUserDevicesForUserRequest) String() string { func (*ListUserDevicesForUserRequest) ProtoMessage() {} func (x *ListUserDevicesForUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[9] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -709,7 +772,7 @@ func (x *ListUserDevicesForUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListUserDevicesForUserRequest.ProtoReflect.Descriptor instead. func (*ListUserDevicesForUserRequest) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{9} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{10} } func (x *ListUserDevicesForUserRequest) GetUserId() string { @@ -737,7 +800,7 @@ type ListUserDevicesForUserResponse struct { func (x *ListUserDevicesForUserResponse) Reset() { *x = ListUserDevicesForUserResponse{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[10] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -750,7 +813,7 @@ func (x *ListUserDevicesForUserResponse) String() string { func (*ListUserDevicesForUserResponse) ProtoMessage() {} func (x *ListUserDevicesForUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[10] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -763,7 +826,7 @@ func (x *ListUserDevicesForUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListUserDevicesForUserResponse.ProtoReflect.Descriptor instead. func (*ListUserDevicesForUserResponse) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{10} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{11} } func (x *ListUserDevicesForUserResponse) GetUserDevices() []*UserDevice { @@ -787,7 +850,7 @@ type ApplyHardwareTemplateRequest struct { func (x *ApplyHardwareTemplateRequest) Reset() { *x = ApplyHardwareTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[11] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -800,7 +863,7 @@ func (x *ApplyHardwareTemplateRequest) String() string { func (*ApplyHardwareTemplateRequest) ProtoMessage() {} func (x *ApplyHardwareTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[11] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -813,7 +876,7 @@ func (x *ApplyHardwareTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyHardwareTemplateRequest.ProtoReflect.Descriptor instead. func (*ApplyHardwareTemplateRequest) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{11} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{12} } func (x *ApplyHardwareTemplateRequest) GetUserId() string { @@ -855,7 +918,7 @@ type ApplyHardwareTemplateResponse struct { func (x *ApplyHardwareTemplateResponse) Reset() { *x = ApplyHardwareTemplateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[12] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -868,7 +931,7 @@ func (x *ApplyHardwareTemplateResponse) String() string { func (*ApplyHardwareTemplateResponse) ProtoMessage() {} func (x *ApplyHardwareTemplateResponse) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[12] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -881,7 +944,7 @@ func (x *ApplyHardwareTemplateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyHardwareTemplateResponse.ProtoReflect.Descriptor instead. func (*ApplyHardwareTemplateResponse) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{12} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{13} } func (x *ApplyHardwareTemplateResponse) GetApplied() bool { @@ -903,7 +966,7 @@ type ClaimedVehiclesGrowth struct { func (x *ClaimedVehiclesGrowth) Reset() { *x = ClaimedVehiclesGrowth{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[13] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -916,7 +979,7 @@ func (x *ClaimedVehiclesGrowth) String() string { func (*ClaimedVehiclesGrowth) ProtoMessage() {} func (x *ClaimedVehiclesGrowth) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[13] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -929,7 +992,7 @@ func (x *ClaimedVehiclesGrowth) ProtoReflect() protoreflect.Message { // Deprecated: Use ClaimedVehiclesGrowth.ProtoReflect.Descriptor instead. func (*ClaimedVehiclesGrowth) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{13} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{14} } func (x *ClaimedVehiclesGrowth) GetTotalClaimedVehicles() int64 { @@ -958,7 +1021,7 @@ type CreateTemplateRequest struct { func (x *CreateTemplateRequest) Reset() { *x = CreateTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[14] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -971,7 +1034,7 @@ func (x *CreateTemplateRequest) String() string { func (*CreateTemplateRequest) ProtoMessage() {} func (x *CreateTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[14] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -984,7 +1047,7 @@ func (x *CreateTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTemplateRequest.ProtoReflect.Descriptor instead. func (*CreateTemplateRequest) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{14} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{15} } func (x *CreateTemplateRequest) GetName() string { @@ -1012,7 +1075,7 @@ type CreateTemplateResponse struct { func (x *CreateTemplateResponse) Reset() { *x = CreateTemplateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[15] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1025,7 +1088,7 @@ func (x *CreateTemplateResponse) String() string { func (*CreateTemplateResponse) ProtoMessage() {} func (x *CreateTemplateResponse) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[15] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1038,7 +1101,7 @@ func (x *CreateTemplateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTemplateResponse.ProtoReflect.Descriptor instead. func (*CreateTemplateResponse) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{15} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{16} } func (x *CreateTemplateResponse) GetId() int64 { @@ -1062,7 +1125,7 @@ type RegisterUserDeviceFromVINRequest struct { func (x *RegisterUserDeviceFromVINRequest) Reset() { *x = RegisterUserDeviceFromVINRequest{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[16] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1075,7 +1138,7 @@ func (x *RegisterUserDeviceFromVINRequest) String() string { func (*RegisterUserDeviceFromVINRequest) ProtoMessage() {} func (x *RegisterUserDeviceFromVINRequest) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[16] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1088,7 +1151,7 @@ func (x *RegisterUserDeviceFromVINRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterUserDeviceFromVINRequest.ProtoReflect.Descriptor instead. func (*RegisterUserDeviceFromVINRequest) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{16} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{17} } func (x *RegisterUserDeviceFromVINRequest) GetUserDeviceId() string { @@ -1130,7 +1193,7 @@ type RegisterUserDeviceFromVINResponse struct { func (x *RegisterUserDeviceFromVINResponse) Reset() { *x = RegisterUserDeviceFromVINResponse{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[17] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1143,7 +1206,7 @@ func (x *RegisterUserDeviceFromVINResponse) String() string { func (*RegisterUserDeviceFromVINResponse) ProtoMessage() {} func (x *RegisterUserDeviceFromVINResponse) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[17] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1156,7 +1219,7 @@ func (x *RegisterUserDeviceFromVINResponse) ProtoReflect() protoreflect.Message // Deprecated: Use RegisterUserDeviceFromVINResponse.ProtoReflect.Descriptor instead. func (*RegisterUserDeviceFromVINResponse) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{17} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{18} } func (x *RegisterUserDeviceFromVINResponse) GetCreated() bool { @@ -1178,7 +1241,7 @@ type VinCredential struct { func (x *VinCredential) Reset() { *x = VinCredential{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[18] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1191,7 +1254,7 @@ func (x *VinCredential) String() string { func (*VinCredential) ProtoMessage() {} func (x *VinCredential) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[18] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1204,7 +1267,7 @@ func (x *VinCredential) ProtoReflect() protoreflect.Message { // Deprecated: Use VinCredential.ProtoReflect.Descriptor instead. func (*VinCredential) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{18} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{19} } func (x *VinCredential) GetId() string { @@ -1234,7 +1297,7 @@ type UpdateDeviceIntegrationStatusRequest struct { func (x *UpdateDeviceIntegrationStatusRequest) Reset() { *x = UpdateDeviceIntegrationStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[19] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1247,7 +1310,7 @@ func (x *UpdateDeviceIntegrationStatusRequest) String() string { func (*UpdateDeviceIntegrationStatusRequest) ProtoMessage() {} func (x *UpdateDeviceIntegrationStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[19] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1260,7 +1323,7 @@ func (x *UpdateDeviceIntegrationStatusRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use UpdateDeviceIntegrationStatusRequest.ProtoReflect.Descriptor instead. func (*UpdateDeviceIntegrationStatusRequest) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{19} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{20} } func (x *UpdateDeviceIntegrationStatusRequest) GetUserDeviceId() string { @@ -1297,7 +1360,7 @@ type IssueVinCredentialRequest struct { func (x *IssueVinCredentialRequest) Reset() { *x = IssueVinCredentialRequest{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[20] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1310,7 +1373,7 @@ func (x *IssueVinCredentialRequest) String() string { func (*IssueVinCredentialRequest) ProtoMessage() {} func (x *IssueVinCredentialRequest) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[20] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1323,7 +1386,7 @@ func (x *IssueVinCredentialRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use IssueVinCredentialRequest.ProtoReflect.Descriptor instead. func (*IssueVinCredentialRequest) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{20} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{21} } func (x *IssueVinCredentialRequest) GetTokenId() uint64 { @@ -1358,7 +1421,7 @@ type IssueVinCredentialResponse struct { func (x *IssueVinCredentialResponse) Reset() { *x = IssueVinCredentialResponse{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[21] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1371,7 +1434,7 @@ func (x *IssueVinCredentialResponse) String() string { func (*IssueVinCredentialResponse) ProtoMessage() {} func (x *IssueVinCredentialResponse) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[21] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1384,7 +1447,7 @@ func (x *IssueVinCredentialResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use IssueVinCredentialResponse.ProtoReflect.Descriptor instead. func (*IssueVinCredentialResponse) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{21} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{22} } func (x *IssueVinCredentialResponse) GetCredentialId() string { @@ -1405,7 +1468,7 @@ type GetAllUserDeviceRequest struct { func (x *GetAllUserDeviceRequest) Reset() { *x = GetAllUserDeviceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[22] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1418,7 +1481,7 @@ func (x *GetAllUserDeviceRequest) String() string { func (*GetAllUserDeviceRequest) ProtoMessage() {} func (x *GetAllUserDeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_pkg_grpc_user_devices_proto_msgTypes[22] + mi := &file_pkg_grpc_user_devices_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1431,7 +1494,7 @@ func (x *GetAllUserDeviceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllUserDeviceRequest.ProtoReflect.Descriptor instead. func (*GetAllUserDeviceRequest) Descriptor() ([]byte, []int) { - return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{22} + return file_pkg_grpc_user_devices_proto_rawDescGZIP(), []int{23} } func (x *GetAllUserDeviceRequest) GetWmi() string { @@ -1487,7 +1550,7 @@ var file_pkg_grpc_user_devices_proto_rawDesc = []byte{ 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x22, - 0xa3, 0x09, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, + 0x80, 0x0a, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, @@ -1548,210 +1611,221 @@ var file_pkg_grpc_user_devices_proto_rawDesc = []byte{ 0x76, 0x69, 0x63, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x41, 0x66, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x48, 0x08, 0x52, 0x11, 0x61, 0x66, 0x74, 0x65, 0x72, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0b, - 0x0a, 0x09, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, - 0x6f, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x61, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x1e, 0x0a, - 0x1c, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x06, 0x0a, - 0x04, 0x5f, 0x76, 0x69, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x29, 0x0a, 0x27, 0x5f, 0x61, 0x66, - 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x63, 0x69, 0x61, 0x72, 0x79, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, - 0x76, 0x69, 0x6e, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x42, 0x15, - 0x0a, 0x13, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x60, 0x0a, 0x15, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x22, 0xb7, 0x01, 0x0a, 0x1c, 0x55, 0x73, 0x65, 0x72, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x50, 0x49, 0x55, 0x6e, 0x69, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, - 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x49, - 0x64, 0x22, 0x63, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x58, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x22, 0xb8, 0x01, 0x0a, 0x1c, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, - 0x72, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x27, 0x0a, 0x10, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x75, 0x6e, 0x69, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x6f, - 0x41, 0x70, 0x69, 0x55, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x68, 0x61, 0x72, - 0x64, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, - 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x22, 0x39, 0x0a, 0x1d, 0x41, - 0x70, 0x70, 0x6c, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x41, - 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x22, 0x77, 0x0a, 0x15, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, - 0x64, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x12, - 0x32, 0x0a, 0x14, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x56, - 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x56, 0x65, 0x68, 0x69, 0x63, - 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x47, - 0x72, 0x6f, 0x77, 0x74, 0x68, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, - 0x43, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x22, 0x28, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x49, 0x64, 0x22, 0xa1, - 0x01, 0x0a, 0x20, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x49, 0x4e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, - 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x69, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x76, 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x22, - 0x0a, 0x0c, 0x76, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x65, 0x64, 0x22, 0x3d, 0x0a, 0x21, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, - 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x49, 0x4e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x22, 0x5b, 0x0a, 0x0d, 0x56, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8b, - 0x01, 0x0a, 0x24, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, - 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x83, 0x01, 0x0a, - 0x19, 0x49, 0x73, 0x73, 0x75, 0x65, 0x56, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x76, 0x69, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, - 0x41, 0x74, 0x22, 0x41, 0x0a, 0x1a, 0x49, 0x73, 0x73, 0x75, 0x65, 0x56, 0x69, 0x6e, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x49, 0x64, 0x22, 0x2b, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x55, - 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x77, 0x6d, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x77, - 0x6d, 0x69, 0x32, 0xa5, 0x0a, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, - 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x55, 0x0a, - 0x16, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x79, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x26, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, - 0x79, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x13, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x79, 0x56, 0x49, 0x4e, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x42, 0x79, 0x56, 0x49, 0x4e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, - 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x55, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x42, 0x79, 0x45, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x12, 0x26, 0x2e, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x79, 0x45, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x69, 0x0a, 0x16, 0x4c, 0x69, - 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x46, 0x6f, 0x72, - 0x55, 0x73, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x46, 0x6f, - 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x47, + 0x0a, 0x0f, 0x73, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2e, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x48, 0x09, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6f, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x69, + 0x6e, 0x5f, 0x61, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x76, 0x69, 0x6e, 0x42, 0x12, + 0x0a, 0x10, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x5f, + 0x69, 0x64, 0x42, 0x29, 0x0a, 0x27, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, + 0x63, 0x69, 0x61, 0x72, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x18, 0x0a, + 0x16, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x69, 0x6e, 0x5f, 0x63, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x12, + 0x0a, 0x10, 0x5f, 0x73, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x22, 0x5e, 0x0a, 0x0f, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x64, + 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x49, 0x64, 0x22, 0x60, 0x0a, 0x15, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x64, 0x22, 0xb7, 0x01, 0x0a, 0x1c, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x50, 0x49, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, + 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x63, + 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x46, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x22, 0x58, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x15, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x48, 0x61, - 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x25, - 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x48, 0x61, - 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, - 0x41, 0x70, 0x70, 0x6c, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x79, - 0x41, 0x75, 0x74, 0x6f, 0x50, 0x49, 0x55, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x12, 0x2b, 0x2e, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x42, 0x79, 0x41, 0x75, 0x74, 0x6f, 0x50, 0x49, 0x55, 0x6e, 0x69, 0x74, - 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, - 0x74, 0x6f, 0x50, 0x49, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x52, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x56, 0x65, - 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1e, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x43, - 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x47, 0x72, - 0x6f, 0x77, 0x74, 0x68, 0x12, 0x51, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x19, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x46, 0x72, 0x6f, - 0x6d, 0x56, 0x49, 0x4e, 0x12, 0x29, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x49, 0x4e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2a, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x46, 0x72, 0x6f, 0x6d, - 0x56, 0x49, 0x4e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x1d, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x2e, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0xb8, 0x01, + 0x0a, 0x1c, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x27, 0x0a, + 0x10, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x6f, 0x41, 0x70, 0x69, + 0x55, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, + 0x72, 0x65, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x22, 0x39, 0x0a, 0x1d, 0x41, 0x70, 0x70, 0x6c, + 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x65, 0x64, 0x22, 0x77, 0x0a, 0x15, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x56, 0x65, + 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x12, 0x32, 0x0a, 0x14, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x56, 0x65, 0x68, 0x69, + 0x63, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, + 0x12, 0x2a, 0x0a, 0x10, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x47, 0x72, 0x6f, 0x77, + 0x74, 0x68, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0x43, 0x0a, 0x15, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x22, 0x28, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x49, 0x64, 0x22, 0xa1, 0x01, 0x0a, 0x20, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x49, 0x4e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x69, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x76, 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x76, + 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x76, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x22, + 0x3d, 0x0a, 0x21, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x49, 0x4e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x5b, + 0x0a, 0x0d, 0x56, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x3a, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8b, 0x01, 0x0a, 0x24, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x73, + 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x19, 0x49, 0x73, + 0x73, 0x75, 0x65, 0x56, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x76, 0x69, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, + 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, + 0x41, 0x0a, 0x1a, 0x49, 0x73, 0x73, 0x75, 0x65, 0x56, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x49, 0x64, 0x22, 0x2b, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x77, 0x6d, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x77, 0x6d, 0x69, 0x32, + 0xa5, 0x0a, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x55, 0x0a, 0x16, 0x47, 0x65, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x79, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x49, 0x64, 0x12, 0x26, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x47, + 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x79, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x42, 0x79, 0x56, 0x49, 0x4e, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, + 0x79, 0x56, 0x49, 0x4e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x30, 0x01, 0x12, 0x5d, 0x0a, - 0x12, 0x49, 0x73, 0x73, 0x75, 0x65, 0x56, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x73, + 0x12, 0x55, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x42, 0x79, 0x45, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x12, 0x26, 0x2e, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x42, 0x79, 0x45, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x69, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x26, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x66, 0x0a, 0x15, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, + 0x61, 0x72, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, + 0x61, 0x72, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, + 0x6c, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x1b, 0x47, 0x65, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x42, 0x79, 0x41, 0x75, 0x74, + 0x6f, 0x50, 0x49, 0x55, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x12, 0x2b, 0x2e, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x42, 0x79, 0x41, 0x75, 0x74, 0x6f, 0x50, 0x49, 0x55, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x50, + 0x49, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, + 0x18, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x56, 0x65, 0x68, 0x69, 0x63, + 0x6c, 0x65, 0x73, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x1e, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x61, 0x69, + 0x6d, 0x65, 0x64, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x47, 0x72, 0x6f, 0x77, 0x74, + 0x68, 0x12, 0x51, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x19, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x49, + 0x4e, 0x12, 0x29, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x46, 0x72, + 0x6f, 0x6d, 0x56, 0x49, 0x4e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x55, + 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x49, 0x4e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x2e, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x41, + 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x30, 0x01, 0x12, 0x5d, 0x0a, 0x12, 0x49, 0x73, 0x73, 0x75, 0x65, 0x56, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x56, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x18, + 0x12, 0x22, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, + 0x56, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x49, + 0x73, 0x73, 0x75, 0x65, 0x56, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x18, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x49, 0x4d, 0x4f, 0x2d, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2d, 0x61, 0x70, - 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x49, 0x4d, 0x4f, 0x2d, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1766,7 +1840,7 @@ func file_pkg_grpc_user_devices_proto_rawDescGZIP() []byte { return file_pkg_grpc_user_devices_proto_rawDescData } -var file_pkg_grpc_user_devices_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_pkg_grpc_user_devices_proto_msgTypes = make([]protoimpl.MessageInfo, 24) var file_pkg_grpc_user_devices_proto_goTypes = []interface{}{ (*GetUserDeviceByAutoPIUnitIdRequest)(nil), // 0: devices.GetUserDeviceByAutoPIUnitIdRequest (*GetUserDeviceRequest)(nil), // 1: devices.GetUserDeviceRequest @@ -1775,67 +1849,69 @@ var file_pkg_grpc_user_devices_proto_goTypes = []interface{}{ (*GetUserDeviceByTokenIdRequest)(nil), // 4: devices.GetUserDeviceByTokenIdRequest (*UpdateUserDeviceMetadataRequest)(nil), // 5: devices.UpdateUserDeviceMetadataRequest (*UserDevice)(nil), // 6: devices.UserDevice - (*UserDeviceIntegration)(nil), // 7: devices.UserDeviceIntegration - (*UserDeviceAutoPIUnitResponse)(nil), // 8: devices.UserDeviceAutoPIUnitResponse - (*ListUserDevicesForUserRequest)(nil), // 9: devices.ListUserDevicesForUserRequest - (*ListUserDevicesForUserResponse)(nil), // 10: devices.ListUserDevicesForUserResponse - (*ApplyHardwareTemplateRequest)(nil), // 11: devices.ApplyHardwareTemplateRequest - (*ApplyHardwareTemplateResponse)(nil), // 12: devices.ApplyHardwareTemplateResponse - (*ClaimedVehiclesGrowth)(nil), // 13: devices.ClaimedVehiclesGrowth - (*CreateTemplateRequest)(nil), // 14: devices.CreateTemplateRequest - (*CreateTemplateResponse)(nil), // 15: devices.CreateTemplateResponse - (*RegisterUserDeviceFromVINRequest)(nil), // 16: devices.RegisterUserDeviceFromVINRequest - (*RegisterUserDeviceFromVINResponse)(nil), // 17: devices.RegisterUserDeviceFromVINResponse - (*VinCredential)(nil), // 18: devices.VinCredential - (*UpdateDeviceIntegrationStatusRequest)(nil), // 19: devices.UpdateDeviceIntegrationStatusRequest - (*IssueVinCredentialRequest)(nil), // 20: devices.IssueVinCredentialRequest - (*IssueVinCredentialResponse)(nil), // 21: devices.IssueVinCredentialResponse - (*GetAllUserDeviceRequest)(nil), // 22: devices.GetAllUserDeviceRequest - (*timestamppb.Timestamp)(nil), // 23: google.protobuf.Timestamp - (*AftermarketDevice)(nil), // 24: devices.AftermarketDevice - (*emptypb.Empty)(nil), // 25: google.protobuf.Empty + (*SyntheticDevice)(nil), // 7: devices.SyntheticDevice + (*UserDeviceIntegration)(nil), // 8: devices.UserDeviceIntegration + (*UserDeviceAutoPIUnitResponse)(nil), // 9: devices.UserDeviceAutoPIUnitResponse + (*ListUserDevicesForUserRequest)(nil), // 10: devices.ListUserDevicesForUserRequest + (*ListUserDevicesForUserResponse)(nil), // 11: devices.ListUserDevicesForUserResponse + (*ApplyHardwareTemplateRequest)(nil), // 12: devices.ApplyHardwareTemplateRequest + (*ApplyHardwareTemplateResponse)(nil), // 13: devices.ApplyHardwareTemplateResponse + (*ClaimedVehiclesGrowth)(nil), // 14: devices.ClaimedVehiclesGrowth + (*CreateTemplateRequest)(nil), // 15: devices.CreateTemplateRequest + (*CreateTemplateResponse)(nil), // 16: devices.CreateTemplateResponse + (*RegisterUserDeviceFromVINRequest)(nil), // 17: devices.RegisterUserDeviceFromVINRequest + (*RegisterUserDeviceFromVINResponse)(nil), // 18: devices.RegisterUserDeviceFromVINResponse + (*VinCredential)(nil), // 19: devices.VinCredential + (*UpdateDeviceIntegrationStatusRequest)(nil), // 20: devices.UpdateDeviceIntegrationStatusRequest + (*IssueVinCredentialRequest)(nil), // 21: devices.IssueVinCredentialRequest + (*IssueVinCredentialResponse)(nil), // 22: devices.IssueVinCredentialResponse + (*GetAllUserDeviceRequest)(nil), // 23: devices.GetAllUserDeviceRequest + (*timestamppb.Timestamp)(nil), // 24: google.protobuf.Timestamp + (*AftermarketDevice)(nil), // 25: devices.AftermarketDevice + (*emptypb.Empty)(nil), // 26: google.protobuf.Empty } var file_pkg_grpc_user_devices_proto_depIdxs = []int32{ - 23, // 0: devices.UserDevice.opted_in_at:type_name -> google.protobuf.Timestamp - 7, // 1: devices.UserDevice.integrations:type_name -> devices.UserDeviceIntegration - 18, // 2: devices.UserDevice.latest_vin_credential:type_name -> devices.VinCredential - 24, // 3: devices.UserDevice.aftermarket_device:type_name -> devices.AftermarketDevice - 6, // 4: devices.ListUserDevicesForUserResponse.user_devices:type_name -> devices.UserDevice - 23, // 5: devices.VinCredential.expiration:type_name -> google.protobuf.Timestamp - 23, // 6: devices.IssueVinCredentialRequest.expires_at:type_name -> google.protobuf.Timestamp - 1, // 7: devices.UserDeviceService.GetUserDevice:input_type -> devices.GetUserDeviceRequest - 4, // 8: devices.UserDeviceService.GetUserDeviceByTokenId:input_type -> devices.GetUserDeviceByTokenIdRequest - 2, // 9: devices.UserDeviceService.GetUserDeviceByVIN:input_type -> devices.GetUserDeviceByVINRequest - 3, // 10: devices.UserDeviceService.GetUserDeviceByEthAddr:input_type -> devices.GetUserDeviceByEthAddrRequest - 9, // 11: devices.UserDeviceService.ListUserDevicesForUser:input_type -> devices.ListUserDevicesForUserRequest - 11, // 12: devices.UserDeviceService.ApplyHardwareTemplate:input_type -> devices.ApplyHardwareTemplateRequest - 0, // 13: devices.UserDeviceService.GetUserDeviceByAutoPIUnitId:input_type -> devices.GetUserDeviceByAutoPIUnitIdRequest - 25, // 14: devices.UserDeviceService.GetClaimedVehiclesGrowth:input_type -> google.protobuf.Empty - 14, // 15: devices.UserDeviceService.CreateTemplate:input_type -> devices.CreateTemplateRequest - 16, // 16: devices.UserDeviceService.RegisterUserDeviceFromVIN:input_type -> devices.RegisterUserDeviceFromVINRequest - 19, // 17: devices.UserDeviceService.UpdateDeviceIntegrationStatus:input_type -> devices.UpdateDeviceIntegrationStatusRequest - 22, // 18: devices.UserDeviceService.GetAllUserDevice:input_type -> devices.GetAllUserDeviceRequest - 20, // 19: devices.UserDeviceService.IssueVinCredential:input_type -> devices.IssueVinCredentialRequest - 5, // 20: devices.UserDeviceService.UpdateUserDeviceMetadata:input_type -> devices.UpdateUserDeviceMetadataRequest - 6, // 21: devices.UserDeviceService.GetUserDevice:output_type -> devices.UserDevice - 6, // 22: devices.UserDeviceService.GetUserDeviceByTokenId:output_type -> devices.UserDevice - 6, // 23: devices.UserDeviceService.GetUserDeviceByVIN:output_type -> devices.UserDevice - 6, // 24: devices.UserDeviceService.GetUserDeviceByEthAddr:output_type -> devices.UserDevice - 10, // 25: devices.UserDeviceService.ListUserDevicesForUser:output_type -> devices.ListUserDevicesForUserResponse - 12, // 26: devices.UserDeviceService.ApplyHardwareTemplate:output_type -> devices.ApplyHardwareTemplateResponse - 8, // 27: devices.UserDeviceService.GetUserDeviceByAutoPIUnitId:output_type -> devices.UserDeviceAutoPIUnitResponse - 13, // 28: devices.UserDeviceService.GetClaimedVehiclesGrowth:output_type -> devices.ClaimedVehiclesGrowth - 15, // 29: devices.UserDeviceService.CreateTemplate:output_type -> devices.CreateTemplateResponse - 17, // 30: devices.UserDeviceService.RegisterUserDeviceFromVIN:output_type -> devices.RegisterUserDeviceFromVINResponse - 6, // 31: devices.UserDeviceService.UpdateDeviceIntegrationStatus:output_type -> devices.UserDevice - 6, // 32: devices.UserDeviceService.GetAllUserDevice:output_type -> devices.UserDevice - 21, // 33: devices.UserDeviceService.IssueVinCredential:output_type -> devices.IssueVinCredentialResponse - 25, // 34: devices.UserDeviceService.UpdateUserDeviceMetadata:output_type -> google.protobuf.Empty - 21, // [21:35] is the sub-list for method output_type - 7, // [7:21] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 24, // 0: devices.UserDevice.opted_in_at:type_name -> google.protobuf.Timestamp + 8, // 1: devices.UserDevice.integrations:type_name -> devices.UserDeviceIntegration + 19, // 2: devices.UserDevice.latest_vin_credential:type_name -> devices.VinCredential + 25, // 3: devices.UserDevice.aftermarket_device:type_name -> devices.AftermarketDevice + 7, // 4: devices.UserDevice.syntheticDevice:type_name -> devices.SyntheticDevice + 6, // 5: devices.ListUserDevicesForUserResponse.user_devices:type_name -> devices.UserDevice + 24, // 6: devices.VinCredential.expiration:type_name -> google.protobuf.Timestamp + 24, // 7: devices.IssueVinCredentialRequest.expires_at:type_name -> google.protobuf.Timestamp + 1, // 8: devices.UserDeviceService.GetUserDevice:input_type -> devices.GetUserDeviceRequest + 4, // 9: devices.UserDeviceService.GetUserDeviceByTokenId:input_type -> devices.GetUserDeviceByTokenIdRequest + 2, // 10: devices.UserDeviceService.GetUserDeviceByVIN:input_type -> devices.GetUserDeviceByVINRequest + 3, // 11: devices.UserDeviceService.GetUserDeviceByEthAddr:input_type -> devices.GetUserDeviceByEthAddrRequest + 10, // 12: devices.UserDeviceService.ListUserDevicesForUser:input_type -> devices.ListUserDevicesForUserRequest + 12, // 13: devices.UserDeviceService.ApplyHardwareTemplate:input_type -> devices.ApplyHardwareTemplateRequest + 0, // 14: devices.UserDeviceService.GetUserDeviceByAutoPIUnitId:input_type -> devices.GetUserDeviceByAutoPIUnitIdRequest + 26, // 15: devices.UserDeviceService.GetClaimedVehiclesGrowth:input_type -> google.protobuf.Empty + 15, // 16: devices.UserDeviceService.CreateTemplate:input_type -> devices.CreateTemplateRequest + 17, // 17: devices.UserDeviceService.RegisterUserDeviceFromVIN:input_type -> devices.RegisterUserDeviceFromVINRequest + 20, // 18: devices.UserDeviceService.UpdateDeviceIntegrationStatus:input_type -> devices.UpdateDeviceIntegrationStatusRequest + 23, // 19: devices.UserDeviceService.GetAllUserDevice:input_type -> devices.GetAllUserDeviceRequest + 21, // 20: devices.UserDeviceService.IssueVinCredential:input_type -> devices.IssueVinCredentialRequest + 5, // 21: devices.UserDeviceService.UpdateUserDeviceMetadata:input_type -> devices.UpdateUserDeviceMetadataRequest + 6, // 22: devices.UserDeviceService.GetUserDevice:output_type -> devices.UserDevice + 6, // 23: devices.UserDeviceService.GetUserDeviceByTokenId:output_type -> devices.UserDevice + 6, // 24: devices.UserDeviceService.GetUserDeviceByVIN:output_type -> devices.UserDevice + 6, // 25: devices.UserDeviceService.GetUserDeviceByEthAddr:output_type -> devices.UserDevice + 11, // 26: devices.UserDeviceService.ListUserDevicesForUser:output_type -> devices.ListUserDevicesForUserResponse + 13, // 27: devices.UserDeviceService.ApplyHardwareTemplate:output_type -> devices.ApplyHardwareTemplateResponse + 9, // 28: devices.UserDeviceService.GetUserDeviceByAutoPIUnitId:output_type -> devices.UserDeviceAutoPIUnitResponse + 14, // 29: devices.UserDeviceService.GetClaimedVehiclesGrowth:output_type -> devices.ClaimedVehiclesGrowth + 16, // 30: devices.UserDeviceService.CreateTemplate:output_type -> devices.CreateTemplateResponse + 18, // 31: devices.UserDeviceService.RegisterUserDeviceFromVIN:output_type -> devices.RegisterUserDeviceFromVINResponse + 6, // 32: devices.UserDeviceService.UpdateDeviceIntegrationStatus:output_type -> devices.UserDevice + 6, // 33: devices.UserDeviceService.GetAllUserDevice:output_type -> devices.UserDevice + 22, // 34: devices.UserDeviceService.IssueVinCredential:output_type -> devices.IssueVinCredentialResponse + 26, // 35: devices.UserDeviceService.UpdateUserDeviceMetadata:output_type -> google.protobuf.Empty + 22, // [22:36] is the sub-list for method output_type + 8, // [8:22] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_pkg_grpc_user_devices_proto_init() } @@ -1930,7 +2006,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserDeviceIntegration); i { + switch v := v.(*SyntheticDevice); i { case 0: return &v.state case 1: @@ -1942,7 +2018,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserDeviceAutoPIUnitResponse); i { + switch v := v.(*UserDeviceIntegration); i { case 0: return &v.state case 1: @@ -1954,7 +2030,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListUserDevicesForUserRequest); i { + switch v := v.(*UserDeviceAutoPIUnitResponse); i { case 0: return &v.state case 1: @@ -1966,7 +2042,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListUserDevicesForUserResponse); i { + switch v := v.(*ListUserDevicesForUserRequest); i { case 0: return &v.state case 1: @@ -1978,7 +2054,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApplyHardwareTemplateRequest); i { + switch v := v.(*ListUserDevicesForUserResponse); i { case 0: return &v.state case 1: @@ -1990,7 +2066,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApplyHardwareTemplateResponse); i { + switch v := v.(*ApplyHardwareTemplateRequest); i { case 0: return &v.state case 1: @@ -2002,7 +2078,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClaimedVehiclesGrowth); i { + switch v := v.(*ApplyHardwareTemplateResponse); i { case 0: return &v.state case 1: @@ -2014,7 +2090,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTemplateRequest); i { + switch v := v.(*ClaimedVehiclesGrowth); i { case 0: return &v.state case 1: @@ -2026,7 +2102,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTemplateResponse); i { + switch v := v.(*CreateTemplateRequest); i { case 0: return &v.state case 1: @@ -2038,7 +2114,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegisterUserDeviceFromVINRequest); i { + switch v := v.(*CreateTemplateResponse); i { case 0: return &v.state case 1: @@ -2050,7 +2126,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegisterUserDeviceFromVINResponse); i { + switch v := v.(*RegisterUserDeviceFromVINRequest); i { case 0: return &v.state case 1: @@ -2062,7 +2138,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VinCredential); i { + switch v := v.(*RegisterUserDeviceFromVINResponse); i { case 0: return &v.state case 1: @@ -2074,7 +2150,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateDeviceIntegrationStatusRequest); i { + switch v := v.(*VinCredential); i { case 0: return &v.state case 1: @@ -2086,7 +2162,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IssueVinCredentialRequest); i { + switch v := v.(*UpdateDeviceIntegrationStatusRequest); i { case 0: return &v.state case 1: @@ -2098,7 +2174,7 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IssueVinCredentialResponse); i { + switch v := v.(*IssueVinCredentialRequest); i { case 0: return &v.state case 1: @@ -2110,6 +2186,18 @@ func file_pkg_grpc_user_devices_proto_init() { } } file_pkg_grpc_user_devices_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IssueVinCredentialResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pkg_grpc_user_devices_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllUserDeviceRequest); i { case 0: return &v.state @@ -2130,7 +2218,7 @@ func file_pkg_grpc_user_devices_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_pkg_grpc_user_devices_proto_rawDesc, NumEnums: 0, - NumMessages: 23, + NumMessages: 24, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/grpc/user_devices.proto b/pkg/grpc/user_devices.proto index f3fc64167..72285ecc3 100644 --- a/pkg/grpc/user_devices.proto +++ b/pkg/grpc/user_devices.proto @@ -75,6 +75,12 @@ message UserDevice { string geo_decoded_country = 18; string geo_decoded_state_prov = 19; optional AftermarketDevice aftermarket_device = 20; + optional SyntheticDevice syntheticDevice = 21; +} + +message SyntheticDevice { + uint64 token_id = 1; + uint64 integration_token_id = 2; } message UserDeviceIntegration { diff --git a/settings.sample.yaml b/settings.sample.yaml index 72b96a7a7..6cbc0104a 100644 --- a/settings.sample.yaml +++ b/settings.sample.yaml @@ -37,8 +37,6 @@ AUTO_PI_API_URL: DOCUMENTS_AWS_ACCESS_KEY_ID: test DOCUMENTS_AWS_SECRET_ACCESS_KEY: test DOCUMENTS_AWS_ENDPOINT: http://localhost:4566 -NFT_AWS_ACCESS_KEY_ID: test -NFT_AWS_SECRET_ACCESS_KEY: test DRIVLY_VIN_API_URL: https://vin.dev.driv.ly DRIVLY_OFFER_API_URL: https://offers.dev.driv.ly DRIVLY_API_KEY: xxx