Add PluginEnv to SystemView (#5028)

This commit is contained in:
Jim Kalafut 2018-08-03 09:32:17 -07:00 committed by GitHub
parent dbd669103e
commit bb180b8661
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 494 additions and 182 deletions

77
logical/plugin.pb.go Normal file
View file

@ -0,0 +1,77 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: logical/plugin.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 PluginEnvironment struct {
// vault_version is the version of the Vault server
VaultVersion string `protobuf:"bytes,1,opt,name=vault_version,json=vaultVersion,proto3" json:"vault_version,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *PluginEnvironment) Reset() { *m = PluginEnvironment{} }
func (m *PluginEnvironment) String() string { return proto.CompactTextString(m) }
func (*PluginEnvironment) ProtoMessage() {}
func (*PluginEnvironment) Descriptor() ([]byte, []int) {
return fileDescriptor_plugin_d09b48a313e4c766, []int{0}
}
func (m *PluginEnvironment) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PluginEnvironment.Unmarshal(m, b)
}
func (m *PluginEnvironment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_PluginEnvironment.Marshal(b, m, deterministic)
}
func (dst *PluginEnvironment) XXX_Merge(src proto.Message) {
xxx_messageInfo_PluginEnvironment.Merge(dst, src)
}
func (m *PluginEnvironment) XXX_Size() int {
return xxx_messageInfo_PluginEnvironment.Size(m)
}
func (m *PluginEnvironment) XXX_DiscardUnknown() {
xxx_messageInfo_PluginEnvironment.DiscardUnknown(m)
}
var xxx_messageInfo_PluginEnvironment proto.InternalMessageInfo
func (m *PluginEnvironment) GetVaultVersion() string {
if m != nil {
return m.VaultVersion
}
return ""
}
func init() {
proto.RegisterType((*PluginEnvironment)(nil), "logical.PluginEnvironment")
}
func init() { proto.RegisterFile("logical/plugin.proto", fileDescriptor_plugin_d09b48a313e4c766) }
var fileDescriptor_plugin_d09b48a313e4c766 = []byte{
// 133 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xc9, 0xc9, 0x4f, 0xcf,
0x4c, 0x4e, 0xcc, 0xd1, 0x2f, 0xc8, 0x29, 0x4d, 0xcf, 0xcc, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9,
0x17, 0x62, 0x87, 0x8a, 0x2a, 0x59, 0x70, 0x09, 0x06, 0x80, 0x25, 0x5c, 0xf3, 0xca, 0x32, 0x8b,
0xf2, 0xf3, 0x72, 0x53, 0xf3, 0x4a, 0x84, 0x94, 0xb9, 0x78, 0xcb, 0x12, 0x4b, 0x73, 0x4a, 0xe2,
0xcb, 0x52, 0x8b, 0x8a, 0x33, 0xf3, 0xf3, 0x24, 0x18, 0x15, 0x18, 0x35, 0x38, 0x83, 0x78, 0xc0,
0x82, 0x61, 0x10, 0x31, 0x27, 0x95, 0x28, 0xa5, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4,
0xfc, 0x5c, 0xfd, 0x8c, 0xc4, 0xe2, 0x8c, 0xcc, 0xe4, 0xfc, 0xa2, 0x02, 0x7d, 0xb0, 0x22, 0x7d,
0xa8, 0xf9, 0x49, 0x6c, 0x60, 0xfb, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa3, 0xff, 0x48,
0xa9, 0x87, 0x00, 0x00, 0x00,
}

10
logical/plugin.proto Normal file
View file

@ -0,0 +1,10 @@
syntax = "proto3";
option go_package = "github.com/hashicorp/vault/logical";
package logical;
message PluginEnvironment {
// VaultVersion is the version of the Vault server
string vault_version = 1;
}

View file

@ -146,6 +146,15 @@ func (s *gRPCSystemViewClient) EntityInfo(entityID string) (*logical.Entity, err
return reply.Entity, nil
}
func (s *gRPCSystemViewClient) PluginEnv(ctx context.Context) (*logical.PluginEnvironment, error) {
reply, err := s.client.PluginEnv(ctx, &pb.Empty{})
if err != nil {
return nil, err
}
return reply.PluginEnvironment, nil
}
type gRPCSystemViewServer struct {
impl logical.SystemView
}
@ -242,3 +251,15 @@ func (s *gRPCSystemViewServer) EntityInfo(ctx context.Context, args *pb.EntityIn
Entity: entity,
}, nil
}
func (s *gRPCSystemViewServer) PluginEnv(ctx context.Context, _ *pb.Empty) (*pb.PluginEnvReply, error) {
pluginEnv, err := s.impl.PluginEnv(ctx)
if err != nil {
return &pb.PluginEnvReply{
Err: pb.ErrToString(err),
}, nil
}
return &pb.PluginEnvReply{
PluginEnvironment: pluginEnv,
}, nil
}

View file

@ -201,3 +201,32 @@ func TestSystem_GRPC_entityInfo(t *testing.T) {
t.Fatalf("expected: %v, got: %v", sys.EntityVal, actual)
}
}
func TestSystem_GRPC_pluginEnv(t *testing.T) {
sys := logical.TestSystemView()
sys.PluginEnvironment = &logical.PluginEnvironment{
VaultVersion: "0.10.42",
}
client, _ := plugin.TestGRPCConn(t, func(s *grpc.Server) {
pb.RegisterSystemViewServer(s, &gRPCSystemViewServer{
impl: sys,
})
})
defer client.Close()
testSystemView := newGRPCSystemView(client)
expected, err := sys.PluginEnv(context.Background())
if err != nil {
t.Fatal(err)
}
actual, err := testSystemView.PluginEnv(context.Background())
if err != nil {
t.Fatal(err)
}
if !proto.Equal(expected, actual) {
t.Fatalf("expected: %v, got: %v", expected, actual)
}
}

View file

@ -35,7 +35,7 @@ func (m *Empty) Reset() { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage() {}
func (*Empty) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{0}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{0}
}
func (m *Empty) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Empty.Unmarshal(m, b)
@ -66,7 +66,7 @@ func (m *Header) Reset() { *m = Header{} }
func (m *Header) String() string { return proto.CompactTextString(m) }
func (*Header) ProtoMessage() {}
func (*Header) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{1}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{1}
}
func (m *Header) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Header.Unmarshal(m, b)
@ -117,7 +117,7 @@ func (m *ProtoError) Reset() { *m = ProtoError{} }
func (m *ProtoError) String() string { return proto.CompactTextString(m) }
func (*ProtoError) ProtoMessage() {}
func (*ProtoError) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{2}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{2}
}
func (m *ProtoError) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ProtoError.Unmarshal(m, b)
@ -180,7 +180,7 @@ func (m *Paths) Reset() { *m = Paths{} }
func (m *Paths) String() string { return proto.CompactTextString(m) }
func (*Paths) ProtoMessage() {}
func (*Paths) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{3}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{3}
}
func (m *Paths) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Paths.Unmarshal(m, b)
@ -304,7 +304,7 @@ func (m *Request) Reset() { *m = Request{} }
func (m *Request) String() string { return proto.CompactTextString(m) }
func (*Request) ProtoMessage() {}
func (*Request) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{4}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{4}
}
func (m *Request) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Request.Unmarshal(m, b)
@ -523,7 +523,7 @@ func (m *Auth) Reset() { *m = Auth{} }
func (m *Auth) String() string { return proto.CompactTextString(m) }
func (*Auth) ProtoMessage() {}
func (*Auth) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{5}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{5}
}
func (m *Auth) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Auth.Unmarshal(m, b)
@ -649,7 +649,7 @@ func (m *LeaseOptions) Reset() { *m = LeaseOptions{} }
func (m *LeaseOptions) String() string { return proto.CompactTextString(m) }
func (*LeaseOptions) ProtoMessage() {}
func (*LeaseOptions) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{6}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{6}
}
func (m *LeaseOptions) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LeaseOptions.Unmarshal(m, b)
@ -723,7 +723,7 @@ func (m *Secret) Reset() { *m = Secret{} }
func (m *Secret) String() string { return proto.CompactTextString(m) }
func (*Secret) ProtoMessage() {}
func (*Secret) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{7}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{7}
}
func (m *Secret) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Secret.Unmarshal(m, b)
@ -794,7 +794,7 @@ func (m *Response) Reset() { *m = Response{} }
func (m *Response) String() string { return proto.CompactTextString(m) }
func (*Response) ProtoMessage() {}
func (*Response) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{8}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{8}
}
func (m *Response) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Response.Unmarshal(m, b)
@ -889,7 +889,7 @@ func (m *ResponseWrapInfo) Reset() { *m = ResponseWrapInfo{} }
func (m *ResponseWrapInfo) String() string { return proto.CompactTextString(m) }
func (*ResponseWrapInfo) ProtoMessage() {}
func (*ResponseWrapInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{9}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{9}
}
func (m *ResponseWrapInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResponseWrapInfo.Unmarshal(m, b)
@ -991,7 +991,7 @@ func (m *RequestWrapInfo) Reset() { *m = RequestWrapInfo{} }
func (m *RequestWrapInfo) String() string { return proto.CompactTextString(m) }
func (*RequestWrapInfo) ProtoMessage() {}
func (*RequestWrapInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{10}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{10}
}
func (m *RequestWrapInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RequestWrapInfo.Unmarshal(m, b)
@ -1045,7 +1045,7 @@ func (m *HandleRequestArgs) Reset() { *m = HandleRequestArgs{} }
func (m *HandleRequestArgs) String() string { return proto.CompactTextString(m) }
func (*HandleRequestArgs) ProtoMessage() {}
func (*HandleRequestArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{11}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{11}
}
func (m *HandleRequestArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_HandleRequestArgs.Unmarshal(m, b)
@ -1092,7 +1092,7 @@ func (m *HandleRequestReply) Reset() { *m = HandleRequestReply{} }
func (m *HandleRequestReply) String() string { return proto.CompactTextString(m) }
func (*HandleRequestReply) ProtoMessage() {}
func (*HandleRequestReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{12}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{12}
}
func (m *HandleRequestReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_HandleRequestReply.Unmarshal(m, b)
@ -1138,7 +1138,7 @@ func (m *SpecialPathsReply) Reset() { *m = SpecialPathsReply{} }
func (m *SpecialPathsReply) String() string { return proto.CompactTextString(m) }
func (*SpecialPathsReply) ProtoMessage() {}
func (*SpecialPathsReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{13}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{13}
}
func (m *SpecialPathsReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SpecialPathsReply.Unmarshal(m, b)
@ -1178,7 +1178,7 @@ func (m *HandleExistenceCheckArgs) Reset() { *m = HandleExistenceCheckAr
func (m *HandleExistenceCheckArgs) String() string { return proto.CompactTextString(m) }
func (*HandleExistenceCheckArgs) ProtoMessage() {}
func (*HandleExistenceCheckArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{14}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{14}
}
func (m *HandleExistenceCheckArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_HandleExistenceCheckArgs.Unmarshal(m, b)
@ -1226,7 +1226,7 @@ func (m *HandleExistenceCheckReply) Reset() { *m = HandleExistenceCheckR
func (m *HandleExistenceCheckReply) String() string { return proto.CompactTextString(m) }
func (*HandleExistenceCheckReply) ProtoMessage() {}
func (*HandleExistenceCheckReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{15}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{15}
}
func (m *HandleExistenceCheckReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_HandleExistenceCheckReply.Unmarshal(m, b)
@ -1281,7 +1281,7 @@ func (m *SetupArgs) Reset() { *m = SetupArgs{} }
func (m *SetupArgs) String() string { return proto.CompactTextString(m) }
func (*SetupArgs) ProtoMessage() {}
func (*SetupArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{16}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{16}
}
func (m *SetupArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SetupArgs.Unmarshal(m, b)
@ -1334,7 +1334,7 @@ func (m *SetupReply) Reset() { *m = SetupReply{} }
func (m *SetupReply) String() string { return proto.CompactTextString(m) }
func (*SetupReply) ProtoMessage() {}
func (*SetupReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{17}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{17}
}
func (m *SetupReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SetupReply.Unmarshal(m, b)
@ -1373,7 +1373,7 @@ func (m *TypeReply) Reset() { *m = TypeReply{} }
func (m *TypeReply) String() string { return proto.CompactTextString(m) }
func (*TypeReply) ProtoMessage() {}
func (*TypeReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{18}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{18}
}
func (m *TypeReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TypeReply.Unmarshal(m, b)
@ -1411,7 +1411,7 @@ func (m *InvalidateKeyArgs) Reset() { *m = InvalidateKeyArgs{} }
func (m *InvalidateKeyArgs) String() string { return proto.CompactTextString(m) }
func (*InvalidateKeyArgs) ProtoMessage() {}
func (*InvalidateKeyArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{19}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{19}
}
func (m *InvalidateKeyArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InvalidateKeyArgs.Unmarshal(m, b)
@ -1451,7 +1451,7 @@ func (m *StorageEntry) Reset() { *m = StorageEntry{} }
func (m *StorageEntry) String() string { return proto.CompactTextString(m) }
func (*StorageEntry) ProtoMessage() {}
func (*StorageEntry) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{20}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{20}
}
func (m *StorageEntry) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageEntry.Unmarshal(m, b)
@ -1503,7 +1503,7 @@ func (m *StorageListArgs) Reset() { *m = StorageListArgs{} }
func (m *StorageListArgs) String() string { return proto.CompactTextString(m) }
func (*StorageListArgs) ProtoMessage() {}
func (*StorageListArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{21}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{21}
}
func (m *StorageListArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageListArgs.Unmarshal(m, b)
@ -1542,7 +1542,7 @@ func (m *StorageListReply) Reset() { *m = StorageListReply{} }
func (m *StorageListReply) String() string { return proto.CompactTextString(m) }
func (*StorageListReply) ProtoMessage() {}
func (*StorageListReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{22}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{22}
}
func (m *StorageListReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageListReply.Unmarshal(m, b)
@ -1587,7 +1587,7 @@ func (m *StorageGetArgs) Reset() { *m = StorageGetArgs{} }
func (m *StorageGetArgs) String() string { return proto.CompactTextString(m) }
func (*StorageGetArgs) ProtoMessage() {}
func (*StorageGetArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{23}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{23}
}
func (m *StorageGetArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageGetArgs.Unmarshal(m, b)
@ -1626,7 +1626,7 @@ func (m *StorageGetReply) Reset() { *m = StorageGetReply{} }
func (m *StorageGetReply) String() string { return proto.CompactTextString(m) }
func (*StorageGetReply) ProtoMessage() {}
func (*StorageGetReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{24}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{24}
}
func (m *StorageGetReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageGetReply.Unmarshal(m, b)
@ -1671,7 +1671,7 @@ func (m *StoragePutArgs) Reset() { *m = StoragePutArgs{} }
func (m *StoragePutArgs) String() string { return proto.CompactTextString(m) }
func (*StoragePutArgs) ProtoMessage() {}
func (*StoragePutArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{25}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{25}
}
func (m *StoragePutArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StoragePutArgs.Unmarshal(m, b)
@ -1709,7 +1709,7 @@ func (m *StoragePutReply) Reset() { *m = StoragePutReply{} }
func (m *StoragePutReply) String() string { return proto.CompactTextString(m) }
func (*StoragePutReply) ProtoMessage() {}
func (*StoragePutReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{26}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{26}
}
func (m *StoragePutReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StoragePutReply.Unmarshal(m, b)
@ -1747,7 +1747,7 @@ func (m *StorageDeleteArgs) Reset() { *m = StorageDeleteArgs{} }
func (m *StorageDeleteArgs) String() string { return proto.CompactTextString(m) }
func (*StorageDeleteArgs) ProtoMessage() {}
func (*StorageDeleteArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{27}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{27}
}
func (m *StorageDeleteArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageDeleteArgs.Unmarshal(m, b)
@ -1785,7 +1785,7 @@ func (m *StorageDeleteReply) Reset() { *m = StorageDeleteReply{} }
func (m *StorageDeleteReply) String() string { return proto.CompactTextString(m) }
func (*StorageDeleteReply) ProtoMessage() {}
func (*StorageDeleteReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{28}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{28}
}
func (m *StorageDeleteReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageDeleteReply.Unmarshal(m, b)
@ -1823,7 +1823,7 @@ func (m *TTLReply) Reset() { *m = TTLReply{} }
func (m *TTLReply) String() string { return proto.CompactTextString(m) }
func (*TTLReply) ProtoMessage() {}
func (*TTLReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{29}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{29}
}
func (m *TTLReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TTLReply.Unmarshal(m, b)
@ -1862,7 +1862,7 @@ func (m *SudoPrivilegeArgs) Reset() { *m = SudoPrivilegeArgs{} }
func (m *SudoPrivilegeArgs) String() string { return proto.CompactTextString(m) }
func (*SudoPrivilegeArgs) ProtoMessage() {}
func (*SudoPrivilegeArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{30}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{30}
}
func (m *SudoPrivilegeArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SudoPrivilegeArgs.Unmarshal(m, b)
@ -1907,7 +1907,7 @@ func (m *SudoPrivilegeReply) Reset() { *m = SudoPrivilegeReply{} }
func (m *SudoPrivilegeReply) String() string { return proto.CompactTextString(m) }
func (*SudoPrivilegeReply) ProtoMessage() {}
func (*SudoPrivilegeReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{31}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{31}
}
func (m *SudoPrivilegeReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SudoPrivilegeReply.Unmarshal(m, b)
@ -1945,7 +1945,7 @@ func (m *TaintedReply) Reset() { *m = TaintedReply{} }
func (m *TaintedReply) String() string { return proto.CompactTextString(m) }
func (*TaintedReply) ProtoMessage() {}
func (*TaintedReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{32}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{32}
}
func (m *TaintedReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaintedReply.Unmarshal(m, b)
@ -1983,7 +1983,7 @@ func (m *CachingDisabledReply) Reset() { *m = CachingDisabledReply{} }
func (m *CachingDisabledReply) String() string { return proto.CompactTextString(m) }
func (*CachingDisabledReply) ProtoMessage() {}
func (*CachingDisabledReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{33}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{33}
}
func (m *CachingDisabledReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CachingDisabledReply.Unmarshal(m, b)
@ -2021,7 +2021,7 @@ func (m *ReplicationStateReply) Reset() { *m = ReplicationStateReply{} }
func (m *ReplicationStateReply) String() string { return proto.CompactTextString(m) }
func (*ReplicationStateReply) ProtoMessage() {}
func (*ReplicationStateReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{34}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{34}
}
func (m *ReplicationStateReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReplicationStateReply.Unmarshal(m, b)
@ -2061,7 +2061,7 @@ func (m *ResponseWrapDataArgs) Reset() { *m = ResponseWrapDataArgs{} }
func (m *ResponseWrapDataArgs) String() string { return proto.CompactTextString(m) }
func (*ResponseWrapDataArgs) ProtoMessage() {}
func (*ResponseWrapDataArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{35}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{35}
}
func (m *ResponseWrapDataArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResponseWrapDataArgs.Unmarshal(m, b)
@ -2114,7 +2114,7 @@ func (m *ResponseWrapDataReply) Reset() { *m = ResponseWrapDataReply{} }
func (m *ResponseWrapDataReply) String() string { return proto.CompactTextString(m) }
func (*ResponseWrapDataReply) ProtoMessage() {}
func (*ResponseWrapDataReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{36}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{36}
}
func (m *ResponseWrapDataReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResponseWrapDataReply.Unmarshal(m, b)
@ -2159,7 +2159,7 @@ func (m *MlockEnabledReply) Reset() { *m = MlockEnabledReply{} }
func (m *MlockEnabledReply) String() string { return proto.CompactTextString(m) }
func (*MlockEnabledReply) ProtoMessage() {}
func (*MlockEnabledReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{37}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{37}
}
func (m *MlockEnabledReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MlockEnabledReply.Unmarshal(m, b)
@ -2197,7 +2197,7 @@ func (m *LocalMountReply) Reset() { *m = LocalMountReply{} }
func (m *LocalMountReply) String() string { return proto.CompactTextString(m) }
func (*LocalMountReply) ProtoMessage() {}
func (*LocalMountReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{38}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{38}
}
func (m *LocalMountReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LocalMountReply.Unmarshal(m, b)
@ -2235,7 +2235,7 @@ 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_47c8b1854cae270c, []int{39}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{39}
}
func (m *EntityInfoArgs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_EntityInfoArgs.Unmarshal(m, b)
@ -2274,7 +2274,7 @@ 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_47c8b1854cae270c, []int{40}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{40}
}
func (m *EntityInfoReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_EntityInfoReply.Unmarshal(m, b)
@ -2308,6 +2308,52 @@ func (m *EntityInfoReply) GetErr() string {
return ""
}
type PluginEnvReply struct {
PluginEnvironment *logical.PluginEnvironment `sentinel:"" protobuf:"bytes,1,opt,name=plugin_environment,json=pluginEnvironment,proto3" json:"plugin_environment,omitempty"`
Err string `sentinel:"" protobuf:"bytes,2,opt,name=err,proto3" json:"err,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *PluginEnvReply) Reset() { *m = PluginEnvReply{} }
func (m *PluginEnvReply) String() string { return proto.CompactTextString(m) }
func (*PluginEnvReply) ProtoMessage() {}
func (*PluginEnvReply) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_6306a5aa9d5ea026, []int{41}
}
func (m *PluginEnvReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PluginEnvReply.Unmarshal(m, b)
}
func (m *PluginEnvReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_PluginEnvReply.Marshal(b, m, deterministic)
}
func (dst *PluginEnvReply) XXX_Merge(src proto.Message) {
xxx_messageInfo_PluginEnvReply.Merge(dst, src)
}
func (m *PluginEnvReply) XXX_Size() int {
return xxx_messageInfo_PluginEnvReply.Size(m)
}
func (m *PluginEnvReply) XXX_DiscardUnknown() {
xxx_messageInfo_PluginEnvReply.DiscardUnknown(m)
}
var xxx_messageInfo_PluginEnvReply proto.InternalMessageInfo
func (m *PluginEnvReply) GetPluginEnvironment() *logical.PluginEnvironment {
if m != nil {
return m.PluginEnvironment
}
return nil
}
func (m *PluginEnvReply) GetErr() string {
if m != nil {
return m.Err
}
return ""
}
type Connection struct {
// RemoteAddr is the network address that sent the request.
RemoteAddr string `sentinel:"" protobuf:"bytes,1,opt,name=remote_addr,json=remoteAddr,proto3" json:"remote_addr,omitempty"`
@ -2320,7 +2366,7 @@ func (m *Connection) Reset() { *m = Connection{} }
func (m *Connection) String() string { return proto.CompactTextString(m) }
func (*Connection) ProtoMessage() {}
func (*Connection) Descriptor() ([]byte, []int) {
return fileDescriptor_backend_47c8b1854cae270c, []int{41}
return fileDescriptor_backend_6306a5aa9d5ea026, []int{42}
}
func (m *Connection) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Connection.Unmarshal(m, b)
@ -2392,6 +2438,7 @@ func init() {
proto.RegisterType((*LocalMountReply)(nil), "pb.LocalMountReply")
proto.RegisterType((*EntityInfoArgs)(nil), "pb.EntityInfoArgs")
proto.RegisterType((*EntityInfoReply)(nil), "pb.EntityInfoReply")
proto.RegisterType((*PluginEnvReply)(nil), "pb.PluginEnvReply")
proto.RegisterType((*Connection)(nil), "pb.Connection")
}
@ -2916,6 +2963,8 @@ type SystemViewClient interface {
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)
// PluginEnv returns Vault environment information used by plugins
PluginEnv(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*PluginEnvReply, error)
}
type systemViewClient struct {
@ -3016,6 +3065,15 @@ func (c *systemViewClient) EntityInfo(ctx context.Context, in *EntityInfoArgs, o
return out, nil
}
func (c *systemViewClient) PluginEnv(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*PluginEnvReply, error) {
out := new(PluginEnvReply)
err := c.cc.Invoke(ctx, "/pb.SystemView/PluginEnv", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// SystemViewServer is the server API for SystemView service.
type SystemViewServer interface {
// DefaultLeaseTTL returns the default lease TTL set in Vault configuration
@ -3052,6 +3110,8 @@ type SystemViewServer interface {
LocalMount(context.Context, *Empty) (*LocalMountReply, error)
// EntityInfo returns the basic entity information for the given entity id
EntityInfo(context.Context, *EntityInfoArgs) (*EntityInfoReply, error)
// PluginEnv returns Vault environment information used by plugins
PluginEnv(context.Context, *Empty) (*PluginEnvReply, error)
}
func RegisterSystemViewServer(s *grpc.Server, srv SystemViewServer) {
@ -3238,6 +3298,24 @@ func _SystemView_EntityInfo_Handler(srv interface{}, ctx context.Context, dec fu
return interceptor(ctx, in, info, handler)
}
func _SystemView_PluginEnv_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(Empty)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(SystemViewServer).PluginEnv(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/pb.SystemView/PluginEnv",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(SystemViewServer).PluginEnv(ctx, req.(*Empty))
}
return interceptor(ctx, in, info, handler)
}
var _SystemView_serviceDesc = grpc.ServiceDesc{
ServiceName: "pb.SystemView",
HandlerType: (*SystemViewServer)(nil),
@ -3282,153 +3360,161 @@ var _SystemView_serviceDesc = grpc.ServiceDesc{
MethodName: "EntityInfo",
Handler: _SystemView_EntityInfo_Handler,
},
{
MethodName: "PluginEnv",
Handler: _SystemView_PluginEnv_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "logical/plugin/pb/backend.proto",
}
func init() {
proto.RegisterFile("logical/plugin/pb/backend.proto", fileDescriptor_backend_47c8b1854cae270c)
proto.RegisterFile("logical/plugin/pb/backend.proto", fileDescriptor_backend_6306a5aa9d5ea026)
}
var fileDescriptor_backend_47c8b1854cae270c = []byte{
// 2201 bytes of a gzipped FileDescriptorProto
var fileDescriptor_backend_6306a5aa9d5ea026 = []byte{
// 2258 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x5f, 0x73, 0xdb, 0xc6,
0x11, 0x1f, 0xfe, 0x07, 0x97, 0xa4, 0x28, 0x9d, 0x15, 0x17, 0xa6, 0x9d, 0x9a, 0x45, 0x6a, 0x9b,
0xf1, 0xc4, 0x94, 0xcd, 0x34, 0xad, 0xd3, 0x4e, 0xd2, 0x51, 0x24, 0xc5, 0x51, 0x23, 0x25, 0x1a,
0x48, 0x6e, 0xfa, 0x6f, 0x86, 0x39, 0x02, 0x2b, 0x12, 0x23, 0x10, 0x40, 0x0f, 0x07, 0xc9, 0x7c,
0xea, 0xb7, 0xe8, 0x43, 0x67, 0xfa, 0x19, 0xfa, 0xda, 0xb7, 0xbe, 0x76, 0xa6, 0xcf, 0xfd, 0x1a,
0xfd, 0x0c, 0x9d, 0xfb, 0x03, 0x10, 0x20, 0xa9, 0xc6, 0x9d, 0x69, 0xdf, 0x6e, 0xff, 0xdd, 0xde,
0x2e, 0x76, 0x7f, 0x7b, 0x07, 0x78, 0xe8, 0x87, 0x53, 0xcf, 0xa1, 0xfe, 0x5e, 0xe4, 0x27, 0x53,
0x2f, 0xd8, 0x8b, 0x26, 0x7b, 0x13, 0xea, 0x5c, 0x61, 0xe0, 0x0e, 0x23, 0x16, 0xf2, 0x90, 0x94,
0xa3, 0x49, 0xef, 0xe1, 0x34, 0x0c, 0xa7, 0x3e, 0xee, 0x49, 0xce, 0x24, 0xb9, 0xdc, 0xe3, 0xde,
0x1c, 0x63, 0x4e, 0xe7, 0x91, 0x52, 0xea, 0xdd, 0x4d, 0x77, 0xf1, 0x5c, 0x0c, 0xb8, 0xc7, 0x17,
0x8a, 0x6f, 0x35, 0xa0, 0x76, 0x34, 0x8f, 0xf8, 0xc2, 0xea, 0x43, 0xfd, 0x0b, 0xa4, 0x2e, 0x32,
0x72, 0x17, 0xea, 0x33, 0xb9, 0x32, 0x4b, 0xfd, 0xca, 0xa0, 0x69, 0x6b, 0xca, 0xfa, 0x2d, 0xc0,
0x99, 0xb0, 0x39, 0x62, 0x2c, 0x64, 0xe4, 0x1e, 0x18, 0xc8, 0xd8, 0x98, 0x2f, 0x22, 0x34, 0x4b,
0xfd, 0xd2, 0xa0, 0x63, 0x37, 0x90, 0xb1, 0x8b, 0x45, 0x84, 0xe4, 0x7b, 0x20, 0x96, 0xe3, 0x79,
0x3c, 0x35, 0xcb, 0xfd, 0x92, 0xd8, 0x01, 0x19, 0x3b, 0x8d, 0xa7, 0xa9, 0x8d, 0x13, 0xba, 0x68,
0x56, 0xfa, 0xa5, 0x41, 0x45, 0xda, 0x1c, 0x84, 0x2e, 0x5a, 0x7f, 0x2c, 0x41, 0xed, 0x8c, 0xf2,
0x59, 0x4c, 0x08, 0x54, 0x59, 0x18, 0x72, 0xed, 0x5c, 0xae, 0xc9, 0x00, 0xba, 0x49, 0x40, 0x13,
0x3e, 0x13, 0x67, 0x77, 0x28, 0x47, 0xd7, 0x2c, 0x4b, 0xf1, 0x2a, 0x9b, 0xbc, 0x07, 0x1d, 0x3f,
0x74, 0xa8, 0x3f, 0x8e, 0x79, 0xc8, 0xe8, 0x54, 0xf8, 0x11, 0x7a, 0x6d, 0xc9, 0x3c, 0x57, 0x3c,
0xf2, 0x14, 0x76, 0x62, 0xa4, 0xfe, 0xf8, 0x86, 0xd1, 0x28, 0x53, 0xac, 0xaa, 0x0d, 0x85, 0xe0,
0x1b, 0x46, 0x23, 0xad, 0x6b, 0xfd, 0xad, 0x0e, 0x0d, 0x1b, 0x7f, 0x9f, 0x60, 0xcc, 0xc9, 0x16,
0x94, 0x3d, 0x57, 0x46, 0xdb, 0xb4, 0xcb, 0x9e, 0x4b, 0x86, 0x40, 0x6c, 0x8c, 0x7c, 0xe1, 0xda,
0x0b, 0x83, 0x03, 0x3f, 0x89, 0x39, 0x32, 0x1d, 0xf3, 0x06, 0x09, 0x79, 0x00, 0xcd, 0x30, 0x42,
0x26, 0x79, 0x32, 0x01, 0x4d, 0x7b, 0xc9, 0x10, 0x81, 0x47, 0x94, 0xcf, 0xcc, 0xaa, 0x14, 0xc8,
0xb5, 0xe0, 0xb9, 0x94, 0x53, 0xb3, 0xa6, 0x78, 0x62, 0x4d, 0x2c, 0xa8, 0xc7, 0xe8, 0x30, 0xe4,
0x66, 0xbd, 0x5f, 0x1a, 0xb4, 0x46, 0x30, 0x8c, 0x26, 0xc3, 0x73, 0xc9, 0xb1, 0xb5, 0x84, 0x3c,
0x80, 0xaa, 0xc8, 0x8b, 0xd9, 0x90, 0x1a, 0x86, 0xd0, 0xd8, 0x4f, 0xf8, 0xcc, 0x96, 0x5c, 0x32,
0x82, 0x86, 0xfa, 0xa6, 0xb1, 0x69, 0xf4, 0x2b, 0x83, 0xd6, 0xc8, 0x14, 0x0a, 0x3a, 0xca, 0xa1,
0x2a, 0x83, 0xf8, 0x28, 0xe0, 0x6c, 0x61, 0xa7, 0x8a, 0xe4, 0x07, 0xd0, 0x76, 0x7c, 0x0f, 0x03,
0x3e, 0xe6, 0xe1, 0x15, 0x06, 0x66, 0x53, 0x9e, 0xa8, 0xa5, 0x78, 0x17, 0x82, 0x45, 0x46, 0xf0,
0x4e, 0x5e, 0x65, 0x4c, 0x1d, 0x07, 0xe3, 0x38, 0x64, 0x26, 0x48, 0xdd, 0x3b, 0x39, 0xdd, 0x7d,
0x2d, 0x12, 0xdb, 0xba, 0x5e, 0x1c, 0xf9, 0x74, 0x31, 0x0e, 0xe8, 0x1c, 0xcd, 0x96, 0xda, 0x56,
0xf3, 0xbe, 0xa2, 0x73, 0x24, 0x0f, 0xa1, 0x35, 0x0f, 0x93, 0x80, 0x8f, 0xa3, 0xd0, 0x0b, 0xb8,
0xd9, 0x96, 0x1a, 0x20, 0x59, 0x67, 0x82, 0x43, 0xde, 0x05, 0x45, 0xa9, 0x62, 0xec, 0xa8, 0xbc,
0x4a, 0x8e, 0x2c, 0xc7, 0x47, 0xb0, 0xa5, 0xc4, 0xd9, 0x79, 0xb6, 0xa4, 0x4a, 0x47, 0x72, 0xb3,
0x93, 0x3c, 0x87, 0xa6, 0xac, 0x07, 0x2f, 0xb8, 0x0c, 0xcd, 0xae, 0xcc, 0xdb, 0x9d, 0x5c, 0x5a,
0x44, 0x4d, 0x1c, 0x07, 0x97, 0xa1, 0x6d, 0xdc, 0xe8, 0x15, 0xf9, 0x04, 0xee, 0x17, 0xe2, 0x65,
0x38, 0xa7, 0x5e, 0xe0, 0x05, 0xd3, 0x71, 0x12, 0x63, 0x6c, 0x6e, 0xcb, 0x0a, 0x37, 0x73, 0x51,
0xdb, 0xa9, 0xc2, 0xeb, 0x18, 0x63, 0x72, 0x1f, 0x9a, 0xaa, 0x15, 0xc7, 0x9e, 0x6b, 0xee, 0xc8,
0x23, 0x19, 0x8a, 0x71, 0xec, 0x92, 0x27, 0xd0, 0x8d, 0x42, 0xdf, 0x73, 0x16, 0xe3, 0xf0, 0x1a,
0x19, 0xf3, 0x5c, 0x34, 0x49, 0xbf, 0x34, 0x30, 0xec, 0x2d, 0xc5, 0xfe, 0x5a, 0x73, 0x37, 0xb5,
0xc6, 0x1d, 0xa9, 0xb8, 0xd6, 0x1a, 0x43, 0x00, 0x27, 0x0c, 0x02, 0x74, 0x64, 0xf9, 0xed, 0xca,
0x08, 0xb7, 0x44, 0x84, 0x07, 0x19, 0xd7, 0xce, 0x69, 0xf4, 0x3e, 0x87, 0x76, 0xbe, 0x14, 0xc8,
0x36, 0x54, 0xae, 0x70, 0xa1, 0xcb, 0x5f, 0x2c, 0x49, 0x1f, 0x6a, 0xd7, 0xd4, 0x4f, 0x50, 0x96,
0xbc, 0x2e, 0x44, 0x65, 0x62, 0x2b, 0xc1, 0x4f, 0xcb, 0x2f, 0x4b, 0xd6, 0x9f, 0xab, 0x50, 0x15,
0xc5, 0x47, 0x3e, 0x82, 0x8e, 0x8f, 0x34, 0xc6, 0x71, 0x18, 0x09, 0x07, 0xb1, 0xdc, 0xaa, 0x35,
0xda, 0x16, 0x66, 0x27, 0x42, 0xf0, 0xb5, 0xe2, 0xdb, 0x6d, 0x3f, 0x47, 0x89, 0x96, 0xf6, 0x02,
0x8e, 0x2c, 0xa0, 0xfe, 0x58, 0x36, 0x83, 0x6a, 0xb0, 0x76, 0xca, 0x3c, 0x14, 0x4d, 0xb1, 0x5a,
0x47, 0x95, 0xf5, 0x3a, 0xea, 0x81, 0x21, 0x73, 0xe7, 0x61, 0xac, 0x9b, 0x3d, 0xa3, 0xc9, 0x08,
0x8c, 0x39, 0x72, 0xaa, 0x7b, 0x4d, 0xb4, 0xc4, 0xdd, 0xb4, 0x67, 0x86, 0xa7, 0x5a, 0xa0, 0x1a,
0x22, 0xd3, 0x5b, 0xeb, 0x88, 0xfa, 0x7a, 0x47, 0xf4, 0xc0, 0xc8, 0x8a, 0xae, 0xa1, 0xbe, 0x70,
0x4a, 0x0b, 0x98, 0x8d, 0x90, 0x79, 0xa1, 0x6b, 0x1a, 0xb2, 0x50, 0x34, 0x25, 0x40, 0x32, 0x48,
0xe6, 0xaa, 0x84, 0x9a, 0x0a, 0x24, 0x83, 0x64, 0xbe, 0x5e, 0x31, 0xb0, 0x52, 0x31, 0x3f, 0x84,
0x1a, 0xf5, 0x3d, 0x1a, 0xcb, 0x16, 0x12, 0x5f, 0x56, 0x23, 0xfe, 0x70, 0x5f, 0x70, 0x6d, 0x25,
0x24, 0x1f, 0x42, 0x67, 0xca, 0xc2, 0x24, 0x1a, 0x4b, 0x12, 0x63, 0xb3, 0x2d, 0xa3, 0x5d, 0xd5,
0x6e, 0x4b, 0xa5, 0x7d, 0xa5, 0x23, 0x3a, 0x70, 0x12, 0x26, 0x81, 0x3b, 0x76, 0x3c, 0x97, 0xc5,
0x66, 0x47, 0x26, 0x0f, 0x24, 0xeb, 0x40, 0x70, 0x7a, 0x3f, 0x83, 0x4e, 0x21, 0x4b, 0x1b, 0x6a,
0x65, 0x37, 0x5f, 0x2b, 0xcd, 0x7c, 0x7d, 0xfc, 0xa5, 0x04, 0xed, 0xfc, 0xe7, 0x17, 0xc6, 0x17,
0x17, 0x27, 0xd2, 0xb8, 0x62, 0x8b, 0xa5, 0x00, 0x4e, 0x86, 0x01, 0xde, 0xd0, 0x89, 0xaf, 0x36,
0x30, 0xec, 0x25, 0x43, 0x48, 0xbd, 0xc0, 0x61, 0x38, 0xc7, 0x80, 0xeb, 0xb9, 0xb2, 0x64, 0x90,
0x8f, 0x01, 0xbc, 0x38, 0x4e, 0x70, 0x2c, 0x46, 0xa2, 0x04, 0xd7, 0xd6, 0xa8, 0x37, 0x54, 0xf3,
0x72, 0x98, 0xce, 0xcb, 0xe1, 0x45, 0x3a, 0x2f, 0xed, 0xa6, 0xd4, 0x16, 0xb4, 0xf8, 0x44, 0xa7,
0xf4, 0x8d, 0x38, 0x4b, 0x4d, 0x7d, 0x22, 0x45, 0x59, 0x7f, 0x80, 0xba, 0xc2, 0xdb, 0xff, 0x6b,
0x49, 0xdf, 0x03, 0x43, 0xed, 0xed, 0xb9, 0xba, 0x9c, 0x1b, 0x92, 0x3e, 0x76, 0xad, 0x7f, 0x94,
0xc0, 0xb0, 0x31, 0x8e, 0xc2, 0x20, 0xc6, 0xdc, 0x3c, 0x28, 0x7d, 0xe7, 0x3c, 0x28, 0x6f, 0x9c,
0x07, 0xe9, 0x94, 0xa9, 0xe4, 0xa6, 0x4c, 0x0f, 0x0c, 0x86, 0xae, 0xc7, 0xd0, 0xe1, 0x7a, 0x22,
0x65, 0xb4, 0x90, 0xdd, 0x50, 0x26, 0x80, 0x2c, 0x96, 0xdd, 0xd2, 0xb4, 0x33, 0x9a, 0xbc, 0xc8,
0xc3, 0xa8, 0x1a, 0x50, 0xbb, 0x0a, 0x46, 0xd5, 0x71, 0xd7, 0x71, 0xd4, 0xfa, 0x7b, 0x19, 0xb6,
0x57, 0xc5, 0x1b, 0x8a, 0x60, 0x17, 0x6a, 0xaa, 0xd1, 0x74, 0x05, 0xf1, 0xb5, 0x16, 0xab, 0xac,
0xb4, 0xd8, 0xcf, 0xa1, 0xe3, 0x30, 0x94, 0xd3, 0xf5, 0x6d, 0xbf, 0x7e, 0x3b, 0x35, 0x90, 0x05,
0xf0, 0x3e, 0x6c, 0x8b, 0x53, 0x46, 0xe8, 0x2e, 0x87, 0x87, 0x1a, 0xc5, 0x5d, 0xcd, 0xcf, 0xc6,
0xc7, 0x53, 0xd8, 0x49, 0x55, 0x97, 0x3d, 0x5a, 0x2f, 0xe8, 0x1e, 0xa5, 0xad, 0x7a, 0x17, 0xea,
0x97, 0x21, 0x9b, 0x53, 0xae, 0x41, 0x41, 0x53, 0xa2, 0x2c, 0xb2, 0xf3, 0xca, 0xab, 0x80, 0xa1,
0xca, 0x22, 0x65, 0x8a, 0x0b, 0x92, 0x00, 0x81, 0xec, 0xf2, 0x22, 0x01, 0xc2, 0xb0, 0x8d, 0xf4,
0xd2, 0x62, 0xfd, 0x0a, 0xba, 0x2b, 0xf3, 0x6a, 0x43, 0x22, 0x97, 0xee, 0xcb, 0x05, 0xf7, 0x85,
0x9d, 0x2b, 0x2b, 0x3b, 0xff, 0x1a, 0x76, 0xbe, 0xa0, 0x81, 0xeb, 0xa3, 0xde, 0x7f, 0x9f, 0x4d,
0x63, 0x31, 0x79, 0xf5, 0xf5, 0x69, 0xac, 0x2f, 0x46, 0x1d, 0xbb, 0xa9, 0x39, 0xc7, 0x2e, 0x79,
0x04, 0x0d, 0xa6, 0xb4, 0x75, 0xe1, 0xb5, 0x72, 0x03, 0xd5, 0x4e, 0x65, 0xd6, 0xb7, 0x40, 0x0a,
0x5b, 0x8b, 0x9b, 0xd3, 0x82, 0x0c, 0x44, 0x01, 0xaa, 0xa2, 0xd0, 0x85, 0xdd, 0xce, 0xd7, 0x91,
0x9d, 0x49, 0x49, 0x1f, 0x2a, 0xc8, 0x98, 0x76, 0x21, 0x27, 0xda, 0xf2, 0x9e, 0x6a, 0x0b, 0x91,
0xf5, 0x23, 0xd8, 0x39, 0x8f, 0xd0, 0xf1, 0xa8, 0x2f, 0xef, 0x98, 0xca, 0xc1, 0x43, 0xa8, 0x89,
0x24, 0xa7, 0x3d, 0xdb, 0x94, 0x86, 0x52, 0xac, 0xf8, 0xd6, 0xb7, 0x60, 0xaa, 0x73, 0x1d, 0xbd,
0xf1, 0x62, 0x8e, 0x81, 0x83, 0x07, 0x33, 0x74, 0xae, 0xfe, 0x87, 0x91, 0x5f, 0xc3, 0xbd, 0x4d,
0x1e, 0xd2, 0xf3, 0xb5, 0x1c, 0x41, 0x8d, 0x2f, 0x05, 0xd0, 0x4a, 0x1f, 0x86, 0x0d, 0x92, 0xf5,
0xb9, 0xe0, 0x88, 0xef, 0x88, 0xc2, 0x2e, 0xd6, 0x90, 0xa8, 0xa9, 0x34, 0x1f, 0x95, 0xdb, 0xf3,
0xf1, 0xd7, 0x12, 0x34, 0xcf, 0x91, 0x27, 0x91, 0x8c, 0xe5, 0x3e, 0x34, 0x27, 0x2c, 0xbc, 0x42,
0xb6, 0x0c, 0xc5, 0x50, 0x8c, 0x63, 0x97, 0xbc, 0x80, 0xfa, 0x41, 0x18, 0x5c, 0x7a, 0x53, 0x79,
0xe3, 0x6e, 0x8d, 0xee, 0x29, 0x74, 0xd1, 0xb6, 0x43, 0x25, 0x53, 0xa3, 0x51, 0x2b, 0x92, 0x3e,
0xb4, 0xf4, 0x0b, 0xe5, 0xf5, 0xeb, 0xe3, 0xc3, 0x74, 0x14, 0xe7, 0x58, 0xbd, 0x8f, 0xa1, 0x95,
0x33, 0xfc, 0xaf, 0xa6, 0xc5, 0xf7, 0x01, 0xa4, 0x77, 0x95, 0xa3, 0x6d, 0x15, 0xaa, 0xb6, 0x14,
0xa1, 0x3d, 0x84, 0xa6, 0xb8, 0xf5, 0x29, 0x31, 0x81, 0x6a, 0xee, 0x81, 0x22, 0xd7, 0xd6, 0x23,
0xd8, 0x39, 0x0e, 0xae, 0xa9, 0xef, 0xb9, 0x94, 0xe3, 0x97, 0xb8, 0x90, 0x29, 0x58, 0x3b, 0x81,
0x75, 0x0e, 0x6d, 0xfd, 0x04, 0x78, 0xab, 0x33, 0xb6, 0xf5, 0x19, 0xff, 0x73, 0x13, 0xbd, 0x0f,
0x5d, 0xbd, 0xe9, 0x89, 0xa7, 0x5b, 0x48, 0x5c, 0x03, 0x18, 0x5e, 0x7a, 0x6f, 0xf4, 0xd6, 0x9a,
0xb2, 0x5e, 0xc2, 0x76, 0x4e, 0x35, 0x0b, 0xe7, 0x0a, 0x17, 0x71, 0xfa, 0x34, 0x12, 0xeb, 0x34,
0x03, 0xe5, 0x65, 0x06, 0x2c, 0xd8, 0xd2, 0x96, 0xaf, 0x90, 0xdf, 0x12, 0xdd, 0x97, 0xd9, 0x41,
0x5e, 0xa1, 0xde, 0xfc, 0x31, 0xd4, 0x50, 0x44, 0x9a, 0x1f, 0x61, 0xf9, 0x0c, 0xd8, 0x4a, 0xbc,
0xc1, 0xe1, 0xcb, 0xcc, 0xe1, 0x59, 0xa2, 0x1c, 0xbe, 0xe5, 0x5e, 0xd6, 0x7b, 0xd9, 0x31, 0xce,
0x12, 0x7e, 0xdb, 0x17, 0x7d, 0x04, 0x3b, 0x5a, 0xe9, 0x10, 0x7d, 0xe4, 0x78, 0x4b, 0x48, 0x8f,
0x81, 0x14, 0xd4, 0x6e, 0xdb, 0xee, 0x01, 0x18, 0x17, 0x17, 0x27, 0x99, 0xb4, 0x88, 0x8d, 0xd6,
0x27, 0xb0, 0x73, 0x9e, 0xb8, 0xe1, 0x19, 0xf3, 0xae, 0x3d, 0x1f, 0xa7, 0xca, 0x59, 0xfa, 0x32,
0x2b, 0xe5, 0x5e, 0x66, 0x1b, 0xa7, 0x91, 0x35, 0x00, 0x52, 0x30, 0xcf, 0xbe, 0x5b, 0x9c, 0xb8,
0xa1, 0x6e, 0x61, 0xb9, 0xb6, 0x06, 0xd0, 0xbe, 0xa0, 0x62, 0xde, 0xbb, 0x4a, 0xc7, 0x84, 0x06,
0x57, 0xb4, 0x56, 0x4b, 0x49, 0x6b, 0x04, 0xbb, 0x07, 0xd4, 0x99, 0x79, 0xc1, 0xf4, 0xd0, 0x8b,
0xc5, 0x85, 0x47, 0x5b, 0xf4, 0xc0, 0x70, 0x35, 0x43, 0x9b, 0x64, 0xb4, 0xf5, 0x0c, 0xde, 0xc9,
0xbd, 0x3f, 0xcf, 0x39, 0x4d, 0xf3, 0xb1, 0x0b, 0xb5, 0x58, 0x50, 0xd2, 0xa2, 0x66, 0x2b, 0xc2,
0xfa, 0x0a, 0x76, 0xf3, 0x03, 0x58, 0x5c, 0x3f, 0xd2, 0xc0, 0xe5, 0xc5, 0xa0, 0x94, 0xbb, 0x18,
0xe8, 0x9c, 0x95, 0x97, 0xf3, 0x64, 0x1b, 0x2a, 0xbf, 0xf8, 0xe6, 0x42, 0x17, 0xbb, 0x58, 0x5a,
0xbf, 0x13, 0xee, 0x8b, 0xfb, 0x29, 0xf7, 0x85, 0xdb, 0x41, 0xe9, 0x6d, 0x6e, 0x07, 0x1b, 0xea,
0xed, 0x19, 0xec, 0x9c, 0xfa, 0xa1, 0x73, 0x75, 0x14, 0xe4, 0xb2, 0x61, 0x42, 0x03, 0x83, 0x7c,
0x32, 0x52, 0xd2, 0x7a, 0x02, 0xdd, 0x13, 0xf1, 0xfa, 0x3f, 0x15, 0xcf, 0xbd, 0x2c, 0x0b, 0xf2,
0x87, 0x80, 0x56, 0x55, 0x84, 0xf5, 0x0c, 0xb6, 0xf4, 0x88, 0x0e, 0x2e, 0xc3, 0x14, 0x19, 0x97,
0xc3, 0xbc, 0x54, 0xbc, 0x70, 0x5b, 0x27, 0xd0, 0x5d, 0xaa, 0xab, 0x7d, 0x9f, 0x40, 0x5d, 0x89,
0x75, 0x6c, 0xdd, 0xec, 0x5a, 0xad, 0x34, 0x6d, 0x2d, 0xde, 0x18, 0x14, 0x2c, 0xdf, 0x61, 0x02,
0xfb, 0x19, 0xce, 0x43, 0x8e, 0x63, 0xea, 0xba, 0x69, 0xf9, 0x82, 0x62, 0xed, 0xbb, 0x2e, 0x1b,
0xfd, 0xab, 0x0c, 0x8d, 0xcf, 0x14, 0xa2, 0x92, 0x4f, 0xa1, 0x53, 0x98, 0x9f, 0xe4, 0x1d, 0xf9,
0x10, 0x5b, 0x9d, 0xd6, 0xbd, 0xbb, 0x6b, 0x6c, 0x75, 0xea, 0xe7, 0xd0, 0xce, 0x4f, 0x47, 0x22,
0x27, 0xa1, 0xfc, 0x2b, 0xd4, 0x93, 0x3b, 0xad, 0x8f, 0xce, 0x73, 0xd8, 0xdd, 0x34, 0xb7, 0xc8,
0x83, 0xa5, 0x87, 0xf5, 0x99, 0xd9, 0x7b, 0xf7, 0x36, 0x69, 0x3a, 0xef, 0x1a, 0x07, 0x3e, 0xd2,
0x20, 0x89, 0xf2, 0x27, 0x58, 0x2e, 0xc9, 0x0b, 0xe8, 0x14, 0x90, 0x5b, 0xc5, 0xb9, 0x06, 0xe6,
0x79, 0x93, 0xc7, 0x50, 0x93, 0xd3, 0x82, 0x74, 0x0a, 0x63, 0xab, 0xb7, 0x95, 0x91, 0xca, 0x77,
0x1f, 0xaa, 0xf2, 0x5f, 0x41, 0xce, 0xb1, 0xb4, 0xc8, 0x46, 0xc9, 0xe8, 0x9f, 0x25, 0x68, 0xa4,
0xff, 0x8f, 0x5e, 0x40, 0x55, 0x80, 0x32, 0xb9, 0x93, 0xc3, 0xb5, 0x14, 0xd0, 0x7b, 0xbb, 0x2b,
0x4c, 0xe5, 0x60, 0x08, 0x95, 0x57, 0xc8, 0x09, 0xc9, 0x09, 0x35, 0x3a, 0xf7, 0xee, 0x14, 0x79,
0x99, 0xfe, 0x59, 0x52, 0xd4, 0xd7, 0xe0, 0x5a, 0xd0, 0xcf, 0x60, 0xf3, 0x27, 0x50, 0x57, 0xb0,
0xa7, 0x92, 0xb2, 0x06, 0x98, 0xea, 0xe3, 0xaf, 0x03, 0xe4, 0xe8, 0x4f, 0x55, 0x80, 0xf3, 0x45,
0xcc, 0x71, 0xfe, 0x4b, 0x0f, 0x6f, 0xc8, 0x53, 0xe8, 0x1e, 0xe2, 0x25, 0x4d, 0x7c, 0x2e, 0x9f,
0x2f, 0xa2, 0xbd, 0x73, 0x39, 0x91, 0x37, 0xb0, 0x0c, 0x3d, 0x1f, 0x43, 0xeb, 0x94, 0xbe, 0xf9,
0x6e, 0xbd, 0x4f, 0xa1, 0x53, 0x00, 0x45, 0x7d, 0xc4, 0x55, 0x98, 0xd5, 0x47, 0x5c, 0x87, 0xcf,
0xc7, 0xd0, 0xd0, 0x50, 0x99, 0xf7, 0x21, 0x87, 0x4a, 0x01, 0x42, 0x7f, 0x0c, 0xdd, 0x15, 0xa0,
0xcc, 0xeb, 0xcb, 0x7f, 0x5c, 0x1b, 0x81, 0xf4, 0xa5, 0x78, 0x7e, 0x14, 0xc1, 0x32, 0x6f, 0x78,
0x4f, 0x01, 0xd4, 0x26, 0x34, 0x7d, 0x55, 0x7c, 0xb8, 0xc8, 0x67, 0x9b, 0xb9, 0x8a, 0x67, 0x29,
0x9a, 0xa6, 0x1b, 0x6d, 0xc2, 0xc5, 0xe7, 0xd0, 0xce, 0x43, 0xda, 0x5a, 0x0b, 0xae, 0xe3, 0xdd,
0x07, 0x00, 0x4b, 0x54, 0xcb, 0xeb, 0xcb, 0xf2, 0x58, 0x05, 0xbc, 0x8f, 0x00, 0x96, 0x58, 0xa5,
0xaa, 0xaa, 0x08, 0x75, 0xca, 0x6c, 0x05, 0xcf, 0x3e, 0x1b, 0xfe, 0xe6, 0x83, 0xa9, 0xc7, 0x67,
0xc9, 0x64, 0xe8, 0x84, 0xf3, 0xbd, 0x19, 0x8d, 0x67, 0x9e, 0x13, 0xb2, 0x68, 0xef, 0x5a, 0x14,
0xc8, 0xde, 0xda, 0x8f, 0xe9, 0x49, 0x5d, 0xbe, 0xa8, 0x3e, 0xfc, 0x77, 0x00, 0x00, 0x00, 0xff,
0xff, 0x6e, 0x84, 0x57, 0xb3, 0xb4, 0x16, 0x00, 0x00,
0x11, 0x1f, 0x92, 0x22, 0x09, 0x2e, 0x49, 0x51, 0x3a, 0x2b, 0x2e, 0x4c, 0x3b, 0x35, 0x8b, 0xd4,
0xb6, 0xe2, 0x89, 0x29, 0x9b, 0x69, 0x5a, 0xa7, 0x9d, 0xa4, 0xa3, 0xc8, 0x8a, 0xa3, 0x46, 0x4a,
0x34, 0x90, 0xdc, 0xf4, 0xdf, 0x0c, 0x73, 0x02, 0x56, 0x24, 0x46, 0x20, 0x80, 0x1e, 0x0e, 0xb2,
0xf9, 0xd4, 0x6f, 0xd1, 0xb7, 0x7e, 0x86, 0xbe, 0xf6, 0xad, 0x6f, 0x9d, 0xce, 0xf4, 0xb9, 0x5f,
0xa3, 0x9f, 0xa1, 0x73, 0x7f, 0x00, 0x1e, 0x48, 0xaa, 0x71, 0x67, 0xda, 0xb7, 0xdb, 0x3f, 0xb7,
0x77, 0xbb, 0xd8, 0xfd, 0xed, 0x1e, 0xe0, 0x7e, 0x18, 0x4f, 0x02, 0x8f, 0x86, 0x7b, 0x49, 0x98,
0x4d, 0x82, 0x68, 0x2f, 0xb9, 0xd8, 0xbb, 0xa0, 0xde, 0x15, 0x46, 0xfe, 0x30, 0x61, 0x31, 0x8f,
0x49, 0x35, 0xb9, 0xe8, 0xdf, 0x9f, 0xc4, 0xf1, 0x24, 0xc4, 0x3d, 0xc9, 0xb9, 0xc8, 0x2e, 0xf7,
0x78, 0x30, 0xc3, 0x94, 0xd3, 0x59, 0xa2, 0x94, 0xfa, 0xb7, 0x73, 0x2b, 0x81, 0x8f, 0x11, 0x0f,
0xf8, 0x5c, 0xf3, 0x77, 0xca, 0xd6, 0x15, 0xd7, 0x69, 0x42, 0xfd, 0x70, 0x96, 0xf0, 0xb9, 0x33,
0x80, 0xc6, 0x17, 0x48, 0x7d, 0x64, 0xe4, 0x36, 0x34, 0xa6, 0x72, 0x65, 0x57, 0x06, 0xb5, 0xdd,
0x96, 0xab, 0x29, 0xe7, 0xb7, 0x00, 0xa7, 0x62, 0xcf, 0x21, 0x63, 0x31, 0x23, 0x77, 0xc0, 0x42,
0xc6, 0xc6, 0x7c, 0x9e, 0xa0, 0x5d, 0x19, 0x54, 0x76, 0xbb, 0x6e, 0x13, 0x19, 0x3b, 0x9f, 0x27,
0x48, 0xbe, 0x07, 0x62, 0x39, 0x9e, 0xa5, 0x13, 0xbb, 0x3a, 0xa8, 0x08, 0x0b, 0xc8, 0xd8, 0x49,
0x3a, 0xc9, 0xf7, 0x78, 0xb1, 0x8f, 0x76, 0x6d, 0x50, 0xd9, 0xad, 0xc9, 0x3d, 0x07, 0xb1, 0x8f,
0xce, 0x1f, 0x2b, 0x50, 0x3f, 0xa5, 0x7c, 0x9a, 0x12, 0x02, 0x1b, 0x2c, 0x8e, 0xb9, 0x3e, 0x5c,
0xae, 0xc9, 0x2e, 0xf4, 0xb2, 0x88, 0x66, 0x7c, 0x2a, 0x3c, 0xf2, 0x28, 0x47, 0xdf, 0xae, 0x4a,
0xf1, 0x32, 0x9b, 0xbc, 0x07, 0xdd, 0x30, 0xf6, 0x68, 0x38, 0x4e, 0x79, 0xcc, 0xe8, 0x44, 0x9c,
0x23, 0xf4, 0x3a, 0x92, 0x79, 0xa6, 0x78, 0xe4, 0x31, 0x6c, 0xa7, 0x48, 0xc3, 0xf1, 0x6b, 0x46,
0x93, 0x42, 0x71, 0x43, 0x19, 0x14, 0x82, 0x6f, 0x18, 0x4d, 0xb4, 0xae, 0xf3, 0xd7, 0x06, 0x34,
0x5d, 0xfc, 0x7d, 0x86, 0x29, 0x27, 0x9b, 0x50, 0x0d, 0x7c, 0xe9, 0x6d, 0xcb, 0xad, 0x06, 0x3e,
0x19, 0x02, 0x71, 0x31, 0x09, 0xc5, 0xd1, 0x41, 0x1c, 0x1d, 0x84, 0x59, 0xca, 0x91, 0x69, 0x9f,
0xd7, 0x48, 0xc8, 0x3d, 0x68, 0xc5, 0x09, 0x32, 0xc9, 0x93, 0x01, 0x68, 0xb9, 0x0b, 0x86, 0x70,
0x3c, 0xa1, 0x7c, 0x6a, 0x6f, 0x48, 0x81, 0x5c, 0x0b, 0x9e, 0x4f, 0x39, 0xb5, 0xeb, 0x8a, 0x27,
0xd6, 0xc4, 0x81, 0x46, 0x8a, 0x1e, 0x43, 0x6e, 0x37, 0x06, 0x95, 0xdd, 0xf6, 0x08, 0x86, 0xc9,
0xc5, 0xf0, 0x4c, 0x72, 0x5c, 0x2d, 0x21, 0xf7, 0x60, 0x43, 0xc4, 0xc5, 0x6e, 0x4a, 0x0d, 0x4b,
0x68, 0xec, 0x67, 0x7c, 0xea, 0x4a, 0x2e, 0x19, 0x41, 0x53, 0x7d, 0xd3, 0xd4, 0xb6, 0x06, 0xb5,
0xdd, 0xf6, 0xc8, 0x16, 0x0a, 0xda, 0xcb, 0xa1, 0x4a, 0x83, 0xf4, 0x30, 0xe2, 0x6c, 0xee, 0xe6,
0x8a, 0xe4, 0x07, 0xd0, 0xf1, 0xc2, 0x00, 0x23, 0x3e, 0xe6, 0xf1, 0x15, 0x46, 0x76, 0x4b, 0xde,
0xa8, 0xad, 0x78, 0xe7, 0x82, 0x45, 0x46, 0xf0, 0x8e, 0xa9, 0x32, 0xa6, 0x9e, 0x87, 0x69, 0x1a,
0x33, 0x1b, 0xa4, 0xee, 0x2d, 0x43, 0x77, 0x5f, 0x8b, 0x84, 0x59, 0x3f, 0x48, 0x93, 0x90, 0xce,
0xc7, 0x11, 0x9d, 0xa1, 0xdd, 0x56, 0x66, 0x35, 0xef, 0x2b, 0x3a, 0x43, 0x72, 0x1f, 0xda, 0xb3,
0x38, 0x8b, 0xf8, 0x38, 0x89, 0x83, 0x88, 0xdb, 0x1d, 0xa9, 0x01, 0x92, 0x75, 0x2a, 0x38, 0xe4,
0x5d, 0x50, 0x94, 0x4a, 0xc6, 0xae, 0x8a, 0xab, 0xe4, 0xc8, 0x74, 0x7c, 0x00, 0x9b, 0x4a, 0x5c,
0xdc, 0x67, 0x53, 0xaa, 0x74, 0x25, 0xb7, 0xb8, 0xc9, 0x53, 0x68, 0xc9, 0x7c, 0x08, 0xa2, 0xcb,
0xd8, 0xee, 0xc9, 0xb8, 0xdd, 0x32, 0xc2, 0x22, 0x72, 0xe2, 0x28, 0xba, 0x8c, 0x5d, 0xeb, 0xb5,
0x5e, 0x91, 0x4f, 0xe0, 0x6e, 0xc9, 0x5f, 0x86, 0x33, 0x1a, 0x44, 0x41, 0x34, 0x19, 0x67, 0x29,
0xa6, 0xf6, 0x96, 0xcc, 0x70, 0xdb, 0xf0, 0xda, 0xcd, 0x15, 0x5e, 0xa5, 0x98, 0x92, 0xbb, 0xd0,
0x52, 0x05, 0x3a, 0x0e, 0x7c, 0x7b, 0x5b, 0x5e, 0xc9, 0x52, 0x8c, 0x23, 0x9f, 0x3c, 0x82, 0x5e,
0x12, 0x87, 0x81, 0x37, 0x1f, 0xc7, 0xd7, 0xc8, 0x58, 0xe0, 0xa3, 0x4d, 0x06, 0x95, 0x5d, 0xcb,
0xdd, 0x54, 0xec, 0xaf, 0x35, 0x77, 0x5d, 0x69, 0xdc, 0x92, 0x8a, 0x2b, 0xa5, 0x31, 0x04, 0xf0,
0xe2, 0x28, 0x42, 0x4f, 0xa6, 0xdf, 0x8e, 0xf4, 0x70, 0x53, 0x78, 0x78, 0x50, 0x70, 0x5d, 0x43,
0xa3, 0xff, 0x39, 0x74, 0xcc, 0x54, 0x20, 0x5b, 0x50, 0xbb, 0xc2, 0xb9, 0x4e, 0x7f, 0xb1, 0x24,
0x03, 0xa8, 0x5f, 0xd3, 0x30, 0x43, 0x99, 0xf2, 0x3a, 0x11, 0xd5, 0x16, 0x57, 0x09, 0x7e, 0x5a,
0x7d, 0x5e, 0x71, 0xfe, 0xb4, 0x01, 0x1b, 0x22, 0xf9, 0xc8, 0x47, 0xd0, 0x0d, 0x91, 0xa6, 0x38,
0x8e, 0x13, 0x71, 0x40, 0x2a, 0x4d, 0xb5, 0x47, 0x5b, 0x62, 0xdb, 0xb1, 0x10, 0x7c, 0xad, 0xf8,
0x6e, 0x27, 0x34, 0x28, 0x51, 0xd2, 0x41, 0xc4, 0x91, 0x45, 0x34, 0x1c, 0xcb, 0x62, 0x50, 0x05,
0xd6, 0xc9, 0x99, 0x2f, 0x44, 0x51, 0x2c, 0xe7, 0x51, 0x6d, 0x35, 0x8f, 0xfa, 0x60, 0xc9, 0xd8,
0x05, 0x98, 0xea, 0x62, 0x2f, 0x68, 0x32, 0x02, 0x6b, 0x86, 0x9c, 0xea, 0x5a, 0x13, 0x25, 0x71,
0x3b, 0xaf, 0x99, 0xe1, 0x89, 0x16, 0xa8, 0x82, 0x28, 0xf4, 0x56, 0x2a, 0xa2, 0xb1, 0x5a, 0x11,
0x7d, 0xb0, 0x8a, 0xa4, 0x6b, 0xaa, 0x2f, 0x9c, 0xd3, 0x02, 0x66, 0x13, 0x64, 0x41, 0xec, 0xdb,
0x96, 0x4c, 0x14, 0x4d, 0x09, 0x90, 0x8c, 0xb2, 0x99, 0x4a, 0xa1, 0x96, 0x02, 0xc9, 0x28, 0x9b,
0xad, 0x66, 0x0c, 0x2c, 0x65, 0xcc, 0x0f, 0xa1, 0x4e, 0xc3, 0x80, 0xa6, 0xb2, 0x84, 0xc4, 0x97,
0xd5, 0x78, 0x3f, 0xdc, 0x17, 0x5c, 0x57, 0x09, 0xc9, 0x87, 0xd0, 0x9d, 0xb0, 0x38, 0x4b, 0xc6,
0x92, 0xc4, 0xd4, 0xee, 0x48, 0x6f, 0x97, 0xb5, 0x3b, 0x52, 0x69, 0x5f, 0xe9, 0x88, 0x0a, 0xbc,
0x88, 0xb3, 0xc8, 0x1f, 0x7b, 0x81, 0xcf, 0x52, 0xbb, 0x2b, 0x83, 0x07, 0x92, 0x75, 0x20, 0x38,
0xfd, 0x9f, 0x41, 0xb7, 0x14, 0xa5, 0x35, 0xb9, 0xb2, 0x63, 0xe6, 0x4a, 0xcb, 0xcc, 0x8f, 0x3f,
0x57, 0xa0, 0x63, 0x7e, 0x7e, 0xb1, 0xf9, 0xfc, 0xfc, 0x58, 0x6e, 0xae, 0xb9, 0x62, 0x29, 0x80,
0x93, 0x61, 0x84, 0xaf, 0xe9, 0x45, 0xa8, 0x0c, 0x58, 0xee, 0x82, 0x21, 0xa4, 0x41, 0xe4, 0x31,
0x9c, 0x61, 0xc4, 0x75, 0x5f, 0x59, 0x30, 0xc8, 0xc7, 0x00, 0x41, 0x9a, 0x66, 0x38, 0x16, 0x8d,
0x52, 0x82, 0x6b, 0x7b, 0xd4, 0x1f, 0xaa, 0x2e, 0x3a, 0xcc, 0xbb, 0xe8, 0xf0, 0x3c, 0xef, 0xa2,
0x6e, 0x4b, 0x6a, 0x0b, 0x5a, 0x7c, 0xa2, 0x13, 0xfa, 0x46, 0xdc, 0xa5, 0xae, 0x3e, 0x91, 0xa2,
0x9c, 0x3f, 0x40, 0x43, 0xe1, 0xed, 0xff, 0x35, 0xa5, 0xef, 0x80, 0xa5, 0x6c, 0x07, 0xbe, 0x4e,
0xe7, 0xa6, 0xa4, 0x8f, 0x7c, 0xe7, 0x1f, 0x15, 0xb0, 0x5c, 0x4c, 0x93, 0x38, 0x4a, 0xd1, 0xe8,
0x07, 0x95, 0xef, 0xec, 0x07, 0xd5, 0xb5, 0xfd, 0x20, 0xef, 0x32, 0x35, 0xa3, 0xcb, 0xf4, 0xc1,
0x62, 0xe8, 0x07, 0x0c, 0x3d, 0xae, 0x3b, 0x52, 0x41, 0x0b, 0xd9, 0x6b, 0xca, 0x04, 0x90, 0xa5,
0xb2, 0x5a, 0x5a, 0x6e, 0x41, 0x93, 0x67, 0x26, 0x8c, 0xaa, 0x06, 0xb5, 0xa3, 0x60, 0x54, 0x5d,
0x77, 0x15, 0x47, 0x9d, 0xbf, 0x57, 0x61, 0x6b, 0x59, 0xbc, 0x26, 0x09, 0x76, 0xa0, 0xae, 0x0a,
0x4d, 0x67, 0x10, 0x5f, 0x29, 0xb1, 0xda, 0x52, 0x89, 0xfd, 0x1c, 0xba, 0x1e, 0x43, 0xd9, 0x5d,
0xdf, 0xf6, 0xeb, 0x77, 0xf2, 0x0d, 0x32, 0x01, 0xde, 0x87, 0x2d, 0x71, 0xcb, 0x04, 0xfd, 0x45,
0xf3, 0x50, 0xad, 0xb8, 0xa7, 0xf9, 0x45, 0xfb, 0x78, 0x0c, 0xdb, 0xb9, 0xea, 0xa2, 0x46, 0x1b,
0x25, 0xdd, 0xc3, 0xbc, 0x54, 0x6f, 0x43, 0xe3, 0x32, 0x66, 0x33, 0xca, 0x35, 0x28, 0x68, 0x4a,
0xa4, 0x45, 0x71, 0x5f, 0x39, 0x0a, 0x58, 0x2a, 0x2d, 0x72, 0xa6, 0x18, 0x90, 0x04, 0x08, 0x14,
0xc3, 0x8b, 0x04, 0x08, 0xcb, 0xb5, 0xf2, 0xa1, 0xc5, 0xf9, 0x15, 0xf4, 0x96, 0xfa, 0xd5, 0x9a,
0x40, 0x2e, 0x8e, 0xaf, 0x96, 0x8e, 0x2f, 0x59, 0xae, 0x2d, 0x59, 0xfe, 0x35, 0x6c, 0x7f, 0x41,
0x23, 0x3f, 0x44, 0x6d, 0x7f, 0x9f, 0x4d, 0x52, 0xd1, 0x79, 0xf5, 0xf8, 0x34, 0xd6, 0x83, 0x51,
0xd7, 0x6d, 0x69, 0xce, 0x91, 0x4f, 0x1e, 0x40, 0x93, 0x29, 0x6d, 0x9d, 0x78, 0x6d, 0xa3, 0xa1,
0xba, 0xb9, 0xcc, 0xf9, 0x16, 0x48, 0xc9, 0xb4, 0x98, 0x9c, 0xe6, 0x64, 0x57, 0x24, 0xa0, 0x4a,
0x0a, 0x9d, 0xd8, 0x1d, 0x33, 0x8f, 0xdc, 0x42, 0x4a, 0x06, 0x50, 0x43, 0xc6, 0xf4, 0x11, 0xb2,
0xa3, 0x2d, 0xe6, 0x54, 0x57, 0x88, 0x9c, 0x1f, 0xc1, 0xf6, 0x59, 0x82, 0x5e, 0x40, 0x43, 0x39,
0x63, 0xaa, 0x03, 0xee, 0x43, 0x5d, 0x04, 0x39, 0xaf, 0xd9, 0x96, 0xdc, 0x28, 0xc5, 0x8a, 0xef,
0x7c, 0x0b, 0xb6, 0xba, 0xd7, 0xe1, 0x9b, 0x20, 0xe5, 0x18, 0x79, 0x78, 0x30, 0x45, 0xef, 0xea,
0x7f, 0xe8, 0xf9, 0x35, 0xdc, 0x59, 0x77, 0x42, 0x7e, 0xbf, 0xb6, 0x27, 0xa8, 0xf1, 0xa5, 0x00,
0x5a, 0x79, 0x86, 0xe5, 0x82, 0x64, 0x7d, 0x2e, 0x38, 0xe2, 0x3b, 0xa2, 0xd8, 0x97, 0x6a, 0x48,
0xd4, 0x54, 0x1e, 0x8f, 0xda, 0xcd, 0xf1, 0xf8, 0x4b, 0x05, 0x5a, 0x67, 0xc8, 0xb3, 0x44, 0xfa,
0x72, 0x17, 0x5a, 0x17, 0x2c, 0xbe, 0x42, 0xb6, 0x70, 0xc5, 0x52, 0x8c, 0x23, 0x9f, 0x3c, 0x83,
0xc6, 0x41, 0x1c, 0x5d, 0x06, 0x13, 0x39, 0x71, 0xb7, 0x47, 0x77, 0x14, 0xba, 0xe8, 0xbd, 0x43,
0x25, 0x53, 0xad, 0x51, 0x2b, 0x92, 0x01, 0xb4, 0xf5, 0xbb, 0xe5, 0xd5, 0xab, 0xa3, 0x17, 0x79,
0x2b, 0x36, 0x58, 0xfd, 0x8f, 0xa1, 0x6d, 0x6c, 0xfc, 0xaf, 0xba, 0xc5, 0xf7, 0x01, 0xe4, 0xe9,
0x2a, 0x46, 0x5b, 0xca, 0x55, 0xbd, 0x53, 0xb8, 0x76, 0x1f, 0x5a, 0x62, 0xea, 0x53, 0x62, 0x02,
0x1b, 0xc6, 0x03, 0x45, 0xae, 0x9d, 0x07, 0xb0, 0x7d, 0x14, 0x5d, 0xd3, 0x30, 0xf0, 0x29, 0xc7,
0x2f, 0x71, 0x2e, 0x43, 0xb0, 0x72, 0x03, 0xe7, 0x0c, 0x3a, 0xfa, 0x09, 0xf0, 0x56, 0x77, 0xec,
0xe8, 0x3b, 0xfe, 0xe7, 0x22, 0x7a, 0x1f, 0x7a, 0xda, 0xe8, 0x71, 0xa0, 0x4b, 0x48, 0x8c, 0x01,
0x0c, 0x2f, 0x83, 0x37, 0xda, 0xb4, 0xa6, 0x9c, 0xe7, 0xb0, 0x65, 0xa8, 0x16, 0xee, 0x5c, 0xe1,
0x3c, 0xcd, 0x9f, 0x46, 0x62, 0x9d, 0x47, 0xa0, 0xba, 0x88, 0x80, 0x03, 0x9b, 0x7a, 0xe7, 0x4b,
0xe4, 0x37, 0x78, 0xf7, 0x65, 0x71, 0x91, 0x97, 0xa8, 0x8d, 0x3f, 0x84, 0x3a, 0x0a, 0x4f, 0xcd,
0x16, 0x66, 0x46, 0xc0, 0x55, 0xe2, 0x35, 0x07, 0x3e, 0x2f, 0x0e, 0x3c, 0xcd, 0xd4, 0x81, 0x6f,
0x69, 0xcb, 0x79, 0xaf, 0xb8, 0xc6, 0x69, 0xc6, 0x6f, 0xfa, 0xa2, 0x0f, 0x60, 0x5b, 0x2b, 0xbd,
0xc0, 0x10, 0x39, 0xde, 0xe0, 0xd2, 0x43, 0x20, 0x25, 0xb5, 0x9b, 0xcc, 0xdd, 0x03, 0xeb, 0xfc,
0xfc, 0xb8, 0x90, 0x96, 0xb1, 0xd1, 0xf9, 0x04, 0xb6, 0xcf, 0x32, 0x3f, 0x3e, 0x65, 0xc1, 0x75,
0x10, 0xe2, 0x44, 0x1d, 0x96, 0xbf, 0xcc, 0x2a, 0xc6, 0xcb, 0x6c, 0x6d, 0x37, 0x72, 0x76, 0x81,
0x94, 0xb6, 0x17, 0xdf, 0x2d, 0xcd, 0xfc, 0x58, 0x97, 0xb0, 0x5c, 0x3b, 0xbb, 0xd0, 0x39, 0xa7,
0xa2, 0xdf, 0xfb, 0x4a, 0xc7, 0x86, 0x26, 0x57, 0xb4, 0x56, 0xcb, 0x49, 0x67, 0x04, 0x3b, 0x07,
0xd4, 0x9b, 0x06, 0xd1, 0xe4, 0x45, 0x90, 0x8a, 0x81, 0x47, 0xef, 0xe8, 0x83, 0xe5, 0x6b, 0x86,
0xde, 0x52, 0xd0, 0xce, 0x13, 0x78, 0xc7, 0x78, 0x7f, 0x9e, 0x71, 0x9a, 0xc7, 0x63, 0x07, 0xea,
0xa9, 0xa0, 0xe4, 0x8e, 0xba, 0xab, 0x08, 0xe7, 0x2b, 0xd8, 0x31, 0x1b, 0xb0, 0x18, 0x3f, 0x72,
0xc7, 0xe5, 0x60, 0x50, 0x31, 0x06, 0x03, 0x1d, 0xb3, 0xea, 0xa2, 0x9f, 0x6c, 0x41, 0xed, 0x17,
0xdf, 0x9c, 0xeb, 0x64, 0x17, 0x4b, 0xe7, 0x77, 0xe2, 0xf8, 0xb2, 0x3d, 0x75, 0x7c, 0x69, 0x3a,
0xa8, 0xbc, 0xcd, 0x74, 0xb0, 0x26, 0xdf, 0x9e, 0xc0, 0xf6, 0x49, 0x18, 0x7b, 0x57, 0x87, 0x91,
0x11, 0x0d, 0x1b, 0x9a, 0x18, 0x99, 0xc1, 0xc8, 0x49, 0xe7, 0x11, 0xf4, 0x8e, 0xc5, 0xeb, 0xff,
0x44, 0x3c, 0xf7, 0x8a, 0x28, 0xc8, 0x1f, 0x02, 0x5a, 0x55, 0x11, 0xce, 0x13, 0xd8, 0xd4, 0x2d,
0x3a, 0xba, 0x8c, 0x73, 0x64, 0x5c, 0x34, 0xf3, 0x4a, 0x79, 0xe0, 0x76, 0x8e, 0xa1, 0xb7, 0x50,
0x57, 0x76, 0x1f, 0x41, 0x43, 0x89, 0xb5, 0x6f, 0xbd, 0x62, 0xac, 0x56, 0x9a, 0xae, 0x16, 0xaf,
0x71, 0x6a, 0x06, 0x9b, 0xa7, 0xf2, 0xc7, 0xcc, 0x61, 0x74, 0xad, 0x8c, 0x1d, 0x01, 0x51, 0xbf,
0x6a, 0xc6, 0x18, 0x5d, 0x07, 0x2c, 0x8e, 0xe4, 0x7c, 0x5b, 0xd1, 0x23, 0x4c, 0x6e, 0xb8, 0xd8,
0x94, 0x6b, 0xb8, 0xdb, 0xc9, 0x32, 0x6b, 0x6d, 0x0c, 0x61, 0xf1, 0xec, 0x13, 0xad, 0x86, 0xe1,
0x2c, 0xe6, 0x38, 0xa6, 0xbe, 0x9f, 0x57, 0x0b, 0x28, 0xd6, 0xbe, 0xef, 0xb3, 0xd1, 0xbf, 0xaa,
0xd0, 0xfc, 0x4c, 0x01, 0x38, 0xf9, 0x14, 0xba, 0xa5, 0x76, 0x4d, 0xde, 0x91, 0xef, 0xbe, 0xe5,
0xe1, 0xa0, 0x7f, 0x7b, 0x85, 0xad, 0xfc, 0x7a, 0x0a, 0x1d, 0xb3, 0x19, 0x13, 0xd9, 0x78, 0xe5,
0x4f, 0xa8, 0xbe, 0xb4, 0xb4, 0xda, 0xa9, 0xcf, 0x60, 0x67, 0x5d, 0x9b, 0x24, 0xf7, 0x16, 0x27,
0xac, 0xb6, 0xe8, 0xfe, 0xbb, 0x37, 0x49, 0xf3, 0xf6, 0xda, 0x3c, 0x08, 0x91, 0x46, 0x59, 0x62,
0xde, 0x60, 0xb1, 0x24, 0xcf, 0xa0, 0x5b, 0x6a, 0x14, 0xca, 0xcf, 0x95, 0xde, 0x61, 0x6e, 0x79,
0x08, 0x75, 0xd9, 0x9c, 0x48, 0xb7, 0xd4, 0x25, 0xfb, 0x9b, 0x05, 0xa9, 0xce, 0x1e, 0xc0, 0x86,
0xfc, 0x35, 0x61, 0x1c, 0x2c, 0x77, 0x14, 0x9d, 0x6b, 0xf4, 0xcf, 0x0a, 0x34, 0xf3, 0xdf, 0x55,
0xcf, 0x60, 0x43, 0xf4, 0x00, 0x72, 0xcb, 0x80, 0xd1, 0xbc, 0x7f, 0xf4, 0x77, 0x96, 0x98, 0xea,
0x80, 0x21, 0xd4, 0x5e, 0x22, 0x27, 0xc4, 0x10, 0xea, 0x66, 0xd0, 0xbf, 0x55, 0xe6, 0x15, 0xfa,
0xa7, 0x59, 0x59, 0x5f, 0x63, 0x79, 0x49, 0xbf, 0x40, 0xe9, 0x9f, 0x40, 0x43, 0xa1, 0xac, 0x0a,
0xca, 0x0a, 0x3e, 0xab, 0x8f, 0xbf, 0x8a, 0xc7, 0xa3, 0xbf, 0x6d, 0x00, 0x9c, 0xcd, 0x53, 0x8e,
0xb3, 0x5f, 0x06, 0xf8, 0x9a, 0x3c, 0x86, 0xde, 0x0b, 0xbc, 0xa4, 0x59, 0xc8, 0xe5, 0x6b, 0x49,
0xa0, 0x89, 0x11, 0x13, 0x39, 0xf0, 0x15, 0x60, 0xfd, 0x10, 0xda, 0x27, 0xf4, 0xcd, 0x77, 0xeb,
0x7d, 0x0a, 0xdd, 0x12, 0x06, 0xeb, 0x2b, 0x2e, 0xa3, 0xba, 0xbe, 0xe2, 0x2a, 0x5a, 0x3f, 0x84,
0xa6, 0x46, 0x66, 0xf3, 0x0c, 0xd9, 0xc3, 0x4a, 0x88, 0xfd, 0x63, 0xe8, 0x2d, 0xe1, 0xb2, 0xa9,
0x2f, 0x7f, 0xa9, 0xad, 0xc5, 0xed, 0xe7, 0xe2, 0xb5, 0x53, 0xc6, 0x66, 0x73, 0xe3, 0x1d, 0x85,
0x87, 0xeb, 0xc0, 0xfb, 0x65, 0xf9, 0x9d, 0x24, 0x5f, 0x89, 0xf6, 0x32, 0x7c, 0xe6, 0xe0, 0x9d,
0x1b, 0x5a, 0x07, 0xc3, 0x4f, 0xa1, 0x63, 0x22, 0xe8, 0x4a, 0x09, 0xae, 0xc2, 0xeb, 0x07, 0x00,
0x0b, 0x10, 0x35, 0xf5, 0x65, 0x7a, 0x2c, 0xe3, 0xeb, 0x47, 0x00, 0x0b, 0x68, 0x54, 0x59, 0x55,
0x46, 0x56, 0xb5, 0x6d, 0x19, 0x3e, 0x1f, 0x43, 0xab, 0x80, 0x33, 0xf3, 0x0c, 0x69, 0xa0, 0x8c,
0x8e, 0x9f, 0x0d, 0x7f, 0xf3, 0xc1, 0x24, 0xe0, 0xd3, 0xec, 0x62, 0xe8, 0xc5, 0xb3, 0xbd, 0x29,
0x4d, 0xa7, 0x81, 0x17, 0xb3, 0x64, 0xef, 0x5a, 0x24, 0xd3, 0xde, 0xca, 0x9f, 0xf4, 0x8b, 0x86,
0x7c, 0xec, 0x7d, 0xf8, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc6, 0x0c, 0x9b, 0x12, 0x65, 0x17,
0x00, 0x00,
}

View file

@ -5,6 +5,7 @@ option go_package = "github.com/hashicorp/vault/logical/plugin/pb";
import "google/protobuf/timestamp.proto";
import "logical/identity.proto";
import "logical/plugin.proto";
message Empty {}
@ -498,6 +499,11 @@ message EntityInfoReply {
string err = 2;
}
message PluginEnvReply {
logical.PluginEnvironment plugin_environment = 1;
string err = 2;
}
// SystemView exposes system configuration information in a safe way for plugins
// to consume. Plugins should implement the client for this service.
service SystemView {
@ -544,6 +550,9 @@ service SystemView {
// EntityInfo returns the basic entity information for the given entity id
rpc EntityInfo(EntityInfoArgs) returns (EntityInfoReply);
// PluginEnv returns Vault environment information used by plugins
rpc PluginEnv(Empty) returns (PluginEnvReply);
}
message Connection {

View file

@ -146,6 +146,20 @@ func (s *SystemViewClient) EntityInfo(entityID string) (*logical.Entity, error)
return reply.Entity, nil
}
func (s *SystemViewClient) PluginEnv(_ context.Context) (*logical.PluginEnvironment, error) {
var reply PluginEnvReply
err := s.client.Call("Plugin.PluginEnv", new(interface{}), &reply)
if err != nil {
return nil, err
}
if reply.Error != nil {
return nil, reply.Error
}
return reply.PluginEnvironment, nil
}
type SystemViewServer struct {
impl logical.SystemView
}
@ -253,6 +267,21 @@ func (s *SystemViewServer) EntityInfo(args *EntityInfoArgs, reply *EntityInfoRep
return nil
}
func (s *SystemViewServer) PluginEnv(_ interface{}, reply *PluginEnvReply) error {
pluginEnv, err := s.impl.PluginEnv(context.Background())
if err != nil {
*reply = PluginEnvReply{
Error: wrapError(err),
}
return nil
}
*reply = PluginEnvReply{
PluginEnvironment: pluginEnv,
}
return nil
}
type DefaultLeaseTTLReply struct {
DefaultLeaseTTL time.Duration
}
@ -309,3 +338,8 @@ type EntityInfoReply struct {
Entity *logical.Entity
Error error
}
type PluginEnvReply struct {
PluginEnvironment *logical.PluginEnvironment
Error error
}

View file

@ -199,3 +199,33 @@ func TestSystem_entityInfo(t *testing.T) {
t.Fatalf("expected: %v, got: %v", sys.EntityVal, actual)
}
}
func TestSystem_pluginEnv(t *testing.T) {
client, server := plugin.TestRPCConn(t)
defer client.Close()
sys := logical.TestSystemView()
sys.PluginEnvironment = &logical.PluginEnvironment{
VaultVersion: "0.10.42",
}
server.RegisterName("Plugin", &SystemViewServer{
impl: sys,
})
testSystemView := &SystemViewClient{client: client}
expected, err := sys.PluginEnv(context.Background())
if err != nil {
t.Fatal(err)
}
actual, err := testSystemView.PluginEnv(context.Background())
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(expected, actual) {
t.Fatalf("expected: %v, got: %v", expected, actual)
}
}

View file

@ -61,6 +61,9 @@ type SystemView interface {
// EntityInfo returns a subset of information related to the identity entity
// for the given entity id
EntityInfo(entityID string) (*Entity, error)
// PluginEnv returns Vault environment information used by plugins
PluginEnv(context.Context) (*PluginEnvironment, error)
}
type StaticSystemView struct {
@ -74,6 +77,8 @@ type StaticSystemView struct {
LocalMountVal bool
ReplicationStateVal consts.ReplicationState
EntityVal *Entity
VaultVersion string
PluginEnvironment *PluginEnvironment
}
func (d StaticSystemView) DefaultLeaseTTL() time.Duration {
@ -119,3 +124,7 @@ func (d StaticSystemView) MlockEnabled() bool {
func (d StaticSystemView) EntityInfo(entityID string) (*Entity, error) {
return d.EntityVal, nil
}
func (d StaticSystemView) PluginEnv(_ context.Context) (*PluginEnvironment, error) {
return d.PluginEnvironment, nil
}

View file

@ -10,6 +10,7 @@ import (
"github.com/hashicorp/vault/helper/pluginutil"
"github.com/hashicorp/vault/helper/wrapping"
"github.com/hashicorp/vault/logical"
"github.com/hashicorp/vault/version"
)
type dynamicSystemView struct {
@ -206,3 +207,9 @@ func (d dynamicSystemView) EntityInfo(entityID string) (*logical.Entity, error)
return ret, nil
}
func (d dynamicSystemView) PluginEnv(_ context.Context) (*logical.PluginEnvironment, error) {
return &logical.PluginEnvironment{
VaultVersion: version.GetVersion().Version,
}, nil
}