Add entity information request to system view (#4681)

* Add entity information request to system view

* fixing a few comments

* sharing types between plugin and logical

* sharing types between plugin and logical

* fixing output directory for proto

* removing extra replacement

* adding mount type lookup

* empty entities return nil instead of error

* adding some comments
This commit is contained in:
Chris Hoffman 2018-06-03 20:48:12 -04:00 committed by GitHub
parent bacd506163
commit 51bc3d8891
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 680 additions and 308 deletions

View File

@ -127,6 +127,7 @@ proto:
protoc -I helper/forwarding -I vault -I ../../.. vault/*.proto --go_out=plugins=grpc:vault protoc -I helper/forwarding -I vault -I ../../.. vault/*.proto --go_out=plugins=grpc:vault
protoc -I helper/storagepacker helper/storagepacker/types.proto --go_out=plugins=grpc:helper/storagepacker protoc -I helper/storagepacker helper/storagepacker/types.proto --go_out=plugins=grpc:helper/storagepacker
protoc -I helper/forwarding -I vault -I ../../.. helper/forwarding/types.proto --go_out=plugins=grpc:helper/forwarding protoc -I helper/forwarding -I vault -I ../../.. helper/forwarding/types.proto --go_out=plugins=grpc:helper/forwarding
protoc logical/*.proto --go_out=plugins=grpc:$(GOPATH)/src
protoc -I physical physical/types.proto --go_out=plugins=grpc:physical protoc -I physical physical/types.proto --go_out=plugins=grpc:physical
protoc -I helper/identity -I ../../.. helper/identity/types.proto --go_out=plugins=grpc:helper/identity protoc -I helper/identity -I ../../.. helper/identity/types.proto --go_out=plugins=grpc:helper/identity
protoc builtin/logical/database/dbplugin/*.proto --go_out=plugins=grpc:. protoc builtin/logical/database/dbplugin/*.proto --go_out=plugins=grpc:.

View File

@ -1,16 +0,0 @@
package logical
// Alias represents the information used by core to create implicit entity.
// Implicit entities get created when a client authenticates successfully from
// any of the authentication backends (except token backend).
type Alias struct {
// MountType is the backend mount's type to which this identity belongs
MountType string `json:"mount_type" structs:"mount_type" mapstructure:"mount_type"`
// MountAccessor is the identifier of the mount entry to which this
// identity belongs
MountAccessor string `json:"mount_accessor" structs:"mount_accessor" mapstructure:"mount_accessor"`
// Name is the identifier of this identity in its authentication source
Name string `json:"name" structs:"name" mapstructure:"name"`
}

159
logical/identity.pb.go Normal file
View File

@ -0,0 +1,159 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: logical/identity.proto
package logical // import "github.com/hashicorp/vault/logical"
import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type Entity struct {
// ID is the unique identifier for the entity
ID string `protobuf:"bytes,1,opt,name=ID" json:"ID,omitempty"`
// Name is the human-friendly unique identifier for the entity
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
// Aliases contains thhe alias mappings for the given entity
Aliases []*Alias `protobuf:"bytes,3,rep,name=aliases" json:"aliases,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Entity) Reset() { *m = Entity{} }
func (m *Entity) String() string { return proto.CompactTextString(m) }
func (*Entity) ProtoMessage() {}
func (*Entity) Descriptor() ([]byte, []int) {
return fileDescriptor_identity_63bdeae5187a0ba9, []int{0}
}
func (m *Entity) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Entity.Unmarshal(m, b)
}
func (m *Entity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Entity.Marshal(b, m, deterministic)
}
func (dst *Entity) XXX_Merge(src proto.Message) {
xxx_messageInfo_Entity.Merge(dst, src)
}
func (m *Entity) XXX_Size() int {
return xxx_messageInfo_Entity.Size(m)
}
func (m *Entity) XXX_DiscardUnknown() {
xxx_messageInfo_Entity.DiscardUnknown(m)
}
var xxx_messageInfo_Entity proto.InternalMessageInfo
func (m *Entity) GetID() string {
if m != nil {
return m.ID
}
return ""
}
func (m *Entity) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *Entity) GetAliases() []*Alias {
if m != nil {
return m.Aliases
}
return nil
}
type Alias struct {
// MountType is the backend mount's type to which this identity belongs
MountType string `protobuf:"bytes,1,opt,name=mount_type,json=mountType" json:"mount_type,omitempty"`
// MountAccessor is the identifier of the mount entry to which this
// identity belongs
MountAccessor string `protobuf:"bytes,2,opt,name=mount_accessor,json=mountAccessor" json:"mount_accessor,omitempty"`
// Name is the identifier of this identity in its authentication source
Name string `protobuf:"bytes,3,opt,name=name" json:"name,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Alias) Reset() { *m = Alias{} }
func (m *Alias) String() string { return proto.CompactTextString(m) }
func (*Alias) ProtoMessage() {}
func (*Alias) Descriptor() ([]byte, []int) {
return fileDescriptor_identity_63bdeae5187a0ba9, []int{1}
}
func (m *Alias) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Alias.Unmarshal(m, b)
}
func (m *Alias) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Alias.Marshal(b, m, deterministic)
}
func (dst *Alias) XXX_Merge(src proto.Message) {
xxx_messageInfo_Alias.Merge(dst, src)
}
func (m *Alias) XXX_Size() int {
return xxx_messageInfo_Alias.Size(m)
}
func (m *Alias) XXX_DiscardUnknown() {
xxx_messageInfo_Alias.DiscardUnknown(m)
}
var xxx_messageInfo_Alias proto.InternalMessageInfo
func (m *Alias) GetMountType() string {
if m != nil {
return m.MountType
}
return ""
}
func (m *Alias) GetMountAccessor() string {
if m != nil {
return m.MountAccessor
}
return ""
}
func (m *Alias) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func init() {
proto.RegisterType((*Entity)(nil), "logical.Entity")
proto.RegisterType((*Alias)(nil), "logical.Alias")
}
func init() { proto.RegisterFile("logical/identity.proto", fileDescriptor_identity_63bdeae5187a0ba9) }
var fileDescriptor_identity_63bdeae5187a0ba9 = []byte{
// 209 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x44, 0xcf, 0x31, 0x6b, 0x85, 0x30,
0x14, 0x05, 0x60, 0xd4, 0x56, 0xf1, 0x96, 0x3a, 0x64, 0x28, 0x2e, 0x05, 0x91, 0x16, 0x9c, 0x12,
0x68, 0x7f, 0x81, 0xc5, 0x0e, 0xae, 0x52, 0x3a, 0x74, 0x29, 0xd7, 0x34, 0x68, 0x20, 0x9a, 0x60,
0x62, 0xc1, 0x7f, 0x5f, 0x9a, 0x97, 0xf7, 0xde, 0x16, 0xbe, 0x03, 0x27, 0xe7, 0xc2, 0x83, 0xd2,
0x93, 0xe4, 0xa8, 0x98, 0xfc, 0x11, 0xab, 0x93, 0xee, 0xa0, 0x66, 0xd3, 0x4e, 0x93, 0x2c, 0x78,
0xfd, 0x09, 0xe9, 0xbb, 0x0f, 0x48, 0x01, 0x71, 0xdf, 0x95, 0x51, 0x15, 0x35, 0xf9, 0x10, 0xf7,
0x1d, 0x21, 0x70, 0xb3, 0xe2, 0x22, 0xca, 0xd8, 0x8b, 0x7f, 0x93, 0x06, 0x32, 0x54, 0x12, 0xad,
0xb0, 0x65, 0x52, 0x25, 0xcd, 0xdd, 0x4b, 0x41, 0x43, 0x11, 0x6d, 0xff, 0x7d, 0x38, 0xc7, 0x35,
0xc2, 0xad, 0x17, 0xf2, 0x08, 0xb0, 0xe8, 0x7d, 0x75, 0xdf, 0xee, 0x30, 0x22, 0xd4, 0xe7, 0x5e,
0x3e, 0x0e, 0x23, 0xc8, 0x33, 0x14, 0xa7, 0x18, 0x39, 0x17, 0xd6, 0xea, 0x2d, 0xfc, 0x77, 0xef,
0xb5, 0x0d, 0x78, 0x19, 0x93, 0x5c, 0xc7, 0xbc, 0x3d, 0x7d, 0xd5, 0x93, 0x74, 0xf3, 0x3e, 0x52,
0xae, 0x17, 0x36, 0xa3, 0x9d, 0x25, 0xd7, 0x9b, 0x61, 0xbf, 0xb8, 0x2b, 0xc7, 0xc2, 0xae, 0x31,
0xf5, 0x07, 0xbf, 0xfe, 0x05, 0x00, 0x00, 0xff, 0xff, 0x53, 0x90, 0x60, 0xf6, 0x0a, 0x01, 0x00,
0x00,
}

29
logical/identity.proto Normal file
View File

@ -0,0 +1,29 @@
syntax = "proto3";
option go_package = "github.com/hashicorp/vault/logical";
package logical;
message Entity {
// ID is the unique identifier for the entity
string ID = 1;
// Name is the human-friendly unique identifier for the entity
string name = 2;
// Aliases contains thhe alias mappings for the given entity
repeated Alias aliases = 3;
}
message Alias {
// MountType is the backend mount's type to which this identity belongs
string mount_type = 1;
// MountAccessor is the identifier of the mount entry to which this
// identity belongs
string mount_accessor = 2;
// Name is the identifier of this identity in its authentication source
string name = 3;
}

View File

@ -132,6 +132,20 @@ func (s *gRPCSystemViewClient) LocalMount() bool {
return reply.Local return reply.Local
} }
func (s *gRPCSystemViewClient) EntityInfo(entityID string) (*logical.Entity, error) {
reply, err := s.client.EntityInfo(context.Background(), &pb.EntityInfoArgs{
EntityID: entityID,
})
if err != nil {
return nil, err
}
if reply.Err != "" {
return nil, errors.New(reply.Err)
}
return reply.Entity, nil
}
type gRPCSystemViewServer struct { type gRPCSystemViewServer struct {
impl logical.SystemView impl logical.SystemView
} }
@ -216,3 +230,15 @@ func (s *gRPCSystemViewServer) LocalMount(ctx context.Context, _ *pb.Empty) (*pb
Local: local, Local: local,
}, nil }, nil
} }
func (s *gRPCSystemViewServer) EntityInfo(ctx context.Context, args *pb.EntityInfoArgs) (*pb.EntityInfoReply, error) {
entity, err := s.impl.EntityInfo(args.EntityID)
if err != nil {
return &pb.EntityInfoReply{
Err: pb.ErrToString(err),
}, nil
}
return &pb.EntityInfoReply{
Entity: entity,
}, nil
}

View File

@ -164,3 +164,26 @@ func TestSystem_GRPC_mlockEnabled(t *testing.T) {
t.Fatalf("expected: %v, got: %v", expected, actual) t.Fatalf("expected: %v, got: %v", expected, actual)
} }
} }
func TestSystem_GRPC_entityInfo(t *testing.T) {
sys := logical.TestSystemView()
sys.EntityVal = &logical.Entity{
ID: "id",
Name: "name",
}
client, _ := plugin.TestGRPCConn(t, func(s *grpc.Server) {
pb.RegisterSystemViewServer(s, &gRPCSystemViewServer{
impl: sys,
})
})
defer client.Close()
testSystemView := newGRPCSystemView(client)
actual, err := testSystemView.EntityInfo("")
if err != nil {
t.Fatal(err)
}
if sys.EntityVal.ID != actual.ID || sys.EntityVal.Name != actual.Name {
t.Fatalf("expected: %v, got: %v", sys.EntityVal, actual)
}
}

View File

@ -7,6 +7,7 @@ import proto "github.com/golang/protobuf/proto"
import fmt "fmt" import fmt "fmt"
import math "math" import math "math"
import timestamp "github.com/golang/protobuf/ptypes/timestamp" import timestamp "github.com/golang/protobuf/ptypes/timestamp"
import logical "github.com/hashicorp/vault/logical"
import ( import (
context "golang.org/x/net/context" context "golang.org/x/net/context"
@ -34,7 +35,7 @@ func (m *Empty) Reset() { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) } func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage() {} func (*Empty) ProtoMessage() {}
func (*Empty) Descriptor() ([]byte, []int) { func (*Empty) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{0} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{0}
} }
func (m *Empty) XXX_Unmarshal(b []byte) error { func (m *Empty) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Empty.Unmarshal(m, b) return xxx_messageInfo_Empty.Unmarshal(m, b)
@ -65,7 +66,7 @@ func (m *Header) Reset() { *m = Header{} }
func (m *Header) String() string { return proto.CompactTextString(m) } func (m *Header) String() string { return proto.CompactTextString(m) }
func (*Header) ProtoMessage() {} func (*Header) ProtoMessage() {}
func (*Header) Descriptor() ([]byte, []int) { func (*Header) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{1} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{1}
} }
func (m *Header) XXX_Unmarshal(b []byte) error { func (m *Header) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Header.Unmarshal(m, b) return xxx_messageInfo_Header.Unmarshal(m, b)
@ -116,7 +117,7 @@ func (m *ProtoError) Reset() { *m = ProtoError{} }
func (m *ProtoError) String() string { return proto.CompactTextString(m) } func (m *ProtoError) String() string { return proto.CompactTextString(m) }
func (*ProtoError) ProtoMessage() {} func (*ProtoError) ProtoMessage() {}
func (*ProtoError) Descriptor() ([]byte, []int) { func (*ProtoError) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{2} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{2}
} }
func (m *ProtoError) XXX_Unmarshal(b []byte) error { func (m *ProtoError) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ProtoError.Unmarshal(m, b) return xxx_messageInfo_ProtoError.Unmarshal(m, b)
@ -179,7 +180,7 @@ func (m *Paths) Reset() { *m = Paths{} }
func (m *Paths) String() string { return proto.CompactTextString(m) } func (m *Paths) String() string { return proto.CompactTextString(m) }
func (*Paths) ProtoMessage() {} func (*Paths) ProtoMessage() {}
func (*Paths) Descriptor() ([]byte, []int) { func (*Paths) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{3} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{3}
} }
func (m *Paths) XXX_Unmarshal(b []byte) error { func (m *Paths) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Paths.Unmarshal(m, b) return xxx_messageInfo_Paths.Unmarshal(m, b)
@ -303,7 +304,7 @@ func (m *Request) Reset() { *m = Request{} }
func (m *Request) String() string { return proto.CompactTextString(m) } func (m *Request) String() string { return proto.CompactTextString(m) }
func (*Request) ProtoMessage() {} func (*Request) ProtoMessage() {}
func (*Request) Descriptor() ([]byte, []int) { func (*Request) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{4} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{4}
} }
func (m *Request) XXX_Unmarshal(b []byte) error { func (m *Request) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Request.Unmarshal(m, b) return xxx_messageInfo_Request.Unmarshal(m, b)
@ -463,64 +464,6 @@ func (m *Request) GetConnection() *Connection {
return nil return nil
} }
type Alias struct {
// MountType is the backend mount's type to which this identity belongs
MountType string `sentinel:"" protobuf:"bytes,1,opt,name=mount_type,json=mountType" json:"mount_type,omitempty"`
// MountAccessor is the identifier of the mount entry to which this
// identity belongs
MountAccessor string `sentinel:"" protobuf:"bytes,2,opt,name=mount_accessor,json=mountAccessor" json:"mount_accessor,omitempty"`
// Name is the identifier of this identity in its authentication source
Name string `sentinel:"" protobuf:"bytes,3,opt,name=name" json:"name,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Alias) Reset() { *m = Alias{} }
func (m *Alias) String() string { return proto.CompactTextString(m) }
func (*Alias) ProtoMessage() {}
func (*Alias) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{5}
}
func (m *Alias) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Alias.Unmarshal(m, b)
}
func (m *Alias) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Alias.Marshal(b, m, deterministic)
}
func (dst *Alias) XXX_Merge(src proto.Message) {
xxx_messageInfo_Alias.Merge(dst, src)
}
func (m *Alias) XXX_Size() int {
return xxx_messageInfo_Alias.Size(m)
}
func (m *Alias) XXX_DiscardUnknown() {
xxx_messageInfo_Alias.DiscardUnknown(m)
}
var xxx_messageInfo_Alias proto.InternalMessageInfo
func (m *Alias) GetMountType() string {
if m != nil {
return m.MountType
}
return ""
}
func (m *Alias) GetMountAccessor() string {
if m != nil {
return m.MountAccessor
}
return ""
}
func (m *Alias) GetName() string {
if m != nil {
return m.Name
}
return ""
}
type Auth struct { type Auth struct {
LeaseOptions *LeaseOptions `sentinel:"" protobuf:"bytes,1,opt,name=lease_options,json=leaseOptions" json:"lease_options,omitempty"` LeaseOptions *LeaseOptions `sentinel:"" protobuf:"bytes,1,opt,name=lease_options,json=leaseOptions" json:"lease_options,omitempty"`
// InternalData is a JSON object that is stored with the auth struct. // InternalData is a JSON object that is stored with the auth struct.
@ -562,12 +505,12 @@ type Auth struct {
EntityID string `sentinel:"" protobuf:"bytes,10,opt,name=entity_id,json=entityId" json:"entity_id,omitempty"` EntityID string `sentinel:"" protobuf:"bytes,10,opt,name=entity_id,json=entityId" json:"entity_id,omitempty"`
// Alias is the information about the authenticated client returned by // Alias is the information about the authenticated client returned by
// the auth backend // the auth backend
Alias *Alias `sentinel:"" protobuf:"bytes,11,opt,name=alias" json:"alias,omitempty"` Alias *logical.Alias `sentinel:"" protobuf:"bytes,11,opt,name=alias" json:"alias,omitempty"`
// GroupAliases are the informational mappings of external groups which an // GroupAliases are the informational mappings of external groups which an
// authenticated user belongs to. This is used to check if there are // authenticated user belongs to. This is used to check if there are
// mappings groups for the group aliases in identity store. For all the // mappings groups for the group aliases in identity store. For all the
// matching groups, the entity ID of the user will be added. // matching groups, the entity ID of the user will be added.
GroupAliases []*Alias `sentinel:"" protobuf:"bytes,12,rep,name=group_aliases,json=groupAliases" json:"group_aliases,omitempty"` GroupAliases []*logical.Alias `sentinel:"" protobuf:"bytes,12,rep,name=group_aliases,json=groupAliases" json:"group_aliases,omitempty"`
// If set, restricts usage of the certificates to client IPs falling within // If set, restricts usage of the certificates to client IPs falling within
// the range of the specified CIDR(s). // the range of the specified CIDR(s).
BoundCidrs []string `sentinel:"" protobuf:"bytes,13,rep,name=bound_cidrs,json=boundCidrs" json:"bound_cidrs,omitempty"` BoundCidrs []string `sentinel:"" protobuf:"bytes,13,rep,name=bound_cidrs,json=boundCidrs" json:"bound_cidrs,omitempty"`
@ -580,7 +523,7 @@ func (m *Auth) Reset() { *m = Auth{} }
func (m *Auth) String() string { return proto.CompactTextString(m) } func (m *Auth) String() string { return proto.CompactTextString(m) }
func (*Auth) ProtoMessage() {} func (*Auth) ProtoMessage() {}
func (*Auth) Descriptor() ([]byte, []int) { func (*Auth) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{6} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{5}
} }
func (m *Auth) XXX_Unmarshal(b []byte) error { func (m *Auth) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Auth.Unmarshal(m, b) return xxx_messageInfo_Auth.Unmarshal(m, b)
@ -670,14 +613,14 @@ func (m *Auth) GetEntityID() string {
return "" return ""
} }
func (m *Auth) GetAlias() *Alias { func (m *Auth) GetAlias() *logical.Alias {
if m != nil { if m != nil {
return m.Alias return m.Alias
} }
return nil return nil
} }
func (m *Auth) GetGroupAliases() []*Alias { func (m *Auth) GetGroupAliases() []*logical.Alias {
if m != nil { if m != nil {
return m.GroupAliases return m.GroupAliases
} }
@ -706,7 +649,7 @@ func (m *LeaseOptions) Reset() { *m = LeaseOptions{} }
func (m *LeaseOptions) String() string { return proto.CompactTextString(m) } func (m *LeaseOptions) String() string { return proto.CompactTextString(m) }
func (*LeaseOptions) ProtoMessage() {} func (*LeaseOptions) ProtoMessage() {}
func (*LeaseOptions) Descriptor() ([]byte, []int) { func (*LeaseOptions) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{7} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{6}
} }
func (m *LeaseOptions) XXX_Unmarshal(b []byte) error { func (m *LeaseOptions) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LeaseOptions.Unmarshal(m, b) return xxx_messageInfo_LeaseOptions.Unmarshal(m, b)
@ -780,7 +723,7 @@ func (m *Secret) Reset() { *m = Secret{} }
func (m *Secret) String() string { return proto.CompactTextString(m) } func (m *Secret) String() string { return proto.CompactTextString(m) }
func (*Secret) ProtoMessage() {} func (*Secret) ProtoMessage() {}
func (*Secret) Descriptor() ([]byte, []int) { func (*Secret) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{8} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{7}
} }
func (m *Secret) XXX_Unmarshal(b []byte) error { func (m *Secret) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Secret.Unmarshal(m, b) return xxx_messageInfo_Secret.Unmarshal(m, b)
@ -851,7 +794,7 @@ func (m *Response) Reset() { *m = Response{} }
func (m *Response) String() string { return proto.CompactTextString(m) } func (m *Response) String() string { return proto.CompactTextString(m) }
func (*Response) ProtoMessage() {} func (*Response) ProtoMessage() {}
func (*Response) Descriptor() ([]byte, []int) { func (*Response) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{9} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{8}
} }
func (m *Response) XXX_Unmarshal(b []byte) error { func (m *Response) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Response.Unmarshal(m, b) return xxx_messageInfo_Response.Unmarshal(m, b)
@ -946,7 +889,7 @@ func (m *ResponseWrapInfo) Reset() { *m = ResponseWrapInfo{} }
func (m *ResponseWrapInfo) String() string { return proto.CompactTextString(m) } func (m *ResponseWrapInfo) String() string { return proto.CompactTextString(m) }
func (*ResponseWrapInfo) ProtoMessage() {} func (*ResponseWrapInfo) ProtoMessage() {}
func (*ResponseWrapInfo) Descriptor() ([]byte, []int) { func (*ResponseWrapInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{10} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{9}
} }
func (m *ResponseWrapInfo) XXX_Unmarshal(b []byte) error { func (m *ResponseWrapInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResponseWrapInfo.Unmarshal(m, b) return xxx_messageInfo_ResponseWrapInfo.Unmarshal(m, b)
@ -1048,7 +991,7 @@ func (m *RequestWrapInfo) Reset() { *m = RequestWrapInfo{} }
func (m *RequestWrapInfo) String() string { return proto.CompactTextString(m) } func (m *RequestWrapInfo) String() string { return proto.CompactTextString(m) }
func (*RequestWrapInfo) ProtoMessage() {} func (*RequestWrapInfo) ProtoMessage() {}
func (*RequestWrapInfo) Descriptor() ([]byte, []int) { func (*RequestWrapInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{11} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{10}
} }
func (m *RequestWrapInfo) XXX_Unmarshal(b []byte) error { func (m *RequestWrapInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RequestWrapInfo.Unmarshal(m, b) return xxx_messageInfo_RequestWrapInfo.Unmarshal(m, b)
@ -1102,7 +1045,7 @@ func (m *HandleRequestArgs) Reset() { *m = HandleRequestArgs{} }
func (m *HandleRequestArgs) String() string { return proto.CompactTextString(m) } func (m *HandleRequestArgs) String() string { return proto.CompactTextString(m) }
func (*HandleRequestArgs) ProtoMessage() {} func (*HandleRequestArgs) ProtoMessage() {}
func (*HandleRequestArgs) Descriptor() ([]byte, []int) { func (*HandleRequestArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{12} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{11}
} }
func (m *HandleRequestArgs) XXX_Unmarshal(b []byte) error { func (m *HandleRequestArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_HandleRequestArgs.Unmarshal(m, b) return xxx_messageInfo_HandleRequestArgs.Unmarshal(m, b)
@ -1149,7 +1092,7 @@ func (m *HandleRequestReply) Reset() { *m = HandleRequestReply{} }
func (m *HandleRequestReply) String() string { return proto.CompactTextString(m) } func (m *HandleRequestReply) String() string { return proto.CompactTextString(m) }
func (*HandleRequestReply) ProtoMessage() {} func (*HandleRequestReply) ProtoMessage() {}
func (*HandleRequestReply) Descriptor() ([]byte, []int) { func (*HandleRequestReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{13} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{12}
} }
func (m *HandleRequestReply) XXX_Unmarshal(b []byte) error { func (m *HandleRequestReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_HandleRequestReply.Unmarshal(m, b) return xxx_messageInfo_HandleRequestReply.Unmarshal(m, b)
@ -1195,7 +1138,7 @@ func (m *SpecialPathsReply) Reset() { *m = SpecialPathsReply{} }
func (m *SpecialPathsReply) String() string { return proto.CompactTextString(m) } func (m *SpecialPathsReply) String() string { return proto.CompactTextString(m) }
func (*SpecialPathsReply) ProtoMessage() {} func (*SpecialPathsReply) ProtoMessage() {}
func (*SpecialPathsReply) Descriptor() ([]byte, []int) { func (*SpecialPathsReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{14} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{13}
} }
func (m *SpecialPathsReply) XXX_Unmarshal(b []byte) error { func (m *SpecialPathsReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SpecialPathsReply.Unmarshal(m, b) return xxx_messageInfo_SpecialPathsReply.Unmarshal(m, b)
@ -1235,7 +1178,7 @@ func (m *HandleExistenceCheckArgs) Reset() { *m = HandleExistenceCheckAr
func (m *HandleExistenceCheckArgs) String() string { return proto.CompactTextString(m) } func (m *HandleExistenceCheckArgs) String() string { return proto.CompactTextString(m) }
func (*HandleExistenceCheckArgs) ProtoMessage() {} func (*HandleExistenceCheckArgs) ProtoMessage() {}
func (*HandleExistenceCheckArgs) Descriptor() ([]byte, []int) { func (*HandleExistenceCheckArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{15} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{14}
} }
func (m *HandleExistenceCheckArgs) XXX_Unmarshal(b []byte) error { func (m *HandleExistenceCheckArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_HandleExistenceCheckArgs.Unmarshal(m, b) return xxx_messageInfo_HandleExistenceCheckArgs.Unmarshal(m, b)
@ -1283,7 +1226,7 @@ func (m *HandleExistenceCheckReply) Reset() { *m = HandleExistenceCheckR
func (m *HandleExistenceCheckReply) String() string { return proto.CompactTextString(m) } func (m *HandleExistenceCheckReply) String() string { return proto.CompactTextString(m) }
func (*HandleExistenceCheckReply) ProtoMessage() {} func (*HandleExistenceCheckReply) ProtoMessage() {}
func (*HandleExistenceCheckReply) Descriptor() ([]byte, []int) { func (*HandleExistenceCheckReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{16} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{15}
} }
func (m *HandleExistenceCheckReply) XXX_Unmarshal(b []byte) error { func (m *HandleExistenceCheckReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_HandleExistenceCheckReply.Unmarshal(m, b) return xxx_messageInfo_HandleExistenceCheckReply.Unmarshal(m, b)
@ -1338,7 +1281,7 @@ func (m *SetupArgs) Reset() { *m = SetupArgs{} }
func (m *SetupArgs) String() string { return proto.CompactTextString(m) } func (m *SetupArgs) String() string { return proto.CompactTextString(m) }
func (*SetupArgs) ProtoMessage() {} func (*SetupArgs) ProtoMessage() {}
func (*SetupArgs) Descriptor() ([]byte, []int) { func (*SetupArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{17} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{16}
} }
func (m *SetupArgs) XXX_Unmarshal(b []byte) error { func (m *SetupArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SetupArgs.Unmarshal(m, b) return xxx_messageInfo_SetupArgs.Unmarshal(m, b)
@ -1391,7 +1334,7 @@ func (m *SetupReply) Reset() { *m = SetupReply{} }
func (m *SetupReply) String() string { return proto.CompactTextString(m) } func (m *SetupReply) String() string { return proto.CompactTextString(m) }
func (*SetupReply) ProtoMessage() {} func (*SetupReply) ProtoMessage() {}
func (*SetupReply) Descriptor() ([]byte, []int) { func (*SetupReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{18} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{17}
} }
func (m *SetupReply) XXX_Unmarshal(b []byte) error { func (m *SetupReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SetupReply.Unmarshal(m, b) return xxx_messageInfo_SetupReply.Unmarshal(m, b)
@ -1430,7 +1373,7 @@ func (m *TypeReply) Reset() { *m = TypeReply{} }
func (m *TypeReply) String() string { return proto.CompactTextString(m) } func (m *TypeReply) String() string { return proto.CompactTextString(m) }
func (*TypeReply) ProtoMessage() {} func (*TypeReply) ProtoMessage() {}
func (*TypeReply) Descriptor() ([]byte, []int) { func (*TypeReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{19} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{18}
} }
func (m *TypeReply) XXX_Unmarshal(b []byte) error { func (m *TypeReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TypeReply.Unmarshal(m, b) return xxx_messageInfo_TypeReply.Unmarshal(m, b)
@ -1468,7 +1411,7 @@ func (m *InvalidateKeyArgs) Reset() { *m = InvalidateKeyArgs{} }
func (m *InvalidateKeyArgs) String() string { return proto.CompactTextString(m) } func (m *InvalidateKeyArgs) String() string { return proto.CompactTextString(m) }
func (*InvalidateKeyArgs) ProtoMessage() {} func (*InvalidateKeyArgs) ProtoMessage() {}
func (*InvalidateKeyArgs) Descriptor() ([]byte, []int) { func (*InvalidateKeyArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{20} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{19}
} }
func (m *InvalidateKeyArgs) XXX_Unmarshal(b []byte) error { func (m *InvalidateKeyArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InvalidateKeyArgs.Unmarshal(m, b) return xxx_messageInfo_InvalidateKeyArgs.Unmarshal(m, b)
@ -1508,7 +1451,7 @@ func (m *StorageEntry) Reset() { *m = StorageEntry{} }
func (m *StorageEntry) String() string { return proto.CompactTextString(m) } func (m *StorageEntry) String() string { return proto.CompactTextString(m) }
func (*StorageEntry) ProtoMessage() {} func (*StorageEntry) ProtoMessage() {}
func (*StorageEntry) Descriptor() ([]byte, []int) { func (*StorageEntry) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{21} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{20}
} }
func (m *StorageEntry) XXX_Unmarshal(b []byte) error { func (m *StorageEntry) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageEntry.Unmarshal(m, b) return xxx_messageInfo_StorageEntry.Unmarshal(m, b)
@ -1560,7 +1503,7 @@ func (m *StorageListArgs) Reset() { *m = StorageListArgs{} }
func (m *StorageListArgs) String() string { return proto.CompactTextString(m) } func (m *StorageListArgs) String() string { return proto.CompactTextString(m) }
func (*StorageListArgs) ProtoMessage() {} func (*StorageListArgs) ProtoMessage() {}
func (*StorageListArgs) Descriptor() ([]byte, []int) { func (*StorageListArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{22} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{21}
} }
func (m *StorageListArgs) XXX_Unmarshal(b []byte) error { func (m *StorageListArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageListArgs.Unmarshal(m, b) return xxx_messageInfo_StorageListArgs.Unmarshal(m, b)
@ -1599,7 +1542,7 @@ func (m *StorageListReply) Reset() { *m = StorageListReply{} }
func (m *StorageListReply) String() string { return proto.CompactTextString(m) } func (m *StorageListReply) String() string { return proto.CompactTextString(m) }
func (*StorageListReply) ProtoMessage() {} func (*StorageListReply) ProtoMessage() {}
func (*StorageListReply) Descriptor() ([]byte, []int) { func (*StorageListReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{23} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{22}
} }
func (m *StorageListReply) XXX_Unmarshal(b []byte) error { func (m *StorageListReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageListReply.Unmarshal(m, b) return xxx_messageInfo_StorageListReply.Unmarshal(m, b)
@ -1644,7 +1587,7 @@ func (m *StorageGetArgs) Reset() { *m = StorageGetArgs{} }
func (m *StorageGetArgs) String() string { return proto.CompactTextString(m) } func (m *StorageGetArgs) String() string { return proto.CompactTextString(m) }
func (*StorageGetArgs) ProtoMessage() {} func (*StorageGetArgs) ProtoMessage() {}
func (*StorageGetArgs) Descriptor() ([]byte, []int) { func (*StorageGetArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{24} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{23}
} }
func (m *StorageGetArgs) XXX_Unmarshal(b []byte) error { func (m *StorageGetArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageGetArgs.Unmarshal(m, b) return xxx_messageInfo_StorageGetArgs.Unmarshal(m, b)
@ -1683,7 +1626,7 @@ func (m *StorageGetReply) Reset() { *m = StorageGetReply{} }
func (m *StorageGetReply) String() string { return proto.CompactTextString(m) } func (m *StorageGetReply) String() string { return proto.CompactTextString(m) }
func (*StorageGetReply) ProtoMessage() {} func (*StorageGetReply) ProtoMessage() {}
func (*StorageGetReply) Descriptor() ([]byte, []int) { func (*StorageGetReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{25} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{24}
} }
func (m *StorageGetReply) XXX_Unmarshal(b []byte) error { func (m *StorageGetReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageGetReply.Unmarshal(m, b) return xxx_messageInfo_StorageGetReply.Unmarshal(m, b)
@ -1728,7 +1671,7 @@ func (m *StoragePutArgs) Reset() { *m = StoragePutArgs{} }
func (m *StoragePutArgs) String() string { return proto.CompactTextString(m) } func (m *StoragePutArgs) String() string { return proto.CompactTextString(m) }
func (*StoragePutArgs) ProtoMessage() {} func (*StoragePutArgs) ProtoMessage() {}
func (*StoragePutArgs) Descriptor() ([]byte, []int) { func (*StoragePutArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{26} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{25}
} }
func (m *StoragePutArgs) XXX_Unmarshal(b []byte) error { func (m *StoragePutArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StoragePutArgs.Unmarshal(m, b) return xxx_messageInfo_StoragePutArgs.Unmarshal(m, b)
@ -1766,7 +1709,7 @@ func (m *StoragePutReply) Reset() { *m = StoragePutReply{} }
func (m *StoragePutReply) String() string { return proto.CompactTextString(m) } func (m *StoragePutReply) String() string { return proto.CompactTextString(m) }
func (*StoragePutReply) ProtoMessage() {} func (*StoragePutReply) ProtoMessage() {}
func (*StoragePutReply) Descriptor() ([]byte, []int) { func (*StoragePutReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{27} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{26}
} }
func (m *StoragePutReply) XXX_Unmarshal(b []byte) error { func (m *StoragePutReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StoragePutReply.Unmarshal(m, b) return xxx_messageInfo_StoragePutReply.Unmarshal(m, b)
@ -1804,7 +1747,7 @@ func (m *StorageDeleteArgs) Reset() { *m = StorageDeleteArgs{} }
func (m *StorageDeleteArgs) String() string { return proto.CompactTextString(m) } func (m *StorageDeleteArgs) String() string { return proto.CompactTextString(m) }
func (*StorageDeleteArgs) ProtoMessage() {} func (*StorageDeleteArgs) ProtoMessage() {}
func (*StorageDeleteArgs) Descriptor() ([]byte, []int) { func (*StorageDeleteArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{28} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{27}
} }
func (m *StorageDeleteArgs) XXX_Unmarshal(b []byte) error { func (m *StorageDeleteArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageDeleteArgs.Unmarshal(m, b) return xxx_messageInfo_StorageDeleteArgs.Unmarshal(m, b)
@ -1842,7 +1785,7 @@ func (m *StorageDeleteReply) Reset() { *m = StorageDeleteReply{} }
func (m *StorageDeleteReply) String() string { return proto.CompactTextString(m) } func (m *StorageDeleteReply) String() string { return proto.CompactTextString(m) }
func (*StorageDeleteReply) ProtoMessage() {} func (*StorageDeleteReply) ProtoMessage() {}
func (*StorageDeleteReply) Descriptor() ([]byte, []int) { func (*StorageDeleteReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{29} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{28}
} }
func (m *StorageDeleteReply) XXX_Unmarshal(b []byte) error { func (m *StorageDeleteReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageDeleteReply.Unmarshal(m, b) return xxx_messageInfo_StorageDeleteReply.Unmarshal(m, b)
@ -1880,7 +1823,7 @@ func (m *TTLReply) Reset() { *m = TTLReply{} }
func (m *TTLReply) String() string { return proto.CompactTextString(m) } func (m *TTLReply) String() string { return proto.CompactTextString(m) }
func (*TTLReply) ProtoMessage() {} func (*TTLReply) ProtoMessage() {}
func (*TTLReply) Descriptor() ([]byte, []int) { func (*TTLReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{30} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{29}
} }
func (m *TTLReply) XXX_Unmarshal(b []byte) error { func (m *TTLReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TTLReply.Unmarshal(m, b) return xxx_messageInfo_TTLReply.Unmarshal(m, b)
@ -1919,7 +1862,7 @@ func (m *SudoPrivilegeArgs) Reset() { *m = SudoPrivilegeArgs{} }
func (m *SudoPrivilegeArgs) String() string { return proto.CompactTextString(m) } func (m *SudoPrivilegeArgs) String() string { return proto.CompactTextString(m) }
func (*SudoPrivilegeArgs) ProtoMessage() {} func (*SudoPrivilegeArgs) ProtoMessage() {}
func (*SudoPrivilegeArgs) Descriptor() ([]byte, []int) { func (*SudoPrivilegeArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{31} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{30}
} }
func (m *SudoPrivilegeArgs) XXX_Unmarshal(b []byte) error { func (m *SudoPrivilegeArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SudoPrivilegeArgs.Unmarshal(m, b) return xxx_messageInfo_SudoPrivilegeArgs.Unmarshal(m, b)
@ -1964,7 +1907,7 @@ func (m *SudoPrivilegeReply) Reset() { *m = SudoPrivilegeReply{} }
func (m *SudoPrivilegeReply) String() string { return proto.CompactTextString(m) } func (m *SudoPrivilegeReply) String() string { return proto.CompactTextString(m) }
func (*SudoPrivilegeReply) ProtoMessage() {} func (*SudoPrivilegeReply) ProtoMessage() {}
func (*SudoPrivilegeReply) Descriptor() ([]byte, []int) { func (*SudoPrivilegeReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{32} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{31}
} }
func (m *SudoPrivilegeReply) XXX_Unmarshal(b []byte) error { func (m *SudoPrivilegeReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SudoPrivilegeReply.Unmarshal(m, b) return xxx_messageInfo_SudoPrivilegeReply.Unmarshal(m, b)
@ -2002,7 +1945,7 @@ func (m *TaintedReply) Reset() { *m = TaintedReply{} }
func (m *TaintedReply) String() string { return proto.CompactTextString(m) } func (m *TaintedReply) String() string { return proto.CompactTextString(m) }
func (*TaintedReply) ProtoMessage() {} func (*TaintedReply) ProtoMessage() {}
func (*TaintedReply) Descriptor() ([]byte, []int) { func (*TaintedReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{33} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{32}
} }
func (m *TaintedReply) XXX_Unmarshal(b []byte) error { func (m *TaintedReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaintedReply.Unmarshal(m, b) return xxx_messageInfo_TaintedReply.Unmarshal(m, b)
@ -2040,7 +1983,7 @@ func (m *CachingDisabledReply) Reset() { *m = CachingDisabledReply{} }
func (m *CachingDisabledReply) String() string { return proto.CompactTextString(m) } func (m *CachingDisabledReply) String() string { return proto.CompactTextString(m) }
func (*CachingDisabledReply) ProtoMessage() {} func (*CachingDisabledReply) ProtoMessage() {}
func (*CachingDisabledReply) Descriptor() ([]byte, []int) { func (*CachingDisabledReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{34} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{33}
} }
func (m *CachingDisabledReply) XXX_Unmarshal(b []byte) error { func (m *CachingDisabledReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CachingDisabledReply.Unmarshal(m, b) return xxx_messageInfo_CachingDisabledReply.Unmarshal(m, b)
@ -2078,7 +2021,7 @@ func (m *ReplicationStateReply) Reset() { *m = ReplicationStateReply{} }
func (m *ReplicationStateReply) String() string { return proto.CompactTextString(m) } func (m *ReplicationStateReply) String() string { return proto.CompactTextString(m) }
func (*ReplicationStateReply) ProtoMessage() {} func (*ReplicationStateReply) ProtoMessage() {}
func (*ReplicationStateReply) Descriptor() ([]byte, []int) { func (*ReplicationStateReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{35} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{34}
} }
func (m *ReplicationStateReply) XXX_Unmarshal(b []byte) error { func (m *ReplicationStateReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReplicationStateReply.Unmarshal(m, b) return xxx_messageInfo_ReplicationStateReply.Unmarshal(m, b)
@ -2118,7 +2061,7 @@ func (m *ResponseWrapDataArgs) Reset() { *m = ResponseWrapDataArgs{} }
func (m *ResponseWrapDataArgs) String() string { return proto.CompactTextString(m) } func (m *ResponseWrapDataArgs) String() string { return proto.CompactTextString(m) }
func (*ResponseWrapDataArgs) ProtoMessage() {} func (*ResponseWrapDataArgs) ProtoMessage() {}
func (*ResponseWrapDataArgs) Descriptor() ([]byte, []int) { func (*ResponseWrapDataArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{36} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{35}
} }
func (m *ResponseWrapDataArgs) XXX_Unmarshal(b []byte) error { func (m *ResponseWrapDataArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResponseWrapDataArgs.Unmarshal(m, b) return xxx_messageInfo_ResponseWrapDataArgs.Unmarshal(m, b)
@ -2171,7 +2114,7 @@ func (m *ResponseWrapDataReply) Reset() { *m = ResponseWrapDataReply{} }
func (m *ResponseWrapDataReply) String() string { return proto.CompactTextString(m) } func (m *ResponseWrapDataReply) String() string { return proto.CompactTextString(m) }
func (*ResponseWrapDataReply) ProtoMessage() {} func (*ResponseWrapDataReply) ProtoMessage() {}
func (*ResponseWrapDataReply) Descriptor() ([]byte, []int) { func (*ResponseWrapDataReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{37} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{36}
} }
func (m *ResponseWrapDataReply) XXX_Unmarshal(b []byte) error { func (m *ResponseWrapDataReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResponseWrapDataReply.Unmarshal(m, b) return xxx_messageInfo_ResponseWrapDataReply.Unmarshal(m, b)
@ -2216,7 +2159,7 @@ func (m *MlockEnabledReply) Reset() { *m = MlockEnabledReply{} }
func (m *MlockEnabledReply) String() string { return proto.CompactTextString(m) } func (m *MlockEnabledReply) String() string { return proto.CompactTextString(m) }
func (*MlockEnabledReply) ProtoMessage() {} func (*MlockEnabledReply) ProtoMessage() {}
func (*MlockEnabledReply) Descriptor() ([]byte, []int) { func (*MlockEnabledReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{38} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{37}
} }
func (m *MlockEnabledReply) XXX_Unmarshal(b []byte) error { func (m *MlockEnabledReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MlockEnabledReply.Unmarshal(m, b) return xxx_messageInfo_MlockEnabledReply.Unmarshal(m, b)
@ -2254,7 +2197,7 @@ func (m *LocalMountReply) Reset() { *m = LocalMountReply{} }
func (m *LocalMountReply) String() string { return proto.CompactTextString(m) } func (m *LocalMountReply) String() string { return proto.CompactTextString(m) }
func (*LocalMountReply) ProtoMessage() {} func (*LocalMountReply) ProtoMessage() {}
func (*LocalMountReply) Descriptor() ([]byte, []int) { func (*LocalMountReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{39} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{38}
} }
func (m *LocalMountReply) XXX_Unmarshal(b []byte) error { func (m *LocalMountReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LocalMountReply.Unmarshal(m, b) return xxx_messageInfo_LocalMountReply.Unmarshal(m, b)
@ -2281,6 +2224,90 @@ func (m *LocalMountReply) GetLocal() bool {
return false return false
} }
type EntityInfoArgs struct {
EntityID string `sentinel:"" protobuf:"bytes,1,opt,name=entity_id,json=entityId" json:"entity_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *EntityInfoArgs) Reset() { *m = EntityInfoArgs{} }
func (m *EntityInfoArgs) String() string { return proto.CompactTextString(m) }
func (*EntityInfoArgs) ProtoMessage() {}
func (*EntityInfoArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_5a7f5d2f43604fb6, []int{39}
}
func (m *EntityInfoArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_EntityInfoArgs.Unmarshal(m, b)
}
func (m *EntityInfoArgs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_EntityInfoArgs.Marshal(b, m, deterministic)
}
func (dst *EntityInfoArgs) XXX_Merge(src proto.Message) {
xxx_messageInfo_EntityInfoArgs.Merge(dst, src)
}
func (m *EntityInfoArgs) XXX_Size() int {
return xxx_messageInfo_EntityInfoArgs.Size(m)
}
func (m *EntityInfoArgs) XXX_DiscardUnknown() {
xxx_messageInfo_EntityInfoArgs.DiscardUnknown(m)
}
var xxx_messageInfo_EntityInfoArgs proto.InternalMessageInfo
func (m *EntityInfoArgs) GetEntityID() string {
if m != nil {
return m.EntityID
}
return ""
}
type EntityInfoReply struct {
Entity *logical.Entity `sentinel:"" protobuf:"bytes,1,opt,name=entity" json:"entity,omitempty"`
Err string `sentinel:"" protobuf:"bytes,2,opt,name=err" json:"err,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *EntityInfoReply) Reset() { *m = EntityInfoReply{} }
func (m *EntityInfoReply) String() string { return proto.CompactTextString(m) }
func (*EntityInfoReply) ProtoMessage() {}
func (*EntityInfoReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_5a7f5d2f43604fb6, []int{40}
}
func (m *EntityInfoReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_EntityInfoReply.Unmarshal(m, b)
}
func (m *EntityInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_EntityInfoReply.Marshal(b, m, deterministic)
}
func (dst *EntityInfoReply) XXX_Merge(src proto.Message) {
xxx_messageInfo_EntityInfoReply.Merge(dst, src)
}
func (m *EntityInfoReply) XXX_Size() int {
return xxx_messageInfo_EntityInfoReply.Size(m)
}
func (m *EntityInfoReply) XXX_DiscardUnknown() {
xxx_messageInfo_EntityInfoReply.DiscardUnknown(m)
}
var xxx_messageInfo_EntityInfoReply proto.InternalMessageInfo
func (m *EntityInfoReply) GetEntity() *logical.Entity {
if m != nil {
return m.Entity
}
return nil
}
func (m *EntityInfoReply) GetErr() string {
if m != nil {
return m.Err
}
return ""
}
type Connection struct { type Connection struct {
// RemoteAddr is the network address that sent the request. // RemoteAddr is the network address that sent the request.
RemoteAddr string `sentinel:"" protobuf:"bytes,1,opt,name=remote_addr,json=remoteAddr" json:"remote_addr,omitempty"` RemoteAddr string `sentinel:"" protobuf:"bytes,1,opt,name=remote_addr,json=remoteAddr" json:"remote_addr,omitempty"`
@ -2293,7 +2320,7 @@ func (m *Connection) Reset() { *m = Connection{} }
func (m *Connection) String() string { return proto.CompactTextString(m) } func (m *Connection) String() string { return proto.CompactTextString(m) }
func (*Connection) ProtoMessage() {} func (*Connection) ProtoMessage() {}
func (*Connection) Descriptor() ([]byte, []int) { func (*Connection) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_a4dea436a6c1c127, []int{40} return fileDescriptor_backend_5a7f5d2f43604fb6, []int{41}
} }
func (m *Connection) XXX_Unmarshal(b []byte) error { func (m *Connection) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Connection.Unmarshal(m, b) return xxx_messageInfo_Connection.Unmarshal(m, b)
@ -2327,7 +2354,6 @@ func init() {
proto.RegisterType((*Paths)(nil), "pb.Paths") proto.RegisterType((*Paths)(nil), "pb.Paths")
proto.RegisterType((*Request)(nil), "pb.Request") proto.RegisterType((*Request)(nil), "pb.Request")
proto.RegisterMapType((map[string]*Header)(nil), "pb.Request.HeadersEntry") proto.RegisterMapType((map[string]*Header)(nil), "pb.Request.HeadersEntry")
proto.RegisterType((*Alias)(nil), "pb.Alias")
proto.RegisterType((*Auth)(nil), "pb.Auth") proto.RegisterType((*Auth)(nil), "pb.Auth")
proto.RegisterMapType((map[string]string)(nil), "pb.Auth.MetadataEntry") proto.RegisterMapType((map[string]string)(nil), "pb.Auth.MetadataEntry")
proto.RegisterType((*LeaseOptions)(nil), "pb.LeaseOptions") proto.RegisterType((*LeaseOptions)(nil), "pb.LeaseOptions")
@ -2364,6 +2390,8 @@ func init() {
proto.RegisterType((*ResponseWrapDataReply)(nil), "pb.ResponseWrapDataReply") proto.RegisterType((*ResponseWrapDataReply)(nil), "pb.ResponseWrapDataReply")
proto.RegisterType((*MlockEnabledReply)(nil), "pb.MlockEnabledReply") proto.RegisterType((*MlockEnabledReply)(nil), "pb.MlockEnabledReply")
proto.RegisterType((*LocalMountReply)(nil), "pb.LocalMountReply") proto.RegisterType((*LocalMountReply)(nil), "pb.LocalMountReply")
proto.RegisterType((*EntityInfoArgs)(nil), "pb.EntityInfoArgs")
proto.RegisterType((*EntityInfoReply)(nil), "pb.EntityInfoReply")
proto.RegisterType((*Connection)(nil), "pb.Connection") proto.RegisterType((*Connection)(nil), "pb.Connection")
} }
@ -2886,6 +2914,8 @@ type SystemViewClient interface {
// LocalMount, when run from a system view attached to a request, indicates // LocalMount, when run from a system view attached to a request, indicates
// whether the request is affecting a local mount or not // whether the request is affecting a local mount or not
LocalMount(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*LocalMountReply, error) LocalMount(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*LocalMountReply, error)
// EntityInfo returns the basic entity information for the given entity id
EntityInfo(ctx context.Context, in *EntityInfoArgs, opts ...grpc.CallOption) (*EntityInfoReply, error)
} }
type systemViewClient struct { type systemViewClient struct {
@ -2977,6 +3007,15 @@ func (c *systemViewClient) LocalMount(ctx context.Context, in *Empty, opts ...gr
return out, nil return out, nil
} }
func (c *systemViewClient) EntityInfo(ctx context.Context, in *EntityInfoArgs, opts ...grpc.CallOption) (*EntityInfoReply, error) {
out := new(EntityInfoReply)
err := c.cc.Invoke(ctx, "/pb.SystemView/EntityInfo", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// SystemViewServer is the server API for SystemView service. // SystemViewServer is the server API for SystemView service.
type SystemViewServer interface { type SystemViewServer interface {
// DefaultLeaseTTL returns the default lease TTL set in Vault configuration // DefaultLeaseTTL returns the default lease TTL set in Vault configuration
@ -3011,6 +3050,8 @@ type SystemViewServer interface {
// LocalMount, when run from a system view attached to a request, indicates // LocalMount, when run from a system view attached to a request, indicates
// whether the request is affecting a local mount or not // whether the request is affecting a local mount or not
LocalMount(context.Context, *Empty) (*LocalMountReply, error) LocalMount(context.Context, *Empty) (*LocalMountReply, error)
// EntityInfo returns the basic entity information for the given entity id
EntityInfo(context.Context, *EntityInfoArgs) (*EntityInfoReply, error)
} }
func RegisterSystemViewServer(s *grpc.Server, srv SystemViewServer) { func RegisterSystemViewServer(s *grpc.Server, srv SystemViewServer) {
@ -3179,6 +3220,24 @@ func _SystemView_LocalMount_Handler(srv interface{}, ctx context.Context, dec fu
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _SystemView_EntityInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(EntityInfoArgs)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(SystemViewServer).EntityInfo(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/pb.SystemView/EntityInfo",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(SystemViewServer).EntityInfo(ctx, req.(*EntityInfoArgs))
}
return interceptor(ctx, in, info, handler)
}
var _SystemView_serviceDesc = grpc.ServiceDesc{ var _SystemView_serviceDesc = grpc.ServiceDesc{
ServiceName: "pb.SystemView", ServiceName: "pb.SystemView",
HandlerType: (*SystemViewServer)(nil), HandlerType: (*SystemViewServer)(nil),
@ -3219,149 +3278,155 @@ var _SystemView_serviceDesc = grpc.ServiceDesc{
MethodName: "LocalMount", MethodName: "LocalMount",
Handler: _SystemView_LocalMount_Handler, Handler: _SystemView_LocalMount_Handler,
}, },
{
MethodName: "EntityInfo",
Handler: _SystemView_EntityInfo_Handler,
},
}, },
Streams: []grpc.StreamDesc{}, Streams: []grpc.StreamDesc{},
Metadata: "logical/plugin/pb/backend.proto", Metadata: "logical/plugin/pb/backend.proto",
} }
func init() { func init() {
proto.RegisterFile("logical/plugin/pb/backend.proto", fileDescriptor_backend_a4dea436a6c1c127) proto.RegisterFile("logical/plugin/pb/backend.proto", fileDescriptor_backend_5a7f5d2f43604fb6)
} }
var fileDescriptor_backend_a4dea436a6c1c127 = []byte{ var fileDescriptor_backend_5a7f5d2f43604fb6 = []byte{
// 2134 bytes of a gzipped FileDescriptorProto // 2171 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x5f, 0x6f, 0xdb, 0xc8, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x5f, 0x73, 0xe3, 0x48,
0x11, 0x87, 0x24, 0x4b, 0xa2, 0x46, 0x92, 0xff, 0x6c, 0x7c, 0x29, 0xa3, 0xcb, 0xd5, 0x2a, 0x0f, 0x11, 0x2f, 0xff, 0x97, 0xdb, 0x76, 0x9c, 0xcc, 0x66, 0x83, 0xe2, 0xdd, 0x23, 0x46, 0xc7, 0x66,
0xc9, 0xf9, 0x82, 0x46, 0x49, 0xd4, 0x7f, 0xb9, 0x16, 0x77, 0x85, 0xeb, 0xf8, 0x72, 0xee, 0xc5, 0x7d, 0x5b, 0xac, 0xb3, 0xeb, 0xe3, 0x60, 0x0f, 0xea, 0x8e, 0x0a, 0x49, 0x6e, 0x2f, 0x5c, 0x72,
0x77, 0x06, 0xed, 0xf4, 0x5a, 0xb4, 0x80, 0x6e, 0x4d, 0x8e, 0x65, 0xc2, 0x14, 0xc9, 0x2e, 0x97, 0x97, 0x52, 0xb2, 0x1c, 0x14, 0x54, 0xf9, 0x26, 0x52, 0xc7, 0x51, 0x45, 0x96, 0xc4, 0x68, 0x94,
0x49, 0xf4, 0xd4, 0x0f, 0x51, 0xa0, 0x5f, 0xa3, 0xaf, 0x7d, 0xeb, 0x6b, 0x81, 0x3e, 0xf7, 0x13, 0xac, 0x9f, 0xf8, 0x16, 0x3c, 0x50, 0xc5, 0x67, 0xe0, 0x95, 0x37, 0x5e, 0xa9, 0xe2, 0x99, 0xaf,
0xf4, 0xbd, 0x9f, 0xa1, 0xd8, 0xd9, 0x25, 0x45, 0x4a, 0x72, 0x93, 0x02, 0xed, 0x1b, 0xe7, 0x37, 0xc1, 0x67, 0xa0, 0xe6, 0x8f, 0x64, 0xc9, 0x76, 0xb8, 0xa5, 0x8a, 0x7b, 0x9b, 0xfe, 0x37, 0x3d,
0xb3, 0x3b, 0xbb, 0xb3, 0x33, 0xbf, 0xd9, 0x25, 0xec, 0x85, 0xf1, 0x34, 0xf0, 0x78, 0xf8, 0x28, 0xdd, 0xea, 0xfe, 0xf5, 0x8c, 0x60, 0xc7, 0x0f, 0x27, 0x9e, 0x43, 0xfd, 0xbd, 0xc8, 0x4f, 0x26,
0x09, 0xb3, 0x69, 0x10, 0x3d, 0x4a, 0x2e, 0x1e, 0x5d, 0x70, 0xef, 0x1a, 0x23, 0x7f, 0x94, 0x88, 0x5e, 0xb0, 0x17, 0x5d, 0xee, 0x5d, 0x52, 0xe7, 0x06, 0x03, 0x77, 0x18, 0xb1, 0x90, 0x87, 0xa4,
0x58, 0xc6, 0xac, 0x9e, 0x5c, 0x0c, 0xf6, 0xa6, 0x71, 0x3c, 0x0d, 0xf1, 0x11, 0x21, 0x17, 0xd9, 0x1c, 0x5d, 0xf6, 0x76, 0x26, 0x61, 0x38, 0xf1, 0x71, 0x4f, 0x72, 0x2e, 0x93, 0xab, 0x3d, 0xee,
0xe5, 0x23, 0x19, 0xcc, 0x30, 0x95, 0x7c, 0x96, 0x68, 0x23, 0xa7, 0x0d, 0xcd, 0xa3, 0x59, 0x22, 0x4d, 0x31, 0xe6, 0x74, 0x1a, 0x29, 0xa5, 0xde, 0x56, 0xba, 0x8b, 0xe7, 0x62, 0xc0, 0x3d, 0x3e,
0xe7, 0xce, 0x10, 0x5a, 0x5f, 0x20, 0xf7, 0x51, 0xb0, 0xdb, 0xd0, 0xba, 0xa2, 0x2f, 0xbb, 0x36, 0x53, 0x7c, 0xab, 0x01, 0xb5, 0xa3, 0x69, 0xc4, 0x67, 0x56, 0x1f, 0xea, 0x9f, 0x23, 0x75, 0x91,
0x6c, 0xec, 0x77, 0x5c, 0x23, 0x39, 0xbf, 0x05, 0x38, 0x55, 0x63, 0x8e, 0x84, 0x88, 0x05, 0xbb, 0x91, 0x2d, 0xa8, 0x5f, 0xcb, 0x95, 0x59, 0xea, 0x57, 0x06, 0x4d, 0x5b, 0x53, 0xd6, 0xef, 0x00,
0x03, 0x16, 0x0a, 0x31, 0x91, 0xf3, 0x04, 0xed, 0xda, 0xb0, 0xb6, 0xdf, 0x77, 0xdb, 0x28, 0xc4, 0xce, 0x84, 0xcd, 0x11, 0x63, 0x21, 0x23, 0xdb, 0x60, 0x20, 0x63, 0x63, 0x3e, 0x8b, 0xd0, 0x2c,
0xf9, 0x3c, 0x41, 0xf6, 0x1d, 0x50, 0x9f, 0x93, 0x59, 0x3a, 0xb5, 0xeb, 0xc3, 0x9a, 0x9a, 0x01, 0xf5, 0x4b, 0x83, 0x8e, 0xdd, 0x40, 0xc6, 0x2e, 0x66, 0x11, 0x92, 0xef, 0x81, 0x58, 0x8e, 0xa7,
0x85, 0x38, 0x49, 0xa7, 0xf9, 0x18, 0x2f, 0xf6, 0xd1, 0x6e, 0x0c, 0x6b, 0xfb, 0x0d, 0x1a, 0x73, 0xf1, 0xc4, 0x2c, 0xf7, 0x4b, 0x62, 0x07, 0x64, 0xec, 0x34, 0x9e, 0xa4, 0x36, 0x4e, 0xe8, 0xa2,
0x18, 0xfb, 0xe8, 0xfc, 0xa9, 0x06, 0xcd, 0x53, 0x2e, 0xaf, 0x52, 0xc6, 0x60, 0x43, 0xc4, 0xb1, 0x59, 0xe9, 0x97, 0x06, 0x15, 0x69, 0x73, 0x10, 0xba, 0x68, 0xfd, 0xa9, 0x04, 0xb5, 0x33, 0xca,
0x34, 0xce, 0xe9, 0x9b, 0xed, 0xc3, 0x56, 0x16, 0xf1, 0x4c, 0x5e, 0x61, 0x24, 0x03, 0x8f, 0x4b, 0xaf, 0x63, 0x42, 0xa0, 0xca, 0xc2, 0x90, 0x6b, 0xe7, 0x72, 0x4d, 0x06, 0xd0, 0x4d, 0x02, 0x9a,
0xf4, 0xed, 0x3a, 0xa9, 0x97, 0x61, 0xf6, 0x21, 0xf4, 0xc3, 0xd8, 0xe3, 0xe1, 0x24, 0x95, 0xb1, 0xf0, 0x6b, 0x71, 0x76, 0x87, 0x72, 0x74, 0xcd, 0xb2, 0x14, 0x2f, 0xb2, 0xc9, 0xfb, 0xd0, 0xf1,
0xe0, 0x53, 0xe5, 0x47, 0xd9, 0xf5, 0x08, 0x3c, 0xd3, 0x18, 0x7b, 0x00, 0x3b, 0x29, 0xf2, 0x70, 0x43, 0x87, 0xfa, 0xe3, 0x98, 0x87, 0x8c, 0x4e, 0x84, 0x1f, 0xa1, 0xd7, 0x96, 0xcc, 0x73, 0xc5,
0xf2, 0x5a, 0xf0, 0xa4, 0x30, 0xdc, 0xd0, 0x13, 0x2a, 0xc5, 0x37, 0x82, 0x27, 0xc6, 0xd6, 0xf9, 0x23, 0xcf, 0x60, 0x23, 0x46, 0xea, 0x8f, 0xef, 0x18, 0x8d, 0x32, 0xc5, 0xaa, 0xda, 0x50, 0x08,
0x6b, 0x0b, 0xda, 0x2e, 0xfe, 0x3e, 0xc3, 0x54, 0xb2, 0x4d, 0xa8, 0x07, 0x3e, 0xed, 0xb6, 0xe3, 0xbe, 0x66, 0x34, 0xd2, 0xba, 0xd6, 0xdf, 0xeb, 0xd0, 0xb0, 0xf1, 0x0f, 0x09, 0xc6, 0x9c, 0xac,
0xd6, 0x03, 0x9f, 0x8d, 0x80, 0xb9, 0x98, 0x84, 0xca, 0x75, 0x10, 0x47, 0x87, 0x61, 0x96, 0x4a, 0x41, 0xd9, 0x73, 0x65, 0xb4, 0x4d, 0xbb, 0xec, 0xb9, 0x64, 0x08, 0xc4, 0xc6, 0xc8, 0x17, 0xae,
0x14, 0x66, 0xcf, 0x6b, 0x34, 0xec, 0x2e, 0x74, 0xe2, 0x04, 0x05, 0x61, 0x14, 0x80, 0x8e, 0xbb, 0xbd, 0x30, 0x38, 0xf0, 0x93, 0x98, 0x23, 0xd3, 0x31, 0xaf, 0x90, 0x90, 0xc7, 0xd0, 0x0c, 0x23,
0x00, 0xd4, 0xc6, 0x13, 0x2e, 0xaf, 0xec, 0x0d, 0x52, 0xd0, 0xb7, 0xc2, 0x7c, 0x2e, 0xb9, 0xdd, 0x64, 0x92, 0x27, 0x13, 0xd0, 0xb4, 0xe7, 0x0c, 0x11, 0x78, 0x44, 0xf9, 0xb5, 0x59, 0x95, 0x02,
0xd4, 0x98, 0xfa, 0x66, 0x0e, 0xb4, 0x52, 0xf4, 0x04, 0x4a, 0xbb, 0x35, 0xac, 0xed, 0x77, 0xc7, 0xb9, 0x16, 0x3c, 0x97, 0x72, 0x6a, 0xd6, 0x14, 0x4f, 0xac, 0x89, 0x05, 0xf5, 0x18, 0x1d, 0x86,
0x30, 0x4a, 0x2e, 0x46, 0x67, 0x84, 0xb8, 0x46, 0xc3, 0xee, 0xc2, 0x86, 0x8a, 0x8b, 0xdd, 0x26, 0xdc, 0xac, 0xf7, 0x4b, 0x83, 0xd6, 0x08, 0x86, 0xd1, 0xe5, 0xf0, 0x5c, 0x72, 0x6c, 0x2d, 0x21,
0x0b, 0x4b, 0x59, 0x1c, 0x64, 0xf2, 0xca, 0x25, 0x94, 0x8d, 0xa1, 0xad, 0xcf, 0x34, 0xb5, 0xad, 0x8f, 0xa1, 0x2a, 0xf2, 0x62, 0x36, 0xa4, 0x86, 0x21, 0x34, 0xf6, 0x13, 0x7e, 0x6d, 0x4b, 0x2e,
0x61, 0x63, 0xbf, 0x3b, 0xb6, 0x95, 0x81, 0xd9, 0xe5, 0x48, 0xa7, 0x41, 0x7a, 0x14, 0x49, 0x31, 0x19, 0x41, 0x43, 0x7d, 0xd3, 0xd8, 0x34, 0xfa, 0x95, 0x41, 0x6b, 0x64, 0x0a, 0x05, 0x1d, 0xe5,
0x77, 0x73, 0x43, 0xf6, 0x3d, 0xe8, 0x79, 0x61, 0x80, 0x91, 0x9c, 0xc8, 0xf8, 0x1a, 0x23, 0xbb, 0x50, 0x95, 0x41, 0x7c, 0x14, 0x70, 0x36, 0xb3, 0x53, 0x45, 0xf2, 0x03, 0x68, 0x3b, 0xbe, 0x87,
0x43, 0x2b, 0xea, 0x6a, 0xec, 0x5c, 0x41, 0x6c, 0x0c, 0xef, 0x95, 0x4d, 0x26, 0xdc, 0xf3, 0x30, 0x01, 0x1f, 0xf3, 0xf0, 0x06, 0x03, 0xb3, 0x29, 0x4f, 0xd4, 0x52, 0xbc, 0x0b, 0xc1, 0x22, 0x23,
0x4d, 0x63, 0x61, 0x03, 0xd9, 0xde, 0x2a, 0xd9, 0x1e, 0x18, 0x95, 0x9a, 0xd6, 0x0f, 0xd2, 0x24, 0x78, 0x98, 0x57, 0x19, 0x53, 0xc7, 0xc1, 0x38, 0x0e, 0x99, 0x09, 0x52, 0xf7, 0x41, 0x4e, 0x77,
0xe4, 0xf3, 0x49, 0xc4, 0x67, 0x68, 0x77, 0xf5, 0xb4, 0x06, 0xfb, 0x8a, 0xcf, 0x90, 0xed, 0x41, 0x5f, 0x8b, 0xc4, 0xb6, 0xae, 0x17, 0x47, 0x3e, 0x9d, 0x8d, 0x03, 0x3a, 0x45, 0xb3, 0xa5, 0xb6,
0x77, 0x16, 0x67, 0x91, 0x9c, 0x24, 0x71, 0x10, 0x49, 0xbb, 0x47, 0x16, 0x40, 0xd0, 0xa9, 0x42, 0xd5, 0xbc, 0x2f, 0xe9, 0x14, 0xc9, 0x0e, 0xb4, 0xa6, 0x61, 0x12, 0xf0, 0x71, 0x14, 0x7a, 0x01,
0xd8, 0x07, 0xa0, 0x25, 0x9d, 0x8c, 0x7d, 0x1d, 0x57, 0x42, 0x28, 0x1d, 0xef, 0xc1, 0xa6, 0x56, 0x37, 0xdb, 0x52, 0x03, 0x24, 0xeb, 0x4c, 0x70, 0xc8, 0x7b, 0xa0, 0x28, 0x55, 0x8c, 0x1d, 0x95,
0x17, 0xeb, 0xd9, 0x24, 0x93, 0x3e, 0xa1, 0xc5, 0x4a, 0x1e, 0x43, 0x87, 0xf2, 0x21, 0x88, 0x2e, 0x57, 0xc9, 0x91, 0xe5, 0xf8, 0x04, 0xd6, 0x94, 0x38, 0x3b, 0xcf, 0x9a, 0x54, 0xe9, 0x48, 0x6e,
0x63, 0x7b, 0x8b, 0xe2, 0x76, 0xab, 0x14, 0x16, 0x95, 0x13, 0xc7, 0xd1, 0x65, 0xec, 0x5a, 0xaf, 0x76, 0x92, 0x17, 0xd0, 0x94, 0xf5, 0xe0, 0x05, 0x57, 0xa1, 0xd9, 0x95, 0x79, 0x7b, 0x90, 0x4b,
0xcd, 0x17, 0xfb, 0x14, 0xde, 0xaf, 0xec, 0x57, 0xe0, 0x8c, 0x07, 0x51, 0x10, 0x4d, 0x27, 0x59, 0x8b, 0xa8, 0x89, 0xe3, 0xe0, 0x2a, 0xb4, 0x8d, 0x3b, 0xbd, 0x22, 0x9f, 0xc0, 0xa3, 0x42, 0xbc,
0x8a, 0xa9, 0xbd, 0x4d, 0x19, 0x6e, 0x97, 0x76, 0xed, 0xe6, 0x06, 0x2f, 0x53, 0x4c, 0xd9, 0xfb, 0x0c, 0xa7, 0xd4, 0x0b, 0xbc, 0x60, 0x32, 0x4e, 0x62, 0x8c, 0xcd, 0x75, 0x59, 0xe1, 0x66, 0x2e,
0xd0, 0x51, 0x79, 0x2b, 0xe7, 0x93, 0xc0, 0xb7, 0x77, 0x68, 0x49, 0x96, 0x06, 0x8e, 0x7d, 0xf6, 0x6a, 0x3b, 0x55, 0x78, 0x13, 0x63, 0x4c, 0x1e, 0x41, 0x53, 0xb5, 0xe2, 0xd8, 0x73, 0xcd, 0x0d,
0x11, 0x6c, 0x25, 0x71, 0x18, 0x78, 0xf3, 0x49, 0xfc, 0x0a, 0x85, 0x08, 0x7c, 0xb4, 0xd9, 0xb0, 0x79, 0x24, 0x43, 0x31, 0x8e, 0x5d, 0xf2, 0x14, 0xba, 0x51, 0xe8, 0x7b, 0xce, 0x6c, 0x1c, 0xde,
0xb6, 0x6f, 0xb9, 0x9b, 0x1a, 0xfe, 0xda, 0xa0, 0xeb, 0x4a, 0xe3, 0x16, 0x19, 0xae, 0x94, 0xc6, 0x22, 0x63, 0x9e, 0x8b, 0x26, 0xe9, 0x97, 0x06, 0x86, 0xbd, 0xa6, 0xd8, 0x5f, 0x69, 0xee, 0xaa,
0x08, 0xc0, 0x8b, 0xa3, 0x08, 0x3d, 0x4a, 0xbf, 0x5d, 0xda, 0xe1, 0xa6, 0xda, 0xe1, 0x61, 0x81, 0xd6, 0x78, 0x20, 0x15, 0x97, 0x5a, 0x63, 0x08, 0xe0, 0x84, 0x41, 0x80, 0x8e, 0x2c, 0xbf, 0x4d,
0xba, 0x25, 0x8b, 0xc1, 0xe7, 0xd0, 0x2b, 0xa7, 0x02, 0xdb, 0x86, 0xc6, 0x35, 0xce, 0x4d, 0xfa, 0x19, 0xe1, 0x9a, 0x88, 0xf0, 0x20, 0xe3, 0xda, 0x39, 0x8d, 0xde, 0x67, 0xd0, 0xce, 0x97, 0x02,
0xab, 0x4f, 0x36, 0x84, 0xe6, 0x2b, 0x1e, 0x66, 0x48, 0x29, 0x6f, 0x12, 0x51, 0x0f, 0x71, 0xb5, 0x59, 0x87, 0xca, 0x0d, 0xce, 0x74, 0xf9, 0x8b, 0x25, 0xe9, 0x43, 0xed, 0x96, 0xfa, 0x09, 0xca,
0xe2, 0xa7, 0xf5, 0xa7, 0x35, 0x87, 0x43, 0xf3, 0x20, 0x0c, 0x78, 0xba, 0x74, 0x4e, 0xb5, 0xb7, 0x92, 0xd7, 0x85, 0xa8, 0x4c, 0x6c, 0x25, 0xf8, 0x59, 0xf9, 0x55, 0xc9, 0xfa, 0x4b, 0x15, 0xaa,
0x9f, 0x53, 0x7d, 0xdd, 0x39, 0x31, 0xd8, 0xa0, 0x4c, 0xd1, 0xf5, 0x43, 0xdf, 0xce, 0x1f, 0x37, 0xa2, 0xf8, 0xc8, 0x47, 0xd0, 0xf1, 0x91, 0xc6, 0x38, 0x0e, 0x23, 0xe1, 0x20, 0x96, 0x5b, 0xb5,
0x60, 0x43, 0xe5, 0x37, 0xfb, 0x11, 0xf4, 0x43, 0xe4, 0x29, 0x4e, 0xe2, 0x44, 0xed, 0x21, 0x25, 0x46, 0xeb, 0xc2, 0xec, 0x44, 0x08, 0xbe, 0x52, 0x7c, 0xbb, 0xed, 0xe7, 0x28, 0xd1, 0xd2, 0x5e,
0x2f, 0xdd, 0xf1, 0xb6, 0x5a, 0xd9, 0x0b, 0xa5, 0xf8, 0x5a, 0xe3, 0x6e, 0x2f, 0x2c, 0x49, 0x8a, 0xc0, 0x91, 0x05, 0xd4, 0x1f, 0xcb, 0x66, 0x50, 0x0d, 0xd6, 0x4e, 0x99, 0x87, 0xa2, 0x29, 0x16,
0x35, 0x82, 0x48, 0xa2, 0x88, 0x78, 0x38, 0xa1, 0x7a, 0xd3, 0x9e, 0x7b, 0x39, 0xf8, 0x4c, 0xd5, 0xeb, 0xa8, 0xb2, 0x5c, 0x47, 0x3d, 0x30, 0x64, 0xee, 0x3c, 0x8c, 0x75, 0xb3, 0x67, 0x34, 0x19,
0xdd, 0x72, 0xaa, 0x36, 0x56, 0x53, 0x75, 0x00, 0x16, 0x1d, 0x4f, 0x80, 0xa9, 0xe1, 0x93, 0x42, 0x81, 0x31, 0x45, 0x4e, 0x75, 0xaf, 0x89, 0x96, 0xd8, 0x4a, 0x7b, 0x66, 0x78, 0xaa, 0x05, 0xaa,
0x66, 0x63, 0xb0, 0x66, 0x28, 0xb9, 0x29, 0x67, 0x55, 0x75, 0xb7, 0xf3, 0xb2, 0x1c, 0x9d, 0x18, 0x21, 0x32, 0xbd, 0xa5, 0x8e, 0xa8, 0x2f, 0x77, 0x44, 0x0f, 0x8c, 0xac, 0xe8, 0x1a, 0xea, 0x0b,
0x85, 0xae, 0xb9, 0xc2, 0x6e, 0xa5, 0xe8, 0x5a, 0xab, 0x45, 0x37, 0x00, 0xab, 0x88, 0x57, 0x5b, 0xa7, 0xb4, 0x80, 0xd9, 0x08, 0x99, 0x17, 0xba, 0xa6, 0x21, 0x0b, 0x45, 0x53, 0x02, 0x24, 0x83,
0x27, 0x51, 0x2e, 0x2b, 0x26, 0x4f, 0x50, 0x04, 0xb1, 0x6f, 0x5b, 0x94, 0x8b, 0x46, 0x52, 0x3c, 0x64, 0xaa, 0x4a, 0xa8, 0xa9, 0x40, 0x32, 0x48, 0xa6, 0xcb, 0x15, 0x03, 0x0b, 0x15, 0xf3, 0x43,
0x1c, 0x65, 0x33, 0x9d, 0xa5, 0x1d, 0xcd, 0xc3, 0x51, 0x36, 0x5b, 0x4d, 0x4a, 0x58, 0x4a, 0xca, 0xa8, 0x51, 0xdf, 0xa3, 0xb1, 0x6c, 0x21, 0xf1, 0x65, 0x35, 0xe2, 0x0f, 0xf7, 0x05, 0xd7, 0x56,
0x3d, 0x68, 0x72, 0x75, 0x92, 0x54, 0xa5, 0xdd, 0x71, 0x87, 0xd6, 0xaf, 0x00, 0x57, 0xe3, 0x6c, 0x42, 0xf2, 0x21, 0x74, 0x26, 0x2c, 0x4c, 0xa2, 0xb1, 0x24, 0x31, 0x36, 0xdb, 0x32, 0xda, 0x45,
0x04, 0xfd, 0xa9, 0x88, 0xb3, 0x64, 0x42, 0x22, 0xa6, 0x76, 0x8f, 0x36, 0x5a, 0x32, 0xec, 0x91, 0xed, 0xb6, 0x54, 0xda, 0x57, 0x3a, 0xa2, 0x03, 0x2f, 0xc3, 0x24, 0x70, 0xc7, 0x8e, 0xe7, 0xb2,
0xfe, 0x40, 0xab, 0x55, 0x69, 0x5f, 0xc4, 0x59, 0xe4, 0x4f, 0xbc, 0xc0, 0x17, 0xa9, 0xdd, 0xa7, 0xd8, 0xec, 0xc8, 0xe4, 0x81, 0x64, 0x1d, 0x08, 0x4e, 0xef, 0xe7, 0xd0, 0x29, 0x64, 0x69, 0x45,
0x90, 0x01, 0x41, 0x87, 0x0a, 0x19, 0xfc, 0x0c, 0xfa, 0x95, 0xd8, 0xac, 0x49, 0xc2, 0xdd, 0x72, 0xad, 0x6c, 0xe6, 0x6b, 0xa5, 0x99, 0xaf, 0x8f, 0xbf, 0x96, 0xa0, 0x9d, 0xff, 0xfc, 0xc2, 0xf8,
0x12, 0x76, 0xca, 0x89, 0xf7, 0xe7, 0x1a, 0xf4, 0xca, 0x87, 0xae, 0x06, 0x9f, 0x9f, 0xbf, 0xa0, 0xe2, 0xe2, 0x44, 0x1a, 0x57, 0x6c, 0xb1, 0x14, 0xc0, 0xc9, 0x30, 0xc0, 0x3b, 0x7a, 0xe9, 0xab,
0xc1, 0x0d, 0x57, 0x7d, 0x2a, 0x46, 0x16, 0x18, 0xe1, 0x6b, 0x7e, 0x11, 0xea, 0x09, 0x2c, 0x77, 0x0d, 0x0c, 0x7b, 0xce, 0x10, 0x52, 0x2f, 0x70, 0x18, 0x4e, 0x31, 0xe0, 0x7a, 0xae, 0xcc, 0x19,
0x01, 0x28, 0x6d, 0x10, 0x79, 0x02, 0x67, 0x18, 0x49, 0xd3, 0xb0, 0x16, 0x00, 0xfb, 0x04, 0x20, 0xe4, 0x63, 0x00, 0x2f, 0x8e, 0x13, 0x1c, 0x8b, 0x91, 0x28, 0xc1, 0xb5, 0x35, 0xea, 0x0d, 0xd5,
0x48, 0xd3, 0x0c, 0x27, 0xaa, 0xa7, 0x12, 0x6b, 0x77, 0xc7, 0x83, 0x91, 0x6e, 0xb8, 0xa3, 0xbc, 0xbc, 0x1c, 0xa6, 0xf3, 0x72, 0x78, 0x91, 0xce, 0x4b, 0xbb, 0x29, 0xb5, 0x05, 0x2d, 0x3e, 0xd1,
0xe1, 0x8e, 0xce, 0xf3, 0x86, 0xeb, 0x76, 0xc8, 0x5a, 0xc9, 0xea, 0x60, 0x4e, 0xf8, 0x1b, 0xb5, 0x29, 0x7d, 0x2b, 0xce, 0x52, 0x53, 0x9f, 0x48, 0x51, 0xd6, 0x1f, 0xa1, 0xae, 0xf0, 0xf6, 0x3b,
0x96, 0xa6, 0x3e, 0x18, 0x2d, 0x39, 0x7f, 0x80, 0x96, 0x26, 0xf2, 0xff, 0x6b, 0x22, 0xdf, 0x01, 0x2d, 0xe9, 0x6d, 0x30, 0xd4, 0xde, 0x9e, 0xab, 0xcb, 0xb9, 0x21, 0xe9, 0x63, 0xd7, 0xfa, 0x67,
0x4b, 0xcf, 0x1d, 0xf8, 0x26, 0x89, 0xdb, 0x24, 0x1f, 0xfb, 0xce, 0xdf, 0x6b, 0x60, 0xb9, 0x98, 0x09, 0x0c, 0x1b, 0xe3, 0x28, 0x0c, 0x62, 0xcc, 0xcd, 0x83, 0xd2, 0xb7, 0xce, 0x83, 0xf2, 0xca,
0x26, 0x71, 0x94, 0x62, 0xa9, 0xd1, 0xd4, 0xde, 0xda, 0x68, 0xea, 0x6b, 0x1b, 0x4d, 0xde, 0xbe, 0x79, 0x90, 0x4e, 0x99, 0x4a, 0x6e, 0xca, 0xf4, 0xc0, 0x60, 0xe8, 0x7a, 0x0c, 0x1d, 0xae, 0x27,
0x1a, 0xa5, 0xf6, 0x35, 0x00, 0x4b, 0xa0, 0x1f, 0x08, 0xf4, 0xa4, 0x69, 0x75, 0x85, 0xac, 0x74, 0x52, 0x46, 0x0b, 0xd9, 0x1d, 0x65, 0x02, 0xc8, 0x62, 0xd9, 0x2d, 0x4d, 0x3b, 0xa3, 0xc9, 0xcb,
0xaf, 0xb9, 0x50, 0x0c, 0x99, 0x52, 0x8d, 0x74, 0xdc, 0x42, 0x66, 0x4f, 0xca, 0xfc, 0xac, 0x3b, 0x3c, 0x8c, 0xaa, 0x01, 0xb5, 0xa9, 0x60, 0x54, 0x1d, 0x77, 0x19, 0x47, 0xad, 0x7f, 0x94, 0x61,
0xdf, 0xae, 0xe6, 0x67, 0xbd, 0xdc, 0x55, 0x82, 0x76, 0xfe, 0x56, 0x87, 0xed, 0x65, 0xf5, 0x9a, 0x7d, 0x51, 0xbc, 0xa2, 0x08, 0x36, 0xa1, 0xa6, 0x1a, 0x4d, 0x57, 0x10, 0x5f, 0x6a, 0xb1, 0xca,
0x24, 0xd8, 0x85, 0xa6, 0x2e, 0x2f, 0x93, 0x41, 0x72, 0xa5, 0xb0, 0x1a, 0x4b, 0x85, 0xf5, 0x73, 0x42, 0x8b, 0xfd, 0x02, 0x3a, 0x0e, 0x43, 0x39, 0x5d, 0xdf, 0xf5, 0xeb, 0xb7, 0x53, 0x03, 0x59,
0xe8, 0x7b, 0x02, 0xa9, 0x6d, 0xbf, 0xeb, 0xe9, 0xf7, 0xf2, 0x01, 0x94, 0x00, 0x1f, 0xc3, 0xb6, 0x00, 0x1f, 0xc0, 0xba, 0x38, 0x65, 0x84, 0xee, 0x7c, 0x78, 0xa8, 0x51, 0xdc, 0xd5, 0xfc, 0x6c,
0x5a, 0x65, 0x82, 0xfe, 0x82, 0xed, 0x74, 0x8f, 0xdf, 0x32, 0x78, 0xc1, 0x77, 0x0f, 0x60, 0x27, 0x7c, 0x3c, 0x83, 0x8d, 0x54, 0x75, 0xde, 0xa3, 0xf5, 0x82, 0xee, 0x51, 0xda, 0xaa, 0x5b, 0x50,
0x37, 0x5d, 0x54, 0x66, 0xab, 0x62, 0x7b, 0x94, 0x17, 0xe8, 0x6d, 0x68, 0x5d, 0xc6, 0x62, 0xc6, 0xbf, 0x0a, 0xd9, 0x94, 0x72, 0x0d, 0x0a, 0x9a, 0x12, 0x65, 0x91, 0x9d, 0x57, 0x5e, 0x05, 0x0c,
0xa5, 0xa1, 0x02, 0x23, 0xa9, 0xb4, 0x28, 0xd6, 0x4b, 0x77, 0x0c, 0x4b, 0xa7, 0x45, 0x0e, 0xaa, 0x55, 0x16, 0x29, 0x53, 0x5c, 0x90, 0x04, 0x08, 0x64, 0x97, 0x17, 0x09, 0x10, 0x86, 0x6d, 0xa4,
0x9b, 0x97, 0x2a, 0xfd, 0xe2, 0x56, 0x44, 0xb4, 0x60, 0xb9, 0x56, 0x7e, 0x1b, 0x72, 0x7e, 0x0d, 0x97, 0x16, 0xeb, 0x37, 0xd0, 0x5d, 0x98, 0x57, 0x2b, 0x12, 0x39, 0x77, 0x5f, 0x2e, 0xb8, 0x2f,
0x5b, 0x4b, 0x8d, 0x70, 0x4d, 0x20, 0x17, 0xee, 0xeb, 0x15, 0xf7, 0x95, 0x99, 0x1b, 0x4b, 0x33, 0xec, 0x5c, 0x59, 0xd8, 0xf9, 0xb7, 0xb0, 0xf1, 0x39, 0x0d, 0x5c, 0x1f, 0xf5, 0xfe, 0xfb, 0x6c,
0xff, 0x06, 0x76, 0xbe, 0xe0, 0x91, 0x1f, 0xa2, 0x99, 0xff, 0x40, 0x4c, 0xa9, 0x55, 0x98, 0x7b, 0x12, 0x8b, 0xc9, 0xab, 0xaf, 0x4f, 0x63, 0x7d, 0x31, 0xea, 0xd8, 0x4d, 0xcd, 0x39, 0x76, 0xc9,
0xd9, 0xc4, 0xdc, 0xb8, 0xfa, 0x6e, 0xc7, 0x20, 0xc7, 0x3e, 0xbb, 0x07, 0x6d, 0xa1, 0xad, 0x4d, 0x13, 0x68, 0x30, 0xa5, 0xad, 0x0b, 0xaf, 0x95, 0x1b, 0xa8, 0x76, 0x2a, 0xb3, 0xbe, 0x01, 0x52,
0xe2, 0x75, 0x4b, 0x9d, 0xda, 0xcd, 0x75, 0xce, 0xb7, 0xc0, 0x2a, 0x53, 0xab, 0x2b, 0xd9, 0x9c, 0xd8, 0x5a, 0xdc, 0x9c, 0x66, 0x64, 0x20, 0x0a, 0x50, 0x15, 0x85, 0x2e, 0xec, 0x76, 0xbe, 0x8e,
0xed, 0xab, 0x04, 0xd4, 0x49, 0x61, 0x12, 0xbb, 0x57, 0xce, 0x23, 0xb7, 0xd0, 0xb2, 0x21, 0x34, 0xec, 0x4c, 0x4a, 0xfa, 0x50, 0x41, 0xc6, 0xb4, 0x0b, 0x39, 0xd1, 0xe6, 0xf7, 0x54, 0x5b, 0x88,
0x50, 0x08, 0xe3, 0x82, 0x5a, 0xe5, 0xe2, 0x02, 0xec, 0x2a, 0x95, 0xf3, 0x43, 0xd8, 0x39, 0x4b, 0xac, 0x1f, 0xc3, 0xc6, 0x79, 0x84, 0x8e, 0x47, 0x7d, 0x79, 0xc7, 0x54, 0x0e, 0x76, 0xa0, 0x26,
0xd0, 0x0b, 0x78, 0x48, 0x97, 0x57, 0xed, 0x60, 0x0f, 0x9a, 0x2a, 0xc8, 0x79, 0xcd, 0x12, 0xfb, 0x92, 0x9c, 0xf6, 0x6c, 0x53, 0x1a, 0x4a, 0xb1, 0xe2, 0x5b, 0xdf, 0x80, 0xa9, 0xce, 0x75, 0xf4,
0x69, 0xb5, 0xc6, 0x9d, 0x6f, 0xc1, 0xd6, 0xeb, 0x3a, 0x7a, 0x13, 0xa4, 0x12, 0x23, 0x0f, 0x0f, 0xd6, 0x8b, 0x39, 0x06, 0x0e, 0x1e, 0x5c, 0xa3, 0x73, 0xf3, 0x7f, 0x8c, 0xfc, 0x16, 0xb6, 0x57,
0xaf, 0xd0, 0xbb, 0xfe, 0x1f, 0xee, 0xfc, 0x15, 0xdc, 0x59, 0xe7, 0x21, 0x5f, 0x5f, 0xd7, 0x53, 0x79, 0x48, 0xcf, 0xd7, 0x72, 0x04, 0x35, 0xbe, 0x12, 0x40, 0x2b, 0x7d, 0x18, 0x36, 0x48, 0xd6,
0xd2, 0xe4, 0x52, 0x11, 0x2d, 0xf9, 0xb0, 0x5c, 0x20, 0xe8, 0x73, 0x85, 0xa8, 0x73, 0x44, 0x35, 0x67, 0x82, 0x23, 0xbe, 0x23, 0x0a, 0xbb, 0x58, 0x43, 0xa2, 0xa6, 0xd2, 0x7c, 0x54, 0xee, 0xcf,
0x2e, 0x35, 0x94, 0x68, 0xa4, 0x3c, 0x1e, 0x8d, 0x9b, 0xe3, 0xf1, 0x97, 0x1a, 0x74, 0xce, 0x50, 0xc7, 0xdf, 0x4a, 0xd0, 0x3c, 0x47, 0x9e, 0x44, 0x32, 0x96, 0x47, 0xd0, 0xbc, 0x64, 0xe1, 0x0d,
0x66, 0x09, 0xed, 0xe5, 0x7d, 0xe8, 0x5c, 0x88, 0xf8, 0x1a, 0xc5, 0x62, 0x2b, 0x96, 0x06, 0x8e, 0xb2, 0x79, 0x28, 0x86, 0x62, 0x1c, 0xbb, 0xe4, 0x25, 0xd4, 0x0f, 0xc2, 0xe0, 0xca, 0x9b, 0xc8,
0x7d, 0xf6, 0x04, 0x5a, 0x87, 0x71, 0x74, 0x19, 0x4c, 0xe9, 0x2a, 0xdf, 0x1d, 0xdf, 0xd1, 0xec, 0x1b, 0x77, 0x6b, 0xb4, 0xad, 0xd0, 0x45, 0xdb, 0x0e, 0x95, 0x4c, 0x8d, 0x46, 0xad, 0x48, 0xfa,
0x62, 0xc6, 0x8e, 0xb4, 0x4e, 0x37, 0x44, 0x63, 0xc8, 0x86, 0xd0, 0x35, 0x4f, 0x9c, 0x97, 0x2f, 0xd0, 0xd2, 0x2f, 0x94, 0x37, 0x6f, 0x8e, 0x0f, 0xd3, 0x51, 0x9c, 0x63, 0xf5, 0x3e, 0x86, 0x56,
0x8f, 0x9f, 0xe5, 0x0d, 0xb8, 0x04, 0x0d, 0x3e, 0x81, 0x6e, 0x69, 0xe0, 0x7f, 0xd5, 0x2d, 0xbe, 0xce, 0xf0, 0x7f, 0x9a, 0x16, 0xdf, 0x07, 0x90, 0xde, 0x55, 0x8e, 0xd6, 0x55, 0xa8, 0xda, 0x52,
0x0b, 0x40, 0xde, 0x75, 0x8c, 0xb6, 0xf5, 0x56, 0xcd, 0x48, 0xb5, 0xb5, 0x3d, 0xe8, 0xa8, 0x6b, 0x84, 0xb6, 0x03, 0x4d, 0x71, 0xeb, 0x53, 0x62, 0x02, 0xd5, 0xdc, 0x03, 0x45, 0xae, 0xad, 0x27,
0x8a, 0x56, 0x33, 0xd8, 0x28, 0xbd, 0x7c, 0xe8, 0xdb, 0xb9, 0x07, 0x3b, 0xc7, 0xd1, 0x2b, 0x1e, 0xb0, 0x71, 0x1c, 0xdc, 0x52, 0xdf, 0x73, 0x29, 0xc7, 0x2f, 0x70, 0x26, 0x53, 0xb0, 0x74, 0x02,
0x06, 0x3e, 0x97, 0xf8, 0x25, 0xce, 0x29, 0x04, 0x2b, 0x2b, 0x70, 0xce, 0xa0, 0x67, 0xde, 0x16, 0xeb, 0x1c, 0xda, 0xfa, 0x09, 0xf0, 0x4e, 0x67, 0x6c, 0xeb, 0x33, 0xfe, 0xf7, 0x26, 0xfa, 0x00,
0xef, 0xb4, 0xc6, 0x9e, 0x59, 0xe3, 0x7f, 0x2e, 0xa2, 0x8f, 0x61, 0xcb, 0x4c, 0xfa, 0x22, 0x30, 0xba, 0x7a, 0xd3, 0x13, 0x4f, 0xb7, 0x90, 0xb8, 0x06, 0x30, 0xbc, 0xf2, 0xde, 0xea, 0xad, 0x35,
0x25, 0xa4, 0x9a, 0xbf, 0xc0, 0xcb, 0xe0, 0x8d, 0x99, 0xda, 0x48, 0xce, 0x53, 0xd8, 0x2e, 0x99, 0x65, 0xbd, 0x82, 0xf5, 0x9c, 0x6a, 0x16, 0xce, 0x0d, 0xce, 0xe2, 0xf4, 0x69, 0x24, 0xd6, 0x69,
0x16, 0xdb, 0xb9, 0xc6, 0x79, 0x9a, 0xbf, 0xb9, 0xd4, 0x77, 0x1e, 0x81, 0xfa, 0x22, 0x02, 0x0e, 0x06, 0xca, 0xf3, 0x0c, 0x58, 0xb0, 0xa6, 0x2d, 0x5f, 0x23, 0xbf, 0x27, 0xba, 0x2f, 0xb2, 0x83,
0x6c, 0x9a, 0x91, 0xcf, 0x51, 0xde, 0xb0, 0xbb, 0x2f, 0x8b, 0x85, 0x3c, 0x47, 0x33, 0xf9, 0x7d, 0xbc, 0x46, 0xbd, 0xf9, 0x2e, 0xd4, 0x50, 0x44, 0x9a, 0x1f, 0x61, 0xf9, 0x0c, 0xd8, 0x4a, 0xbc,
0x68, 0xa2, 0xda, 0x69, 0xb9, 0x85, 0x95, 0x23, 0xe0, 0x6a, 0xf5, 0x1a, 0x87, 0x4f, 0x0b, 0x87, 0xc2, 0xe1, 0xab, 0xcc, 0xe1, 0x59, 0xa2, 0x1c, 0xbe, 0xe3, 0x5e, 0xd6, 0xfb, 0xd9, 0x31, 0xce,
0xa7, 0x99, 0x76, 0xf8, 0x8e, 0x73, 0x39, 0x1f, 0x16, 0xcb, 0x38, 0xcd, 0xe4, 0x4d, 0x27, 0x7a, 0x12, 0x7e, 0xdf, 0x17, 0x7d, 0x02, 0x1b, 0x5a, 0xe9, 0x10, 0x7d, 0xe4, 0x78, 0x4f, 0x48, 0xbb,
0x0f, 0x76, 0x8c, 0xd1, 0x33, 0x0c, 0x51, 0xe2, 0x0d, 0x5b, 0xba, 0x0f, 0xac, 0x62, 0x76, 0xd3, 0x40, 0x0a, 0x6a, 0xf7, 0x6d, 0xf7, 0x18, 0x8c, 0x8b, 0x8b, 0x93, 0x4c, 0x5a, 0xc4, 0x46, 0xeb,
0x74, 0x77, 0xc1, 0x3a, 0x3f, 0x7f, 0x51, 0x68, 0xab, 0xdc, 0xe8, 0x7c, 0x0a, 0x3b, 0x67, 0x99, 0x13, 0xd8, 0x38, 0x4f, 0xdc, 0xf0, 0x8c, 0x79, 0xb7, 0x9e, 0x8f, 0x13, 0xe5, 0x2c, 0x7d, 0x99,
0x1f, 0x9f, 0x8a, 0xe0, 0x55, 0x10, 0xe2, 0x54, 0x3b, 0xcb, 0x9f, 0x7c, 0xb5, 0xd2, 0x93, 0x6f, 0x95, 0x72, 0x2f, 0xb3, 0x95, 0xd3, 0xc8, 0x1a, 0x00, 0x29, 0x98, 0x67, 0xdf, 0x2d, 0x4e, 0xdc,
0x6d, 0x37, 0x72, 0xf6, 0x81, 0x55, 0x86, 0x17, 0xe7, 0x96, 0x66, 0x7e, 0x6c, 0x4a, 0x98, 0xbe, 0x50, 0xb7, 0xb0, 0x5c, 0x5b, 0x03, 0x68, 0x5f, 0x50, 0x31, 0xef, 0x5d, 0xa5, 0x63, 0x42, 0x83,
0x9d, 0x7d, 0xe8, 0x9d, 0x73, 0xd5, 0xef, 0x7d, 0x6d, 0x63, 0x43, 0x5b, 0x6a, 0xd9, 0x98, 0xe5, 0x2b, 0x5a, 0xab, 0xa5, 0xa4, 0x35, 0x82, 0xcd, 0x03, 0xea, 0x5c, 0x7b, 0xc1, 0xe4, 0xd0, 0x8b,
0xa2, 0x33, 0x86, 0xdd, 0x43, 0xee, 0x5d, 0x05, 0xd1, 0xf4, 0x59, 0x90, 0xaa, 0x0b, 0x8f, 0x19, 0xc5, 0x85, 0x47, 0x5b, 0xf4, 0xc0, 0x70, 0x35, 0x43, 0x9b, 0x64, 0xb4, 0xf5, 0x1c, 0x1e, 0xe6,
0x31, 0x00, 0xcb, 0x37, 0x80, 0x19, 0x52, 0xc8, 0xce, 0x43, 0x78, 0xaf, 0xf4, 0xb0, 0x3d, 0x93, 0xde, 0x9f, 0xe7, 0x9c, 0xa6, 0xf9, 0xd8, 0x84, 0x5a, 0x2c, 0x28, 0x69, 0x51, 0xb3, 0x15, 0x61,
0x3c, 0x8f, 0xc7, 0x2e, 0x34, 0x53, 0x25, 0xd1, 0x88, 0xa6, 0xab, 0x05, 0xe7, 0x2b, 0xd8, 0x2d, 0x7d, 0x09, 0x9b, 0xf9, 0x01, 0x2c, 0xae, 0x1f, 0x69, 0xe0, 0xf2, 0x62, 0x50, 0xca, 0x5d, 0x0c,
0x37, 0x60, 0x75, 0xfd, 0xc8, 0x37, 0x4e, 0x17, 0x83, 0x5a, 0xe9, 0x62, 0x60, 0x62, 0x56, 0x5f, 0x74, 0xce, 0xca, 0xf3, 0x79, 0xb2, 0x0e, 0x95, 0x5f, 0x7d, 0x7d, 0xa1, 0x8b, 0x5d, 0x2c, 0xad,
0xf4, 0x93, 0x6d, 0x68, 0xfc, 0xf2, 0x9b, 0x73, 0x93, 0xec, 0xea, 0xd3, 0xf9, 0x9d, 0x72, 0x5f, 0xdf, 0x0b, 0xf7, 0xc5, 0xfd, 0x94, 0xfb, 0xc2, 0xed, 0xa0, 0xf4, 0x2e, 0xb7, 0x83, 0x15, 0xf5,
0x9d, 0x4f, 0xbb, 0xaf, 0xdc, 0x0e, 0x6a, 0xef, 0x72, 0x3b, 0x58, 0x93, 0x6f, 0x0f, 0x61, 0xe7, 0xf6, 0x1c, 0x36, 0x4e, 0xfd, 0xd0, 0xb9, 0x39, 0x0a, 0x72, 0xd9, 0x30, 0xa1, 0x81, 0x41, 0x3e,
0x24, 0x8c, 0xbd, 0xeb, 0xa3, 0xa8, 0x14, 0x0d, 0x1b, 0xda, 0x18, 0x95, 0x83, 0x91, 0x8b, 0xce, 0x19, 0x29, 0x69, 0x3d, 0x85, 0xee, 0x89, 0x78, 0xfd, 0x9f, 0x8a, 0xe7, 0x5e, 0x96, 0x05, 0xf9,
0x47, 0xb0, 0xf5, 0x22, 0xf6, 0x78, 0x78, 0xa2, 0xde, 0x27, 0x45, 0x14, 0xe8, 0x4f, 0x83, 0x31, 0x43, 0x40, 0xab, 0x2a, 0xc2, 0x7a, 0x0e, 0x6b, 0x7a, 0x44, 0x07, 0x57, 0x61, 0x8a, 0x8c, 0xf3,
0xd5, 0x82, 0xf3, 0x10, 0x60, 0xf1, 0xc6, 0x52, 0xf4, 0x2b, 0x70, 0x16, 0x4b, 0x9c, 0x70, 0xdf, 0x61, 0x5e, 0x2a, 0x5e, 0xb8, 0xad, 0x13, 0xe8, 0xce, 0xd5, 0xd5, 0xbe, 0x4f, 0xa1, 0xae, 0xc4,
0xcf, 0x33, 0x08, 0x34, 0x74, 0xe0, 0xfb, 0x62, 0xfc, 0xaf, 0x3a, 0xb4, 0x7f, 0xa1, 0x49, 0x8d, 0x3a, 0xb6, 0x6e, 0x76, 0xad, 0x56, 0x9a, 0xb6, 0x16, 0xaf, 0x0c, 0x0a, 0xe6, 0xef, 0x30, 0x81,
0x7d, 0x06, 0xfd, 0x4a, 0x0b, 0x63, 0xef, 0xd1, 0x23, 0x6b, 0xb9, 0x61, 0x0e, 0x6e, 0xaf, 0xc0, 0xfd, 0x0c, 0xa7, 0x21, 0xc7, 0x31, 0x75, 0xdd, 0xb4, 0x7c, 0x41, 0xb1, 0xf6, 0x5d, 0x97, 0x8d,
0x7a, 0x41, 0x8f, 0xa1, 0x57, 0x6e, 0x50, 0x8c, 0x9a, 0x11, 0xfd, 0xf1, 0x19, 0xd0, 0x4c, 0xab, 0xfe, 0x5d, 0x86, 0xc6, 0x2f, 0x15, 0xa2, 0x92, 0x4f, 0xa1, 0x53, 0x98, 0x9f, 0xe4, 0xa1, 0x7c,
0xdd, 0xeb, 0x0c, 0x76, 0xd7, 0xb5, 0x0e, 0x76, 0x77, 0xe1, 0x61, 0xb5, 0x6d, 0x0d, 0x3e, 0xb8, 0x88, 0x2d, 0x4e, 0xeb, 0xde, 0xd6, 0x12, 0x5b, 0x9d, 0xfa, 0x05, 0xb4, 0xf3, 0xd3, 0x91, 0xc8,
0x49, 0x9b, 0xb7, 0x9c, 0xf6, 0x61, 0x88, 0x3c, 0xca, 0x92, 0xf2, 0x0a, 0x16, 0x9f, 0xec, 0x09, 0x49, 0x28, 0xff, 0x0a, 0xf5, 0xe4, 0x4e, 0xcb, 0xa3, 0xf3, 0x1c, 0x36, 0x57, 0xcd, 0x2d, 0xf2,
0xf4, 0x2b, 0xe4, 0xa9, 0xf7, 0xb9, 0xc2, 0xa7, 0xe5, 0x21, 0xf7, 0xa1, 0x49, 0x84, 0xcd, 0xfa, 0x78, 0xee, 0x61, 0x79, 0x66, 0xf6, 0xde, 0xbb, 0x4f, 0x9a, 0xce, 0xbb, 0xc6, 0x81, 0x8f, 0x34,
0x95, 0xce, 0x31, 0xd8, 0x2c, 0x44, 0xed, 0x7b, 0x08, 0x1b, 0xf4, 0xbe, 0x2c, 0x39, 0xa6, 0x11, 0x48, 0xa2, 0xfc, 0x09, 0xe6, 0x4b, 0xf2, 0x12, 0x3a, 0x05, 0xe4, 0x56, 0x71, 0x2e, 0x81, 0x79,
0x05, 0x9b, 0x8f, 0xff, 0x51, 0x83, 0x76, 0xfe, 0x6f, 0xe8, 0x09, 0x6c, 0x28, 0x5e, 0x64, 0xb7, 0xde, 0x64, 0x17, 0x6a, 0x72, 0x5a, 0x90, 0x4e, 0x61, 0x6c, 0xf5, 0xd6, 0x32, 0x52, 0xf9, 0xee,
0x4a, 0xd4, 0x92, 0x73, 0xea, 0x60, 0x77, 0x09, 0xd4, 0x0e, 0x46, 0xd0, 0x78, 0x8e, 0x92, 0xb1, 0x43, 0x55, 0xfe, 0x2b, 0xc8, 0x39, 0x96, 0x16, 0xd9, 0x28, 0x19, 0xfd, 0xab, 0x04, 0x8d, 0xf4,
0x92, 0xd2, 0x10, 0xe4, 0xe0, 0x56, 0x15, 0x2b, 0xec, 0x4f, 0xb3, 0xaa, 0xbd, 0xe1, 0xb7, 0x8a, 0xff, 0xd1, 0x4b, 0xa8, 0x0a, 0x50, 0x26, 0x0f, 0x72, 0xb8, 0x96, 0x02, 0x7a, 0x6f, 0x73, 0x81,
0x7d, 0xc1, 0x5c, 0x3f, 0x81, 0x96, 0x66, 0x1e, 0x1d, 0x94, 0x15, 0xce, 0xd2, 0x87, 0xbf, 0xca, 0xa9, 0x1c, 0x0c, 0xa1, 0xf2, 0x1a, 0x39, 0x21, 0x39, 0xa1, 0x46, 0xe7, 0xde, 0x83, 0x22, 0x2f,
0x51, 0xe3, 0x7f, 0x36, 0x00, 0xce, 0xe6, 0xa9, 0xc4, 0xd9, 0xaf, 0x02, 0x7c, 0xcd, 0x1e, 0xc0, 0xd3, 0x3f, 0x4b, 0x8a, 0xfa, 0x1a, 0x5c, 0x0b, 0xfa, 0x19, 0x6c, 0xfe, 0x14, 0xea, 0x0a, 0xf6,
0xd6, 0x33, 0xbc, 0xe4, 0x59, 0x28, 0xe9, 0x05, 0xa1, 0x2a, 0xac, 0x14, 0x13, 0xba, 0x04, 0x15, 0x54, 0x52, 0x96, 0x00, 0x53, 0x7d, 0xfc, 0x65, 0x80, 0x1c, 0xfd, 0xb9, 0x0a, 0x70, 0x3e, 0x8b,
0x04, 0x76, 0x1f, 0xba, 0x27, 0xfc, 0xcd, 0xdb, 0xed, 0x3e, 0x83, 0x7e, 0x85, 0x97, 0xcc, 0x12, 0x39, 0x4e, 0x7f, 0xed, 0xe1, 0x1d, 0x79, 0x06, 0xdd, 0x43, 0xbc, 0xa2, 0x89, 0xcf, 0xe5, 0xf3,
0x97, 0x99, 0xce, 0x2c, 0x71, 0x95, 0xc1, 0xee, 0x43, 0xdb, 0xb0, 0x55, 0xd9, 0x07, 0xf1, 0x7a, 0x45, 0xb4, 0x77, 0x2e, 0x27, 0xf2, 0x06, 0x96, 0xa1, 0xe7, 0x2e, 0xb4, 0x4e, 0xe9, 0xdb, 0x6f,
0x85, 0xc5, 0x7e, 0x0c, 0x5b, 0x4b, 0x5c, 0x55, 0xb6, 0xa7, 0xff, 0x57, 0x6b, 0xb9, 0xec, 0xa9, 0xd7, 0xfb, 0x14, 0x3a, 0x05, 0x50, 0xd4, 0x47, 0x5c, 0x84, 0x59, 0x7d, 0xc4, 0x65, 0xf8, 0xdc,
0x7a, 0x01, 0x54, 0xf9, 0xaa, 0x3c, 0xf0, 0x8e, 0xe6, 0x88, 0x75, 0x84, 0xf6, 0xbc, 0xfa, 0x76, 0x85, 0x86, 0x86, 0xca, 0xbc, 0x0f, 0x39, 0x54, 0x0a, 0x10, 0xfa, 0x13, 0xe8, 0x2e, 0x00, 0x65,
0xa0, 0x97, 0x93, 0xbd, 0x4c, 0x29, 0x39, 0xa1, 0xe5, 0x13, 0xad, 0xa3, 0xa6, 0xc7, 0xd0, 0x2b, 0x5e, 0x5f, 0xfe, 0xe3, 0x5a, 0x09, 0xa4, 0xaf, 0xc4, 0xf3, 0xa3, 0x08, 0x96, 0x79, 0xc3, 0x6d,
0xb3, 0xca, 0x4a, 0x09, 0xae, 0x52, 0xce, 0xf7, 0x01, 0x16, 0xc4, 0x52, 0xb6, 0xa7, 0xf4, 0x58, 0x05, 0x50, 0xab, 0xd0, 0xf4, 0x75, 0xf1, 0xe1, 0x22, 0x9f, 0x6d, 0xe6, 0x22, 0x9e, 0xa5, 0x68,
0xe2, 0x9c, 0x8b, 0x16, 0xbd, 0x36, 0x7e, 0xf0, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7a, 0x48, 0x9a, 0x6e, 0xb4, 0x0a, 0x17, 0x5f, 0x40, 0x3b, 0x0f, 0x69, 0x4b, 0x2d, 0xb8, 0x8c, 0x77, 0x3f,
0x91, 0x8a, 0x11, 0x16, 0x00, 0x00, 0x02, 0x98, 0xa3, 0x5a, 0x5e, 0x5f, 0x96, 0xc7, 0x22, 0xe0, 0x7d, 0x04, 0x30, 0xc7, 0x2a, 0x55,
0x55, 0x45, 0xa8, 0x53, 0x66, 0x0b, 0x78, 0x76, 0x59, 0x97, 0x2f, 0xa4, 0x0f, 0xff, 0x13, 0x00,
0x00, 0xff, 0xff, 0x12, 0xa9, 0x06, 0x18, 0x84, 0x16, 0x00, 0x00,
} }

View File

@ -2,6 +2,7 @@ syntax = "proto3";
package pb; package pb;
import "google/protobuf/timestamp.proto"; import "google/protobuf/timestamp.proto";
import "logical/identity.proto";
message Empty {} message Empty {}
@ -132,18 +133,6 @@ message Request {
Connection connection = 20; Connection connection = 20;
} }
message Alias {
// MountType is the backend mount's type to which this identity belongs
string mount_type = 1;
// MountAccessor is the identifier of the mount entry to which this
// identity belongs
string mount_accessor = 2;
// Name is the identifier of this identity in its authentication source
string name = 3;
}
message Auth { message Auth {
LeaseOptions lease_options = 1; LeaseOptions lease_options = 1;
@ -195,13 +184,13 @@ message Auth {
// Alias is the information about the authenticated client returned by // Alias is the information about the authenticated client returned by
// the auth backend // the auth backend
Alias alias = 11; logical.Alias alias = 11;
// GroupAliases are the informational mappings of external groups which an // GroupAliases are the informational mappings of external groups which an
// authenticated user belongs to. This is used to check if there are // authenticated user belongs to. This is used to check if there are
// mappings groups for the group aliases in identity store. For all the // mappings groups for the group aliases in identity store. For all the
// matching groups, the entity ID of the user will be added. // matching groups, the entity ID of the user will be added.
repeated Alias group_aliases = 12; repeated logical.Alias group_aliases = 12;
// If set, restricts usage of the certificates to client IPs falling within // If set, restricts usage of the certificates to client IPs falling within
// the range of the specified CIDR(s). // the range of the specified CIDR(s).
@ -498,6 +487,15 @@ message LocalMountReply {
bool local = 1; bool local = 1;
} }
message EntityInfoArgs {
string entity_id = 1;
}
message EntityInfoReply {
logical.Entity entity = 1;
string err = 2;
}
// SystemView exposes system configuration information in a safe way for plugins // SystemView exposes system configuration information in a safe way for plugins
// to consume. Plugins should implement the client for this service. // to consume. Plugins should implement the client for this service.
service SystemView { service SystemView {
@ -541,6 +539,9 @@ service SystemView {
// LocalMount, when run from a system view attached to a request, indicates // LocalMount, when run from a system view attached to a request, indicates
// whether the request is affecting a local mount or not // whether the request is affecting a local mount or not
rpc LocalMount(Empty) returns (LocalMountReply); rpc LocalMount(Empty) returns (LocalMountReply);
// EntityInfo returns the basic entity information for the given entity id
rpc EntityInfo(EntityInfoArgs) returns (EntityInfoReply);
} }
message Connection { message Connection {

View File

@ -464,30 +464,6 @@ func LogicalResponseToProtoResponse(r *logical.Response) (*Response, error) {
}, nil }, nil
} }
func LogicalAliasToProtoAlias(a *logical.Alias) *Alias {
if a == nil {
return nil
}
return &Alias{
MountType: a.MountType,
MountAccessor: a.MountAccessor,
Name: a.Name,
}
}
func ProtoAliasToLogicalAlias(a *Alias) *logical.Alias {
if a == nil {
return nil
}
return &logical.Alias{
MountType: a.MountType,
MountAccessor: a.MountAccessor,
Name: a.Name,
}
}
func LogicalAuthToProtoAuth(a *logical.Auth) (*Auth, error) { func LogicalAuthToProtoAuth(a *logical.Auth) (*Auth, error) {
if a == nil { if a == nil {
return nil, nil return nil, nil
@ -498,11 +474,6 @@ func LogicalAuthToProtoAuth(a *logical.Auth) (*Auth, error) {
return nil, err return nil, err
} }
groupAliases := make([]*Alias, len(a.GroupAliases))
for i, al := range a.GroupAliases {
groupAliases[i] = LogicalAliasToProtoAlias(al)
}
lo, err := LogicalLeaseOptionsToProtoLeaseOptions(a.LeaseOptions) lo, err := LogicalLeaseOptionsToProtoLeaseOptions(a.LeaseOptions)
if err != nil { if err != nil {
return nil, err return nil, err
@ -524,8 +495,8 @@ func LogicalAuthToProtoAuth(a *logical.Auth) (*Auth, error) {
Period: int64(a.Period), Period: int64(a.Period),
NumUses: int64(a.NumUses), NumUses: int64(a.NumUses),
EntityID: a.EntityID, EntityID: a.EntityID,
Alias: LogicalAliasToProtoAlias(a.Alias), Alias: a.Alias,
GroupAliases: groupAliases, GroupAliases: a.GroupAliases,
BoundCidrs: boundCIDRs, BoundCidrs: boundCIDRs,
}, nil }, nil
} }
@ -541,11 +512,6 @@ func ProtoAuthToLogicalAuth(a *Auth) (*logical.Auth, error) {
return nil, err return nil, err
} }
groupAliases := make([]*logical.Alias, len(a.GroupAliases))
for i, al := range a.GroupAliases {
groupAliases[i] = ProtoAliasToLogicalAlias(al)
}
lo, err := ProtoLeaseOptionsToLogicalLeaseOptions(a.LeaseOptions) lo, err := ProtoLeaseOptionsToLogicalLeaseOptions(a.LeaseOptions)
if err != nil { if err != nil {
return nil, err return nil, err
@ -572,8 +538,8 @@ func ProtoAuthToLogicalAuth(a *Auth) (*logical.Auth, error) {
Period: time.Duration(a.Period), Period: time.Duration(a.Period),
NumUses: int(a.NumUses), NumUses: int(a.NumUses),
EntityID: a.EntityID, EntityID: a.EntityID,
Alias: ProtoAliasToLogicalAlias(a.Alias), Alias: a.Alias,
GroupAliases: groupAliases, GroupAliases: a.GroupAliases,
BoundCIDRs: boundCIDRs, BoundCIDRs: boundCIDRs,
}, nil }, nil
} }

View File

@ -129,6 +129,23 @@ func (s *SystemViewClient) LocalMount() bool {
return reply.Local return reply.Local
} }
func (s *SystemViewClient) EntityInfo(entityID string) (*logical.Entity, error) {
var reply EntityInfoReply
args := &EntityInfoArgs{
EntityID: entityID,
}
err := s.client.Call("Plugin.EntityInfo", args, &reply)
if err != nil {
return nil, err
}
if reply.Error != nil {
return nil, reply.Error
}
return reply.Entity, nil
}
type SystemViewServer struct { type SystemViewServer struct {
impl logical.SystemView impl logical.SystemView
} }
@ -221,6 +238,21 @@ func (s *SystemViewServer) LocalMount(_ interface{}, reply *LocalMountReply) err
return nil return nil
} }
func (s *SystemViewServer) EntityInfo(args *EntityInfoArgs, reply *EntityInfoReply) error {
entity, err := s.impl.EntityInfo(args.EntityID)
if err != nil {
*reply = EntityInfoReply{
Error: wrapError(err),
}
return nil
}
*reply = EntityInfoReply{
Entity: entity,
}
return nil
}
type DefaultLeaseTTLReply struct { type DefaultLeaseTTLReply struct {
DefaultLeaseTTL time.Duration DefaultLeaseTTL time.Duration
} }
@ -268,3 +300,12 @@ type MlockEnabledReply struct {
type LocalMountReply struct { type LocalMountReply struct {
Local bool Local bool
} }
type EntityInfoArgs struct {
EntityID string
}
type EntityInfoReply struct {
Entity *logical.Entity
Error error
}

View File

@ -174,3 +174,28 @@ func TestSystem_mlockEnabled(t *testing.T) {
t.Fatalf("expected: %v, got: %v", expected, actual) t.Fatalf("expected: %v, got: %v", expected, actual)
} }
} }
func TestSystem_entityInfo(t *testing.T) {
client, server := plugin.TestRPCConn(t)
defer client.Close()
sys := logical.TestSystemView()
sys.EntityVal = &logical.Entity{
ID: "test",
Name: "name",
}
server.RegisterName("Plugin", &SystemViewServer{
impl: sys,
})
testSystemView := &SystemViewClient{client: client}
actual, err := testSystemView.EntityInfo("")
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(sys.EntityVal, actual) {
t.Fatalf("expected: %v, got: %v", sys.EntityVal, actual)
}
}

View File

@ -57,6 +57,10 @@ type SystemView interface {
// MlockEnabled returns the configuration setting for enabling mlock on // MlockEnabled returns the configuration setting for enabling mlock on
// plugins. // plugins.
MlockEnabled() bool MlockEnabled() bool
// EntityInfo returns a subset of information related to the identity entity
// for the given entity id
EntityInfo(entityID string) (*Entity, error)
} }
type StaticSystemView struct { type StaticSystemView struct {
@ -69,6 +73,7 @@ type StaticSystemView struct {
EnableMlock bool EnableMlock bool
LocalMountVal bool LocalMountVal bool
ReplicationStateVal consts.ReplicationState ReplicationStateVal consts.ReplicationState
EntityVal *Entity
} }
func (d StaticSystemView) DefaultLeaseTTL() time.Duration { func (d StaticSystemView) DefaultLeaseTTL() time.Duration {
@ -110,3 +115,7 @@ func (d StaticSystemView) LookupPlugin(_ context.Context, name string) (*pluginu
func (d StaticSystemView) MlockEnabled() bool { func (d StaticSystemView) MlockEnabled() bool {
return d.EnableMlock return d.EnableMlock
} }
func (d StaticSystemView) EntityInfo(entityID string) (*Entity, error) {
return d.EntityVal, nil
}

View File

@ -145,3 +145,46 @@ func (d dynamicSystemView) LookupPlugin(ctx context.Context, name string) (*plug
func (d dynamicSystemView) MlockEnabled() bool { func (d dynamicSystemView) MlockEnabled() bool {
return d.core.enableMlock return d.core.enableMlock
} }
func (d dynamicSystemView) EntityInfo(entityID string) (*logical.Entity, error) {
// Requests from token created from the token backend will not have entity information.
// Return missing entity instead of error when requesting from MemDB.
if entityID == "" {
return nil, nil
}
if d.core == nil {
return nil, fmt.Errorf("system view core is nil")
}
if d.core.identityStore == nil {
return nil, fmt.Errorf("system view identity store is nil")
}
// Retrieve the entity from MemDB
entity, err := d.core.identityStore.MemDBEntityByID(entityID, false)
if err != nil {
return nil, err
}
if entity == nil {
return nil, nil
}
aliases := make([]*logical.Alias, len(entity.Aliases))
for i, alias := range entity.Aliases {
aliases[i] = &logical.Alias{
MountAccessor: alias.MountAccessor,
Name: alias.Name,
}
// MountType is not stored with the entity and must be looked up
if mount := d.core.router.validateMountByAccessor(alias.MountAccessor); mount != nil {
aliases[i].MountType = mount.MountType
}
}
// Only returning a subset of the data
return &logical.Entity{
ID: entity.ID,
Name: entity.Name,
Aliases: aliases,
}, nil
}