Integrate new Metainfo calls (server side) (#2682)
This commit is contained in:
parent
238e264a8f
commit
287fdf9936
@ -1661,17 +1661,15 @@ func (m *Object) GetRemoteSize() int64 {
|
||||
}
|
||||
|
||||
type ObjectBeginRequest struct {
|
||||
Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"`
|
||||
EncryptedPath []byte `protobuf:"bytes,2,opt,name=encrypted_path,json=encryptedPath,proto3" json:"encrypted_path,omitempty"`
|
||||
Version int32 `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"`
|
||||
ExpiresAt time.Time `protobuf:"bytes,4,opt,name=expires_at,json=expiresAt,proto3,stdtime" json:"expires_at"`
|
||||
EncryptedMetadataNonce Nonce `protobuf:"bytes,5,opt,name=encrypted_metadata_nonce,json=encryptedMetadataNonce,proto3,customtype=Nonce" json:"encrypted_metadata_nonce"`
|
||||
EncryptedMetadata []byte `protobuf:"bytes,6,opt,name=encrypted_metadata,json=encryptedMetadata,proto3" json:"encrypted_metadata,omitempty"`
|
||||
RedundancyScheme *RedundancyScheme `protobuf:"bytes,7,opt,name=redundancy_scheme,json=redundancyScheme,proto3" json:"redundancy_scheme,omitempty"`
|
||||
EncryptionParameters *EncryptionParameters `protobuf:"bytes,8,opt,name=encryption_parameters,json=encryptionParameters,proto3" json:"encryption_parameters,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"`
|
||||
EncryptedPath []byte `protobuf:"bytes,2,opt,name=encrypted_path,json=encryptedPath,proto3" json:"encrypted_path,omitempty"`
|
||||
Version int32 `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"`
|
||||
ExpiresAt time.Time `protobuf:"bytes,4,opt,name=expires_at,json=expiresAt,proto3,stdtime" json:"expires_at"`
|
||||
RedundancyScheme *RedundancyScheme `protobuf:"bytes,7,opt,name=redundancy_scheme,json=redundancyScheme,proto3" json:"redundancy_scheme,omitempty"`
|
||||
EncryptionParameters *EncryptionParameters `protobuf:"bytes,8,opt,name=encryption_parameters,json=encryptionParameters,proto3" json:"encryption_parameters,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ObjectBeginRequest) Reset() { *m = ObjectBeginRequest{} }
|
||||
@ -1726,13 +1724,6 @@ func (m *ObjectBeginRequest) GetExpiresAt() time.Time {
|
||||
return time.Time{}
|
||||
}
|
||||
|
||||
func (m *ObjectBeginRequest) GetEncryptedMetadata() []byte {
|
||||
if m != nil {
|
||||
return m.EncryptedMetadata
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ObjectBeginRequest) GetRedundancyScheme() *RedundancyScheme {
|
||||
if m != nil {
|
||||
return m.RedundancyScheme
|
||||
@ -1819,10 +1810,12 @@ func (m *ObjectBeginResponse) GetEncryptionParameters() *EncryptionParameters {
|
||||
}
|
||||
|
||||
type ObjectCommitRequest struct {
|
||||
StreamId StreamID `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3,customtype=StreamID" json:"stream_id"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
StreamId StreamID `protobuf:"bytes,1,opt,name=stream_id,json=streamId,proto3,customtype=StreamID" json:"stream_id"`
|
||||
EncryptedMetadataNonce Nonce `protobuf:"bytes,2,opt,name=encrypted_metadata_nonce,json=encryptedMetadataNonce,proto3,customtype=Nonce" json:"encrypted_metadata_nonce"`
|
||||
EncryptedMetadata []byte `protobuf:"bytes,3,opt,name=encrypted_metadata,json=encryptedMetadata,proto3" json:"encrypted_metadata,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ObjectCommitRequest) Reset() { *m = ObjectCommitRequest{} }
|
||||
@ -1849,6 +1842,13 @@ func (m *ObjectCommitRequest) XXX_DiscardUnknown() {
|
||||
|
||||
var xxx_messageInfo_ObjectCommitRequest proto.InternalMessageInfo
|
||||
|
||||
func (m *ObjectCommitRequest) GetEncryptedMetadata() []byte {
|
||||
if m != nil {
|
||||
return m.EncryptedMetadata
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type ObjectCommitResponse struct {
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
@ -1975,8 +1975,9 @@ type ObjectListRequest struct {
|
||||
Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"`
|
||||
EncryptedPrefix []byte `protobuf:"bytes,2,opt,name=encrypted_prefix,json=encryptedPrefix,proto3" json:"encrypted_prefix,omitempty"`
|
||||
EncryptedCursor []byte `protobuf:"bytes,3,opt,name=encrypted_cursor,json=encryptedCursor,proto3" json:"encrypted_cursor,omitempty"`
|
||||
Limit int32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"`
|
||||
ObjectIncludes *ObjectListItemIncludes `protobuf:"bytes,5,opt,name=object_includes,json=objectIncludes,proto3" json:"object_includes,omitempty"`
|
||||
Recursive bool `protobuf:"varint,4,opt,name=recursive,proto3" json:"recursive,omitempty"`
|
||||
Limit int32 `protobuf:"varint,5,opt,name=limit,proto3" json:"limit,omitempty"`
|
||||
ObjectIncludes *ObjectListItemIncludes `protobuf:"bytes,6,opt,name=object_includes,json=objectIncludes,proto3" json:"object_includes,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
@ -2027,6 +2028,13 @@ func (m *ObjectListRequest) GetEncryptedCursor() []byte {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ObjectListRequest) GetRecursive() bool {
|
||||
if m != nil {
|
||||
return m.Recursive
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *ObjectListRequest) GetLimit() int32 {
|
||||
if m != nil {
|
||||
return m.Limit
|
||||
@ -2360,18 +2368,16 @@ var xxx_messageInfo_ObjectFinishDeleteResponse proto.InternalMessageInfo
|
||||
|
||||
// only for satellite use
|
||||
type SatStreamID struct {
|
||||
Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"`
|
||||
EncryptedPath []byte `protobuf:"bytes,2,opt,name=encrypted_path,json=encryptedPath,proto3" json:"encrypted_path,omitempty"`
|
||||
Version int32 `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"`
|
||||
Redundancy *RedundancyScheme `protobuf:"bytes,4,opt,name=redundancy,proto3" json:"redundancy,omitempty"`
|
||||
CreationDate time.Time `protobuf:"bytes,5,opt,name=creation_date,json=creationDate,proto3,stdtime" json:"creation_date"`
|
||||
ExpirationDate time.Time `protobuf:"bytes,6,opt,name=expiration_date,json=expirationDate,proto3,stdtime" json:"expiration_date"`
|
||||
EncryptedMetadataNonce Nonce `protobuf:"bytes,7,opt,name=encrypted_metadata_nonce,json=encryptedMetadataNonce,proto3,customtype=Nonce" json:"encrypted_metadata_nonce"`
|
||||
EncryptedMetadata []byte `protobuf:"bytes,8,opt,name=encrypted_metadata,json=encryptedMetadata,proto3" json:"encrypted_metadata,omitempty"`
|
||||
SatelliteSignature []byte `protobuf:"bytes,9,opt,name=satellite_signature,json=satelliteSignature,proto3" json:"satellite_signature,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"`
|
||||
EncryptedPath []byte `protobuf:"bytes,2,opt,name=encrypted_path,json=encryptedPath,proto3" json:"encrypted_path,omitempty"`
|
||||
Version int32 `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"`
|
||||
Redundancy *RedundancyScheme `protobuf:"bytes,4,opt,name=redundancy,proto3" json:"redundancy,omitempty"`
|
||||
CreationDate time.Time `protobuf:"bytes,5,opt,name=creation_date,json=creationDate,proto3,stdtime" json:"creation_date"`
|
||||
ExpirationDate time.Time `protobuf:"bytes,6,opt,name=expiration_date,json=expirationDate,proto3,stdtime" json:"expiration_date"`
|
||||
SatelliteSignature []byte `protobuf:"bytes,9,opt,name=satellite_signature,json=satelliteSignature,proto3" json:"satellite_signature,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *SatStreamID) Reset() { *m = SatStreamID{} }
|
||||
@ -2440,13 +2446,6 @@ func (m *SatStreamID) GetExpirationDate() time.Time {
|
||||
return time.Time{}
|
||||
}
|
||||
|
||||
func (m *SatStreamID) GetEncryptedMetadata() []byte {
|
||||
if m != nil {
|
||||
return m.EncryptedMetadata
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *SatStreamID) GetSatelliteSignature() []byte {
|
||||
if m != nil {
|
||||
return m.SatelliteSignature
|
||||
@ -3048,6 +3047,7 @@ func (m *SegmentBeginDeleteRequest) GetPosition() *SegmentPosition {
|
||||
type SegmentBeginDeleteResponse struct {
|
||||
SegmentId SegmentID `protobuf:"bytes,1,opt,name=segment_id,json=segmentId,proto3,customtype=SegmentID" json:"segment_id"`
|
||||
AddressedLimits []*AddressedOrderLimit `protobuf:"bytes,2,rep,name=addressed_limits,json=addressedLimits,proto3" json:"addressed_limits,omitempty"`
|
||||
PrivateKey PiecePrivateKey `protobuf:"bytes,3,opt,name=private_key,json=privateKey,proto3,customtype=PiecePrivateKey" json:"private_key"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
@ -3380,8 +3380,12 @@ func (m *SegmentDownloadRequest) GetCursorPosition() *SegmentPosition {
|
||||
type SegmentDownloadResponse struct {
|
||||
SegmentId SegmentID `protobuf:"bytes,1,opt,name=segment_id,json=segmentId,proto3,customtype=SegmentID" json:"segment_id"`
|
||||
AddressedLimits []*AddressedOrderLimit `protobuf:"bytes,2,rep,name=addressed_limits,json=addressedLimits,proto3" json:"addressed_limits,omitempty"`
|
||||
EncryptedInlineData []byte `protobuf:"bytes,3,opt,name=encrypted_inline_data,json=encryptedInlineData,proto3" json:"encrypted_inline_data,omitempty"`
|
||||
Next *SegmentPosition `protobuf:"bytes,4,opt,name=next,proto3" json:"next,omitempty"`
|
||||
PrivateKey PiecePrivateKey `protobuf:"bytes,3,opt,name=private_key,json=privateKey,proto3,customtype=PiecePrivateKey" json:"private_key"`
|
||||
EncryptedInlineData []byte `protobuf:"bytes,4,opt,name=encrypted_inline_data,json=encryptedInlineData,proto3" json:"encrypted_inline_data,omitempty"`
|
||||
SegmentSize int64 `protobuf:"varint,5,opt,name=segment_size,json=segmentSize,proto3" json:"segment_size,omitempty"`
|
||||
EncryptedKeyNonce Nonce `protobuf:"bytes,6,opt,name=encrypted_key_nonce,json=encryptedKeyNonce,proto3,customtype=Nonce" json:"encrypted_key_nonce"`
|
||||
EncryptedKey []byte `protobuf:"bytes,7,opt,name=encrypted_key,json=encryptedKey,proto3" json:"encrypted_key,omitempty"`
|
||||
Next *SegmentPosition `protobuf:"bytes,8,opt,name=next,proto3" json:"next,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
@ -3425,6 +3429,20 @@ func (m *SegmentDownloadResponse) GetEncryptedInlineData() []byte {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *SegmentDownloadResponse) GetSegmentSize() int64 {
|
||||
if m != nil {
|
||||
return m.SegmentSize
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *SegmentDownloadResponse) GetEncryptedKey() []byte {
|
||||
if m != nil {
|
||||
return m.EncryptedKey
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *SegmentDownloadResponse) GetNext() *SegmentPosition {
|
||||
if m != nil {
|
||||
return m.Next
|
||||
@ -3506,194 +3524,195 @@ func init() {
|
||||
func init() { proto.RegisterFile("metainfo.proto", fileDescriptor_631e2f30a93cd64e) }
|
||||
|
||||
var fileDescriptor_631e2f30a93cd64e = []byte{
|
||||
// 2984 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x4b, 0x6f, 0x23, 0xc7,
|
||||
0xf1, 0xf7, 0xf0, 0xcd, 0x22, 0x45, 0x52, 0x2d, 0xad, 0x96, 0x4b, 0xad, 0x2c, 0x79, 0xd6, 0xbb,
|
||||
0x96, 0x01, 0x9b, 0x6b, 0xc8, 0xff, 0x3f, 0x60, 0xc0, 0x36, 0x10, 0x49, 0x5c, 0xaf, 0x68, 0xaf,
|
||||
0x1e, 0x1e, 0xf9, 0x15, 0xc3, 0xc1, 0x60, 0xa4, 0x69, 0x49, 0x93, 0x25, 0x67, 0x98, 0x99, 0xa1,
|
||||
0xa3, 0xf5, 0x39, 0x40, 0x10, 0x38, 0x87, 0x1c, 0x7d, 0xf2, 0x25, 0xc8, 0x29, 0x9f, 0x20, 0x97,
|
||||
0x5c, 0x13, 0x24, 0x41, 0x0e, 0x39, 0x26, 0x80, 0x13, 0xe4, 0x90, 0x2f, 0x90, 0x4b, 0x2e, 0x01,
|
||||
0x82, 0x7e, 0xcd, 0xf4, 0xbc, 0x44, 0x71, 0x45, 0xed, 0xde, 0xa6, 0xbb, 0xaa, 0xab, 0xbb, 0x7f,
|
||||
0xf5, 0xe8, 0xea, 0x9a, 0x86, 0xc6, 0x10, 0xfb, 0x86, 0x65, 0x9f, 0x38, 0xdd, 0x91, 0xeb, 0xf8,
|
||||
0x0e, 0xaa, 0x88, 0x76, 0xa7, 0x85, 0xed, 0x63, 0xf7, 0xc9, 0xc8, 0xb7, 0x1c, 0x9b, 0xd1, 0x3a,
|
||||
0x70, 0xea, 0x9c, 0x72, 0xbe, 0xce, 0xea, 0xa9, 0xe3, 0x9c, 0x0e, 0xf0, 0x7d, 0xda, 0x3a, 0x1a,
|
||||
0x9f, 0xdc, 0xf7, 0xad, 0x21, 0xf6, 0x7c, 0x63, 0x38, 0x12, 0xcc, 0xb6, 0x63, 0x62, 0xfe, 0xdd,
|
||||
0x1c, 0x39, 0x96, 0xed, 0x63, 0xd7, 0x3c, 0xe2, 0x1d, 0x75, 0xc7, 0x35, 0xb1, 0xeb, 0xb1, 0x96,
|
||||
0xfa, 0xeb, 0x3c, 0x94, 0xb6, 0xc6, 0xc7, 0x8f, 0xb1, 0x8f, 0x10, 0x14, 0x6c, 0x63, 0x88, 0xdb,
|
||||
0xca, 0x9a, 0xb2, 0x5e, 0xd7, 0xe8, 0x37, 0x7a, 0x0b, 0x6a, 0x23, 0xc3, 0x3f, 0xd3, 0x8f, 0xad,
|
||||
0xd1, 0x19, 0x76, 0xdb, 0xb9, 0x35, 0x65, 0xbd, 0xb1, 0x71, 0xb3, 0x2b, 0x2d, 0x6f, 0x9b, 0x52,
|
||||
0x0e, 0xc7, 0x96, 0x8f, 0x35, 0x20, 0xbc, 0xac, 0x03, 0x6d, 0x03, 0x1c, 0xbb, 0xd8, 0xf0, 0xb1,
|
||||
0xa9, 0x1b, 0x7e, 0x3b, 0xbf, 0xa6, 0xac, 0xd7, 0x36, 0x3a, 0x5d, 0xb6, 0xf2, 0xae, 0x58, 0x79,
|
||||
0xf7, 0x23, 0xb1, 0xf2, 0xad, 0xca, 0xef, 0xbf, 0x5b, 0x7d, 0xe1, 0x17, 0x7f, 0x5f, 0x55, 0xb4,
|
||||
0x2a, 0x1f, 0xb7, 0xe9, 0xa3, 0x37, 0x60, 0xd1, 0xc4, 0x27, 0xc6, 0x78, 0xe0, 0xeb, 0x1e, 0x3e,
|
||||
0x1d, 0x62, 0xdb, 0xd7, 0x3d, 0xeb, 0x2b, 0xdc, 0x2e, 0xac, 0x29, 0xeb, 0x79, 0x0d, 0x71, 0xda,
|
||||
0x21, 0x23, 0x1d, 0x5a, 0x5f, 0x61, 0xf4, 0x29, 0xdc, 0x12, 0x23, 0x5c, 0x6c, 0x8e, 0x6d, 0xd3,
|
||||
0xb0, 0x8f, 0x9f, 0xe8, 0xde, 0xf1, 0x19, 0x1e, 0xe2, 0x76, 0x91, 0xae, 0x62, 0xb9, 0x1b, 0x42,
|
||||
0xa2, 0x05, 0x3c, 0x87, 0x94, 0x45, 0xbb, 0xc9, 0x47, 0xc7, 0x09, 0xc8, 0x84, 0x15, 0x21, 0x38,
|
||||
0xdc, 0xbd, 0x3e, 0x32, 0x5c, 0x63, 0x88, 0x7d, 0xec, 0x7a, 0xed, 0x12, 0x15, 0xbe, 0x26, 0x63,
|
||||
0xf3, 0x20, 0xf8, 0x3c, 0x08, 0xf8, 0xb4, 0x65, 0x2e, 0x26, 0x8d, 0x88, 0x56, 0x00, 0x46, 0x86,
|
||||
0xeb, 0xdb, 0xd8, 0xd5, 0x2d, 0xb3, 0x5d, 0xa6, 0x9a, 0xa8, 0xf2, 0x9e, 0xbe, 0xa9, 0x5a, 0xd0,
|
||||
0x60, 0xca, 0x7a, 0x64, 0x79, 0x7e, 0xdf, 0xc7, 0xc3, 0x54, 0xa5, 0x45, 0xa1, 0xcf, 0x3d, 0x15,
|
||||
0xf4, 0xea, 0xbf, 0x73, 0xb0, 0xc0, 0xe6, 0xda, 0xa6, 0x7d, 0x1a, 0xfe, 0xd1, 0x18, 0x7b, 0xb3,
|
||||
0xb6, 0x92, 0x2c, 0x05, 0xe7, 0x9f, 0x4e, 0xc1, 0x85, 0xeb, 0x54, 0x70, 0x71, 0xf6, 0x0a, 0x2e,
|
||||
0xc5, 0x15, 0xfc, 0x3d, 0x58, 0x8c, 0x82, 0xee, 0x8d, 0x1c, 0xdb, 0xc3, 0x68, 0x1d, 0x4a, 0x47,
|
||||
0xb4, 0x9f, 0xe2, 0x5e, 0xdb, 0x68, 0x75, 0x83, 0xd8, 0xc1, 0xf8, 0x35, 0x4e, 0x57, 0xef, 0x41,
|
||||
0x8b, 0xf5, 0x3c, 0xc4, 0xfe, 0x05, 0x3a, 0x53, 0xdf, 0x85, 0x79, 0x89, 0x6f, 0xea, 0x69, 0x5e,
|
||||
0x15, 0xd6, 0xd1, 0xc3, 0x03, 0x7c, 0xa1, 0x75, 0xa8, 0x4b, 0x62, 0x4f, 0x82, 0x95, 0x4d, 0xa6,
|
||||
0xea, 0x62, 0x05, 0xc4, 0x98, 0x85, 0x80, 0x25, 0x28, 0x1d, 0x8f, 0x5d, 0xcf, 0x71, 0xb9, 0x08,
|
||||
0xde, 0x42, 0x8b, 0x50, 0x1c, 0x58, 0x43, 0x8b, 0x99, 0x73, 0x51, 0x63, 0x0d, 0x74, 0x1b, 0xaa,
|
||||
0xa6, 0xe5, 0xe2, 0x63, 0x02, 0x32, 0xb5, 0x99, 0xa2, 0x16, 0x76, 0xa8, 0x9f, 0x01, 0x92, 0x27,
|
||||
0xe0, 0x7b, 0xec, 0x42, 0xd1, 0xf2, 0xf1, 0xd0, 0x6b, 0x2b, 0x6b, 0xf9, 0xf5, 0xda, 0x46, 0x3b,
|
||||
0xbe, 0x45, 0xe1, 0x5a, 0x1a, 0x63, 0x23, 0x5b, 0x1a, 0x3a, 0x2e, 0xa6, 0x13, 0x57, 0x34, 0xfa,
|
||||
0xad, 0x7e, 0x06, 0xcb, 0x8c, 0xf9, 0x10, 0xfb, 0x9b, 0xbe, 0xef, 0x5a, 0x47, 0x63, 0x32, 0xe3,
|
||||
0x45, 0x3e, 0x72, 0x17, 0x1a, 0x46, 0xc8, 0x49, 0x94, 0x9f, 0xa3, 0xd4, 0x39, 0xa9, 0xb7, 0x6f,
|
||||
0xaa, 0x2f, 0xc2, 0xed, 0x74, 0xc9, 0x1c, 0xb4, 0x9f, 0x28, 0xb0, 0xb0, 0x69, 0x9a, 0x2e, 0xf6,
|
||||
0x3c, 0x6c, 0xee, 0x93, 0x48, 0xfe, 0x88, 0x22, 0xb1, 0x2e, 0xf0, 0x61, 0x8a, 0x43, 0x5d, 0x1e,
|
||||
0xe5, 0x43, 0x16, 0x81, 0xd9, 0x36, 0x2c, 0x7a, 0xbe, 0xe3, 0x1a, 0xa7, 0x58, 0x27, 0xc7, 0x84,
|
||||
0x6e, 0x30, 0x69, 0x3c, 0x4e, 0xcc, 0x77, 0xe9, 0xd9, 0xb1, 0xe7, 0x98, 0x98, 0x4f, 0xa3, 0x21,
|
||||
0xce, 0x2e, 0xf5, 0xa9, 0xdf, 0xe6, 0x60, 0x89, 0x7b, 0xe5, 0xa7, 0xae, 0x15, 0xe8, 0x7f, 0x7f,
|
||||
0x60, 0x12, 0x0d, 0x4a, 0x36, 0x54, 0x17, 0x16, 0x43, 0x40, 0x21, 0x8e, 0xcf, 0xb7, 0x4d, 0xbf,
|
||||
0x51, 0x1b, 0xca, 0xdc, 0xed, 0xb9, 0xc7, 0x8b, 0x26, 0x7a, 0x1b, 0x20, 0x74, 0xef, 0xcb, 0xf8,
|
||||
0xb5, 0xc4, 0x8e, 0xde, 0x86, 0xce, 0xd0, 0x38, 0x17, 0x6e, 0x8c, 0xcd, 0x68, 0x6c, 0x29, 0xd2,
|
||||
0x99, 0x6e, 0x0e, 0x8d, 0xf3, 0x07, 0x82, 0x41, 0x0e, 0x30, 0x3d, 0x00, 0x7c, 0x3e, 0xb2, 0x5c,
|
||||
0x83, 0x1a, 0x55, 0x69, 0x8a, 0xe8, 0x29, 0x8d, 0x53, 0xff, 0xa2, 0xc0, 0xcd, 0x28, 0x40, 0x4c,
|
||||
0x81, 0x04, 0xa1, 0x1d, 0x68, 0x19, 0x42, 0x85, 0x3a, 0x55, 0x8a, 0x30, 0xc6, 0x95, 0xd0, 0x18,
|
||||
0x53, 0x94, 0xac, 0x35, 0x83, 0x61, 0xb4, 0xed, 0xa1, 0x37, 0x61, 0xce, 0x75, 0x1c, 0x5f, 0x1f,
|
||||
0x59, 0xf8, 0x18, 0x07, 0x36, 0xb5, 0xd5, 0x24, 0x4b, 0xfa, 0xeb, 0x77, 0xab, 0xe5, 0x03, 0xd2,
|
||||
0xdf, 0xef, 0x69, 0x35, 0xc2, 0xc5, 0x1a, 0x26, 0x8d, 0xd6, 0xae, 0xf5, 0xa5, 0xe1, 0x63, 0xfd,
|
||||
0x31, 0x7e, 0x42, 0x81, 0xaf, 0x6f, 0xdd, 0xe4, 0x43, 0x9a, 0x94, 0xeb, 0x80, 0xd1, 0x3f, 0xc0,
|
||||
0x4f, 0x34, 0x18, 0x05, 0xdf, 0xea, 0x1f, 0xc2, 0x4d, 0x6d, 0x3b, 0x43, 0xb2, 0xa2, 0x59, 0xab,
|
||||
0xfd, 0x35, 0x28, 0x73, 0x1d, 0x73, 0x9d, 0x23, 0x49, 0xe7, 0x07, 0xec, 0x4b, 0x13, 0x2c, 0xe8,
|
||||
0x6d, 0x68, 0x3a, 0xae, 0x75, 0x6a, 0xd9, 0xc6, 0x40, 0xe0, 0x58, 0xa4, 0x38, 0xa6, 0x99, 0x7f,
|
||||
0x43, 0xb0, 0x32, 0xec, 0xd4, 0x1d, 0x68, 0xc7, 0xf6, 0x12, 0x6a, 0x48, 0x5a, 0x86, 0x32, 0x71,
|
||||
0x19, 0xaa, 0x01, 0xb7, 0xb8, 0xa4, 0x9e, 0xf3, 0x63, 0x7b, 0xe0, 0x18, 0xe6, 0xac, 0x71, 0x51,
|
||||
0xff, 0xac, 0x40, 0x27, 0x31, 0xc7, 0x75, 0x58, 0x94, 0xb4, 0xf3, 0xdc, 0x64, 0x05, 0x3c, 0xbd,
|
||||
0x29, 0xfd, 0x00, 0x6e, 0xf0, 0xfd, 0xf4, 0xed, 0x13, 0x67, 0xe6, 0x78, 0xbd, 0x17, 0x84, 0x27,
|
||||
0x26, 0x3e, 0x55, 0xb5, 0x93, 0x37, 0xa8, 0xea, 0x81, 0xc1, 0x47, 0xce, 0xb9, 0xd9, 0x2d, 0xf4,
|
||||
0x5b, 0x25, 0x30, 0xc3, 0xe8, 0xf1, 0x38, 0x5b, 0xb5, 0xc6, 0x14, 0x95, 0xbb, 0xbc, 0xa2, 0xfe,
|
||||
0xa6, 0xc0, 0x12, 0x39, 0x12, 0xf9, 0x22, 0xbd, 0x4b, 0x20, 0xb0, 0x04, 0xa5, 0x91, 0x8b, 0x4f,
|
||||
0xac, 0x73, 0x8e, 0x01, 0x6f, 0xa1, 0x55, 0xa8, 0x79, 0xbe, 0xe1, 0xfa, 0xba, 0x71, 0x42, 0xe0,
|
||||
0xa7, 0xd6, 0xa2, 0x01, 0xed, 0xda, 0x24, 0x3d, 0x24, 0x39, 0xc2, 0xb6, 0xa9, 0x1f, 0xe1, 0x13,
|
||||
0x72, 0xe0, 0x16, 0x58, 0x72, 0x84, 0x6d, 0x73, 0x8b, 0x76, 0x90, 0xd3, 0xde, 0xc5, 0x24, 0x1f,
|
||||
0xb0, 0xbe, 0x64, 0x51, 0xbc, 0xa2, 0x85, 0x1d, 0x61, 0x86, 0x50, 0x92, 0x33, 0x84, 0x15, 0x00,
|
||||
0x82, 0x94, 0x7e, 0x32, 0x30, 0x4e, 0x3d, 0x9a, 0x50, 0x97, 0xb5, 0x2a, 0xe9, 0x79, 0x8f, 0x74,
|
||||
0xd0, 0x30, 0x1d, 0xdd, 0x5d, 0x88, 0xfe, 0x3b, 0xd1, 0x44, 0xe1, 0x5e, 0x08, 0x79, 0xc6, 0x88,
|
||||
0xee, 0x84, 0xb4, 0xa1, 0x83, 0xa1, 0x20, 0x92, 0x76, 0x6a, 0x22, 0x8a, 0x64, 0x22, 0xd3, 0x39,
|
||||
0xde, 0x32, 0x54, 0x2d, 0x4f, 0xe7, 0x28, 0xe7, 0xe9, 0x14, 0x15, 0xcb, 0x3b, 0xa0, 0x6d, 0xf5,
|
||||
0x73, 0x62, 0x52, 0x29, 0x79, 0x09, 0xd9, 0xd4, 0x2a, 0xd4, 0x98, 0x96, 0x74, 0x29, 0x43, 0x01,
|
||||
0xd6, 0xb5, 0x47, 0xf2, 0x94, 0x68, 0x82, 0x9a, 0x8b, 0x27, 0xa8, 0xcb, 0x24, 0xd6, 0xa5, 0x65,
|
||||
0x26, 0xfb, 0x03, 0x53, 0x5d, 0x04, 0x74, 0xe0, 0x3a, 0x3f, 0xc4, 0xc7, 0xb2, 0x53, 0xab, 0x6f,
|
||||
0xc1, 0x42, 0xa4, 0x97, 0xe7, 0x61, 0x2f, 0x41, 0x7d, 0xc4, 0xba, 0x75, 0xcf, 0x18, 0x08, 0x1b,
|
||||
0xaa, 0xf1, 0xbe, 0x43, 0x63, 0xe0, 0xab, 0x3f, 0x2b, 0x43, 0x69, 0xff, 0x88, 0x34, 0x33, 0x6d,
|
||||
0xed, 0x2e, 0x34, 0xc2, 0x63, 0x5e, 0xf2, 0xbb, 0xb9, 0xa0, 0xf7, 0x80, 0x3b, 0xe0, 0x97, 0xd8,
|
||||
0xf5, 0xc2, 0x34, 0x51, 0x34, 0xd1, 0x7d, 0x28, 0x79, 0xbe, 0xe1, 0x8f, 0x3d, 0x6a, 0x6f, 0xe4,
|
||||
0xda, 0x12, 0xa8, 0x99, 0x4d, 0xdd, 0x3d, 0xa4, 0x64, 0x8d, 0xb3, 0xa1, 0xd7, 0xa1, 0xea, 0xf9,
|
||||
0x2e, 0x36, 0x86, 0x04, 0x9f, 0x22, 0x75, 0xa4, 0x16, 0x77, 0xa4, 0xca, 0x21, 0x25, 0xf4, 0x7b,
|
||||
0x5a, 0x85, 0xb1, 0xf4, 0xcd, 0xd8, 0x65, 0xac, 0xf4, 0x74, 0xf7, 0xe0, 0x4d, 0x32, 0x27, 0x99,
|
||||
0x9d, 0xc8, 0x28, 0x4f, 0x21, 0xa3, 0xc2, 0x86, 0x6d, 0x92, 0xb4, 0x8f, 0xa5, 0x27, 0x98, 0xca,
|
||||
0xa8, 0x4c, 0xb3, 0x0e, 0x3e, 0x6e, 0xd3, 0x47, 0x0f, 0xa1, 0x1d, 0xa2, 0x4d, 0x70, 0x32, 0x0d,
|
||||
0xdf, 0xd0, 0x6d, 0xc7, 0x3e, 0xc6, 0xed, 0x2a, 0x85, 0x62, 0x8e, 0x43, 0x51, 0xdc, 0x23, 0x9d,
|
||||
0xda, 0x52, 0xc0, 0xbe, 0xcb, 0xb9, 0x69, 0x3f, 0x7a, 0x1d, 0x50, 0x52, 0x50, 0x1b, 0xa8, 0xea,
|
||||
0xe6, 0x13, 0x63, 0xd0, 0x6b, 0x80, 0x4e, 0xac, 0xf3, 0x78, 0x22, 0x57, 0xa3, 0xa1, 0xb4, 0x45,
|
||||
0x29, 0x72, 0x06, 0xb7, 0x03, 0xf3, 0xc9, 0xab, 0x61, 0x7d, 0x72, 0x0a, 0xd9, 0x72, 0xe3, 0x77,
|
||||
0xc2, 0x8f, 0xe1, 0x46, 0xfa, 0x5d, 0x70, 0xee, 0x92, 0x77, 0xc1, 0x45, 0x9c, 0x71, 0x09, 0xf4,
|
||||
0x1d, 0xdf, 0x18, 0xb0, 0x6d, 0x34, 0xe8, 0x36, 0xaa, 0xb4, 0x87, 0xae, 0x7f, 0x15, 0x6a, 0x96,
|
||||
0x3d, 0xb0, 0x6c, 0xcc, 0xe8, 0x4d, 0x4a, 0x07, 0xd6, 0x25, 0x18, 0x5c, 0x3c, 0x74, 0x7c, 0xce,
|
||||
0xd0, 0x62, 0x0c, 0xac, 0x8b, 0x30, 0xa8, 0x1f, 0x42, 0x89, 0x59, 0x2d, 0xaa, 0x41, 0xb9, 0xbf,
|
||||
0xf7, 0xc9, 0xe6, 0xa3, 0x7e, 0xaf, 0xf5, 0x02, 0x9a, 0x83, 0xea, 0xc7, 0x07, 0x8f, 0xf6, 0x37,
|
||||
0x7b, 0xfd, 0xbd, 0x87, 0x2d, 0x05, 0x35, 0x00, 0xb6, 0xf7, 0x77, 0x77, 0xfb, 0x1f, 0x7d, 0x44,
|
||||
0xda, 0x39, 0x42, 0xe6, 0xed, 0x07, 0xbd, 0x56, 0x1e, 0xd5, 0xa1, 0xd2, 0x7b, 0xf0, 0xe8, 0x01,
|
||||
0x25, 0x16, 0xd4, 0x3f, 0xe6, 0x01, 0x31, 0x87, 0xd8, 0xc2, 0xa7, 0x96, 0x2d, 0xdd, 0xd7, 0xae,
|
||||
0xc7, 0x2f, 0xa3, 0xf6, 0x5a, 0x98, 0xbd, 0xbd, 0x16, 0xaf, 0x6e, 0xaf, 0xa5, 0x2c, 0x7b, 0x4d,
|
||||
0xb5, 0xc0, 0xf2, 0x4c, 0x2d, 0xb0, 0x72, 0x15, 0x0b, 0x54, 0x7f, 0x9b, 0x83, 0x85, 0x88, 0x36,
|
||||
0x79, 0x50, 0xbe, 0x36, 0x75, 0x46, 0xa2, 0x66, 0x61, 0x62, 0xd4, 0x4c, 0x05, 0xb0, 0x38, 0x53,
|
||||
0x00, 0x4b, 0x57, 0x02, 0xb0, 0x27, 0xf0, 0x8b, 0x5c, 0x84, 0xa2, 0xdb, 0x54, 0x26, 0x6d, 0x53,
|
||||
0x5d, 0x82, 0xc5, 0xa8, 0x14, 0x7e, 0xcb, 0x7f, 0x0c, 0x2d, 0xd6, 0x2f, 0x15, 0x71, 0xae, 0x4b,
|
||||
0x35, 0xea, 0xbb, 0x30, 0x2f, 0x4d, 0x16, 0x56, 0x82, 0x1c, 0xda, 0x99, 0xac, 0x04, 0x31, 0x66,
|
||||
0x8d, 0xd3, 0xd5, 0x7f, 0x2a, 0x62, 0x7c, 0xac, 0x8e, 0x93, 0xba, 0xda, 0x57, 0xa1, 0x25, 0xad,
|
||||
0x56, 0xce, 0x12, 0x9b, 0xe1, 0x7a, 0x59, 0xba, 0x18, 0x61, 0xe5, 0x45, 0xa1, 0x7c, 0x8c, 0x75,
|
||||
0x3b, 0x56, 0x1d, 0x2a, 0xc8, 0xb9, 0x5f, 0x1f, 0x9a, 0x6c, 0x8d, 0xba, 0x65, 0x1f, 0x0f, 0xc6,
|
||||
0x26, 0x0e, 0x6b, 0x78, 0xb1, 0xcd, 0x88, 0x9a, 0x4f, 0x9f, 0xf3, 0x69, 0x0d, 0x36, 0x50, 0xb4,
|
||||
0xd5, 0xcf, 0x44, 0xf0, 0xbb, 0x64, 0x29, 0x29, 0x2a, 0xf6, 0xa2, 0x52, 0xd2, 0xef, 0xf2, 0xd0,
|
||||
0x88, 0x72, 0xa7, 0x68, 0x54, 0x99, 0xa0, 0xd1, 0x5c, 0x56, 0x4e, 0x93, 0xbf, 0x5c, 0x4e, 0x13,
|
||||
0x4d, 0x52, 0x0a, 0x33, 0x48, 0x52, 0x8a, 0x33, 0x48, 0x52, 0x4a, 0xb3, 0x0f, 0xfa, 0xe5, 0xab,
|
||||
0x07, 0xfd, 0x4a, 0x46, 0xd0, 0x57, 0xff, 0x0f, 0x96, 0xd2, 0xad, 0x09, 0x75, 0xa0, 0x12, 0x0c,
|
||||
0x57, 0x58, 0xb2, 0x2e, 0xda, 0xaa, 0x07, 0x6d, 0x29, 0x10, 0x47, 0xab, 0xa9, 0xd7, 0xe6, 0xf2,
|
||||
0xef, 0xc3, 0xad, 0x94, 0x49, 0xb9, 0x55, 0x4f, 0x19, 0xc3, 0x02, 0x59, 0xef, 0x59, 0xb6, 0xe5,
|
||||
0x9d, 0x45, 0x77, 0x30, 0xa5, 0xac, 0xdb, 0xd0, 0x49, 0x93, 0xc5, 0xa3, 0xe2, 0xbf, 0xf2, 0x50,
|
||||
0x3b, 0x34, 0x7c, 0x31, 0xee, 0xfa, 0x0e, 0xab, 0x2b, 0x15, 0x1f, 0xfb, 0x30, 0x47, 0x7d, 0x82,
|
||||
0x1c, 0x37, 0xa6, 0xe1, 0xe3, 0xa9, 0x5c, 0xa1, 0x2e, 0x86, 0xf6, 0x0c, 0x1f, 0xa3, 0x5d, 0x68,
|
||||
0x86, 0x25, 0x45, 0x26, 0x6c, 0x1a, 0x9f, 0x68, 0x84, 0x83, 0xa9, 0xb8, 0xe7, 0xe4, 0x18, 0xe8,
|
||||
0x3e, 0x2c, 0x78, 0x86, 0x8f, 0x07, 0x03, 0x8b, 0x66, 0xac, 0xa7, 0xb6, 0xe1, 0x8f, 0x5d, 0x7e,
|
||||
0x61, 0xd0, 0x50, 0x40, 0x3a, 0x14, 0x14, 0xf5, 0x1f, 0x39, 0x28, 0xf3, 0x84, 0x7e, 0x4a, 0x0b,
|
||||
0x42, 0xff, 0x0f, 0x95, 0x91, 0xe3, 0x59, 0xbe, 0x88, 0x8a, 0xb5, 0x8d, 0x5b, 0x61, 0xf0, 0xe3,
|
||||
0x32, 0x0f, 0x38, 0x83, 0x16, 0xb0, 0xa2, 0x77, 0x61, 0x21, 0xdc, 0xd1, 0x63, 0xfc, 0x84, 0xa3,
|
||||
0x92, 0x4f, 0x43, 0x25, 0xdc, 0xe1, 0x07, 0xf8, 0x09, 0x03, 0xe4, 0x0e, 0xcc, 0x45, 0x86, 0xf3,
|
||||
0xda, 0x45, 0x5d, 0xe6, 0x44, 0x5d, 0x58, 0x20, 0xe9, 0xba, 0x54, 0x96, 0xa6, 0xb0, 0xb1, 0x72,
|
||||
0xf4, 0x3c, 0x21, 0x05, 0xf5, 0xe8, 0x1e, 0x81, 0x6d, 0x23, 0xc8, 0x5c, 0xb0, 0xa9, 0xf3, 0x0b,
|
||||
0x81, 0x94, 0x76, 0x86, 0x0b, 0xee, 0x53, 0x1a, 0x1d, 0xf3, 0x0a, 0x94, 0x68, 0x2d, 0xd8, 0x6b,
|
||||
0x97, 0xe9, 0x91, 0xd4, 0x0c, 0x37, 0x4f, 0x8b, 0x3c, 0x1a, 0x27, 0xab, 0x3b, 0x50, 0xa4, 0x1d,
|
||||
0x68, 0x19, 0xaa, 0xac, 0x7a, 0x6c, 0x8f, 0x87, 0x14, 0xdf, 0xa2, 0x56, 0xa1, 0x1d, 0x7b, 0xe3,
|
||||
0x21, 0x52, 0xa1, 0x60, 0x3b, 0x26, 0xe6, 0xf5, 0xa2, 0x06, 0xc7, 0xa1, 0xb4, 0xe7, 0x98, 0xb8,
|
||||
0xdf, 0xd3, 0x28, 0x4d, 0xdd, 0x81, 0x66, 0x0c, 0x57, 0x72, 0x3f, 0x19, 0x19, 0xae, 0x4f, 0x44,
|
||||
0x1e, 0xf1, 0x12, 0x6a, 0x51, 0xa3, 0x65, 0x85, 0x3d, 0xda, 0x43, 0xce, 0x6b, 0xcb, 0x36, 0xf1,
|
||||
0xb9, 0xf8, 0x9b, 0x43, 0x1b, 0xea, 0x2f, 0x15, 0x58, 0xe0, 0xa2, 0x22, 0x77, 0x8c, 0x67, 0x63,
|
||||
0x02, 0xf7, 0xa0, 0x39, 0x34, 0xce, 0x75, 0x5a, 0x38, 0x66, 0xc5, 0x36, 0x5e, 0xab, 0x9b, 0x1b,
|
||||
0x1a, 0xe7, 0x61, 0x6d, 0x4d, 0xfd, 0x93, 0x02, 0x8b, 0xd1, 0x55, 0xf2, 0xb8, 0xf9, 0x06, 0x80,
|
||||
0xb8, 0x9e, 0x06, 0xeb, 0x9c, 0xe7, 0xeb, 0xac, 0x8a, 0x6a, 0x64, 0x4f, 0xab, 0x72, 0xa6, 0x7e,
|
||||
0x7a, 0x7d, 0x2f, 0x37, 0x8b, 0xfa, 0xde, 0x14, 0x85, 0xd8, 0x5f, 0xe5, 0x82, 0xed, 0x44, 0x53,
|
||||
0xd9, 0xe9, 0xb7, 0x93, 0xe1, 0x44, 0xb9, 0xa7, 0x75, 0xa2, 0xfc, 0xe5, 0x9d, 0xa8, 0x90, 0xe5,
|
||||
0x44, 0x0f, 0x61, 0x6e, 0x3c, 0x1a, 0x38, 0x86, 0xa9, 0xbb, 0xd8, 0x1b, 0x0f, 0x7c, 0xfe, 0x83,
|
||||
0x40, 0x4d, 0x5a, 0x04, 0xc1, 0xe8, 0xe3, 0x11, 0xaf, 0xac, 0x8f, 0x07, 0xbe, 0x56, 0x1f, 0x4b,
|
||||
0x2d, 0xf5, 0xa7, 0x61, 0xa1, 0x36, 0xc1, 0x7a, 0xb1, 0x13, 0xbd, 0x02, 0x65, 0xfa, 0xa3, 0x2d,
|
||||
0xf8, 0x3d, 0x13, 0xf7, 0xa3, 0x12, 0x21, 0xf7, 0x4d, 0x74, 0x17, 0x0a, 0x67, 0x86, 0x77, 0xc6,
|
||||
0x1f, 0x4b, 0xcc, 0x8b, 0x7f, 0x18, 0x74, 0xba, 0x1d, 0xc3, 0x3b, 0xd3, 0x28, 0x59, 0xfd, 0x6f,
|
||||
0x0e, 0xea, 0xe4, 0x18, 0x14, 0x2a, 0x40, 0x1b, 0x71, 0xff, 0xa8, 0x6d, 0xdc, 0x90, 0xf6, 0x17,
|
||||
0x9e, 0x98, 0x92, 0x93, 0xc4, 0x5c, 0x34, 0x97, 0xed, 0xa2, 0x79, 0xc9, 0x45, 0x93, 0x3f, 0x9c,
|
||||
0x8a, 0x97, 0xf8, 0xe1, 0xf4, 0x21, 0xdc, 0x08, 0x7e, 0xd3, 0x48, 0xee, 0x45, 0xae, 0x60, 0x97,
|
||||
0xb0, 0xf5, 0x05, 0x31, 0x36, 0xec, 0xf3, 0x92, 0x87, 0x6c, 0xf9, 0xa9, 0x0f, 0xd9, 0x8c, 0xd3,
|
||||
0xa9, 0x92, 0x79, 0x3a, 0xdd, 0x0c, 0x7e, 0x5d, 0xc4, 0x6e, 0x6d, 0xdf, 0xe4, 0x02, 0x13, 0xd9,
|
||||
0x35, 0x1e, 0x63, 0x16, 0x96, 0x9f, 0x6d, 0x10, 0x7b, 0x16, 0xe7, 0x58, 0xe6, 0xb9, 0x54, 0xcc,
|
||||
0x3c, 0x97, 0x58, 0xd9, 0x38, 0x81, 0x0c, 0xc7, 0xcd, 0x09, 0x88, 0x29, 0x39, 0xf0, 0x72, 0x02,
|
||||
0xb7, 0x2b, 0xa3, 0xa4, 0x7e, 0x13, 0xfe, 0x4d, 0x4b, 0x4b, 0x80, 0x9f, 0x63, 0x20, 0x57, 0x7f,
|
||||
0x1e, 0x2e, 0x2d, 0x2d, 0x9f, 0x9e, 0x7e, 0x69, 0xef, 0x40, 0x99, 0x45, 0x3e, 0xb1, 0xa2, 0x8c,
|
||||
0xd0, 0x17, 0x60, 0x40, 0x42, 0x9f, 0x18, 0x92, 0x88, 0x7a, 0x32, 0xd7, 0xb3, 0x8d, 0x7a, 0x2b,
|
||||
0xb0, 0x9c, 0x8a, 0x0b, 0xb7, 0xa1, 0xaf, 0x15, 0x40, 0x9c, 0x2e, 0x97, 0x21, 0x2e, 0xb4, 0x9e,
|
||||
0x2d, 0x68, 0xb2, 0xb2, 0x82, 0x7e, 0x79, 0x23, 0x6a, 0xb0, 0x11, 0x41, 0xaa, 0x13, 0x54, 0x1e,
|
||||
0xf2, 0x52, 0xe5, 0x41, 0xfd, 0x3c, 0x48, 0x64, 0x22, 0xf5, 0x82, 0xfb, 0xd1, 0x7a, 0x41, 0x72,
|
||||
0x9a, 0xcb, 0x14, 0x0c, 0xc2, 0x7c, 0x2b, 0x28, 0x18, 0xc8, 0x6e, 0xa0, 0x5c, 0xde, 0x0d, 0xbe,
|
||||
0x56, 0x82, 0xbf, 0xa4, 0xb1, 0x1f, 0xd7, 0xd3, 0x46, 0xab, 0x19, 0x20, 0xa9, 0xfe, 0x27, 0x7c,
|
||||
0x5c, 0x10, 0xff, 0xc5, 0xfd, 0x5c, 0x53, 0xab, 0xcc, 0x70, 0x97, 0xcf, 0x4e, 0xc3, 0x5f, 0x87,
|
||||
0x82, 0x8d, 0xcf, 0x45, 0x25, 0xe5, 0x02, 0x10, 0x28, 0xdb, 0xc6, 0x6f, 0xe6, 0xa1, 0xb2, 0xcb,
|
||||
0x59, 0xd0, 0x2e, 0xd4, 0xd9, 0xe3, 0x2f, 0xfe, 0x2c, 0x73, 0x25, 0xfe, 0x40, 0x29, 0xf2, 0x1e,
|
||||
0xaf, 0xf3, 0x62, 0x16, 0x99, 0x43, 0xd7, 0x83, 0xea, 0x43, 0xec, 0x73, 0x59, 0x9d, 0x38, 0x73,
|
||||
0x58, 0x5f, 0xec, 0x2c, 0xa7, 0xd2, 0xb8, 0x94, 0x5d, 0xa8, 0x33, 0x87, 0xcb, 0x5a, 0x54, 0x24,
|
||||
0x4c, 0x25, 0x17, 0x15, 0x8b, 0xb0, 0x3b, 0x50, 0x23, 0xc6, 0xcb, 0x68, 0x1e, 0x5a, 0x4e, 0x7b,
|
||||
0x83, 0x25, 0x64, 0xdd, 0x4e, 0x27, 0x72, 0x49, 0x98, 0x64, 0xaf, 0x5c, 0x90, 0xf4, 0x57, 0x12,
|
||||
0xdd, 0x8d, 0x8f, 0x4a, 0xfd, 0x23, 0xda, 0xb9, 0x37, 0x89, 0x8d, 0x4f, 0xf3, 0x3e, 0xd4, 0xe8,
|
||||
0x49, 0xc1, 0xff, 0x46, 0xde, 0x8e, 0x17, 0xd4, 0xe4, 0xfb, 0x4a, 0x67, 0x25, 0x83, 0x1a, 0x62,
|
||||
0xc9, 0x12, 0x07, 0x2e, 0x2c, 0xc1, 0x1e, 0xc9, 0xc3, 0x65, 0x2c, 0xd3, 0x6a, 0xc5, 0x5c, 0xc1,
|
||||
0x5c, 0x56, 0x27, 0xce, 0x9c, 0xae, 0xe0, 0x64, 0xbd, 0x97, 0x6b, 0x84, 0x11, 0x22, 0x1a, 0x49,
|
||||
0xd4, 0x76, 0x3b, 0xb7, 0xd3, 0x89, 0x5c, 0xd2, 0x17, 0x30, 0x2f, 0x1d, 0xaa, 0x7c, 0x5d, 0x6a,
|
||||
0x2a, 0x24, 0x51, 0xa3, 0xb9, 0x73, 0x21, 0x0f, 0x97, 0xae, 0x03, 0x92, 0xe3, 0x3f, 0x17, 0x9f,
|
||||
0x18, 0x9a, 0x72, 0x76, 0x76, 0x5e, 0xbe, 0x98, 0x29, 0xd4, 0x0e, 0x9d, 0x57, 0xd4, 0x1f, 0x56,
|
||||
0x12, 0xce, 0x1b, 0xd1, 0xf5, 0x8b, 0x59, 0x64, 0x2e, 0xee, 0x00, 0xe6, 0x98, 0xbe, 0x84, 0xbc,
|
||||
0xe4, 0x80, 0xa8, 0xba, 0x57, 0x33, 0xe9, 0x21, 0xbe, 0x61, 0x0e, 0x25, 0xa4, 0x26, 0x0f, 0xf5,
|
||||
0x44, 0x06, 0x2a, 0xe3, 0x9b, 0x99, 0x8b, 0x11, 0x7c, 0x25, 0xd8, 0x85, 0xf8, 0x3b, 0xe9, 0xbb,
|
||||
0xcc, 0xc4, 0xf7, 0x82, 0xe4, 0xea, 0x08, 0x16, 0x64, 0xdc, 0xc5, 0x0c, 0xc9, 0xc1, 0x69, 0x2a,
|
||||
0xbc, 0x3b, 0x81, 0x8b, 0xcf, 0xf1, 0x01, 0xd4, 0xe5, 0x27, 0x1a, 0xb2, 0xbb, 0x26, 0x73, 0x84,
|
||||
0xce, 0x4a, 0x06, 0x95, 0x0b, 0xfb, 0x04, 0x9a, 0xe2, 0x3c, 0x12, 0x8b, 0x5d, 0x4b, 0x8c, 0x88,
|
||||
0x9d, 0x9f, 0x9d, 0x97, 0x2e, 0xe0, 0xe0, 0x72, 0x3f, 0x85, 0x16, 0x0b, 0xd5, 0x9c, 0x61, 0x7f,
|
||||
0x60, 0xa6, 0x08, 0x8e, 0xbd, 0xae, 0x4c, 0x11, 0x9c, 0x78, 0x5e, 0xf8, 0x7d, 0x68, 0x45, 0x4c,
|
||||
0x8e, 0xf4, 0xbd, 0x74, 0xb1, 0xd5, 0x11, 0xc9, 0xea, 0x04, 0xc3, 0x23, 0x62, 0x0e, 0xa1, 0x21,
|
||||
0x3d, 0xab, 0xa2, 0xef, 0x49, 0x12, 0xa3, 0xa2, 0xef, 0xb9, 0x3a, 0x6b, 0x19, 0x0c, 0xa1, 0x50,
|
||||
0x1d, 0x50, 0x0c, 0x60, 0xd2, 0x7b, 0x67, 0x12, 0xc6, 0x44, 0xf8, 0xcb, 0x13, 0x61, 0xe6, 0x80,
|
||||
0x44, 0x8c, 0x2d, 0x1d, 0x90, 0xf8, 0x03, 0xaf, 0x14, 0x40, 0x92, 0x2f, 0xb4, 0x3e, 0x81, 0xa6,
|
||||
0x6c, 0x69, 0x31, 0x1d, 0xa6, 0xbf, 0x9b, 0x92, 0x75, 0x98, 0xf5, 0xf6, 0xe8, 0x0b, 0x98, 0x8f,
|
||||
0x9e, 0x44, 0xa4, 0x33, 0xb2, 0xa0, 0xf4, 0xf7, 0x3d, 0x51, 0x27, 0xcf, 0x78, 0xa7, 0x43, 0x4e,
|
||||
0x33, 0xe9, 0x45, 0x8e, 0xec, 0x1e, 0xc9, 0xe7, 0x3b, 0xb2, 0x7b, 0xa4, 0x3c, 0xe3, 0xd9, 0x2a,
|
||||
0x7c, 0x9e, 0x1b, 0x1d, 0x1d, 0x95, 0xe8, 0x85, 0xfb, 0xcd, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff,
|
||||
0x91, 0xea, 0xb2, 0xa0, 0xd3, 0x32, 0x00, 0x00,
|
||||
// 3008 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4b, 0x6f, 0x24, 0x47,
|
||||
0x39, 0xf3, 0x1e, 0x7f, 0x33, 0x9e, 0x19, 0x97, 0xbd, 0xde, 0xd9, 0xf1, 0x3a, 0xf6, 0xf6, 0x66,
|
||||
0x37, 0x8e, 0x94, 0xcc, 0x46, 0x0e, 0x48, 0x91, 0x92, 0x48, 0xd8, 0x9e, 0xcd, 0x7a, 0x92, 0xf5,
|
||||
0x23, 0xed, 0xbc, 0x88, 0x82, 0x5a, 0x6d, 0x77, 0xd9, 0x6e, 0x76, 0xa6, 0x7b, 0xe8, 0xee, 0x59,
|
||||
0xbc, 0x39, 0x71, 0x40, 0x42, 0x28, 0x1c, 0x38, 0x72, 0xca, 0x05, 0x71, 0xe2, 0x17, 0x44, 0x42,
|
||||
0x5c, 0x41, 0x08, 0x71, 0x08, 0x37, 0x90, 0x02, 0xbf, 0x80, 0x0b, 0x67, 0x24, 0x54, 0xaf, 0xee,
|
||||
0xea, 0xd7, 0x3c, 0xec, 0xf1, 0x4a, 0xb9, 0x75, 0x7f, 0xdf, 0x57, 0x5f, 0x55, 0x7d, 0xef, 0xfa,
|
||||
0xaa, 0xa0, 0xd6, 0xc7, 0x9e, 0x6e, 0x5a, 0xa7, 0x76, 0x7b, 0xe0, 0xd8, 0x9e, 0x8d, 0xca, 0xe2,
|
||||
0xbf, 0xd5, 0xc0, 0xd6, 0x89, 0xf3, 0x6c, 0xe0, 0x99, 0xb6, 0xc5, 0x70, 0x2d, 0x38, 0xb3, 0xcf,
|
||||
0x38, 0x5d, 0x6b, 0xed, 0xcc, 0xb6, 0xcf, 0x7a, 0xf8, 0x01, 0xfd, 0x3b, 0x1e, 0x9e, 0x3e, 0xf0,
|
||||
0xcc, 0x3e, 0x76, 0x3d, 0xbd, 0x3f, 0x10, 0xc4, 0x96, 0x6d, 0x60, 0xfe, 0x5d, 0x1f, 0xd8, 0xa6,
|
||||
0xe5, 0x61, 0xc7, 0x38, 0xe6, 0x80, 0xaa, 0xed, 0x18, 0xd8, 0x71, 0xd9, 0x9f, 0xf2, 0xfb, 0x1c,
|
||||
0x14, 0xb7, 0x87, 0x27, 0x4f, 0xb0, 0x87, 0x10, 0xe4, 0x2d, 0xbd, 0x8f, 0x9b, 0x99, 0xf5, 0xcc,
|
||||
0x46, 0x55, 0xa5, 0xdf, 0xe8, 0x4d, 0xa8, 0x0c, 0x74, 0xef, 0x5c, 0x3b, 0x31, 0x07, 0xe7, 0xd8,
|
||||
0x69, 0x66, 0xd7, 0x33, 0x1b, 0xb5, 0xcd, 0x9b, 0x6d, 0x69, 0x79, 0x3b, 0x14, 0x73, 0x34, 0x34,
|
||||
0x3d, 0xac, 0x02, 0xa1, 0x65, 0x00, 0xb4, 0x03, 0x70, 0xe2, 0x60, 0xdd, 0xc3, 0x86, 0xa6, 0x7b,
|
||||
0xcd, 0xdc, 0x7a, 0x66, 0xa3, 0xb2, 0xd9, 0x6a, 0xb3, 0x95, 0xb7, 0xc5, 0xca, 0xdb, 0x1f, 0x8a,
|
||||
0x95, 0x6f, 0x97, 0xff, 0xfc, 0xed, 0xda, 0x0b, 0xbf, 0xfe, 0xd7, 0x5a, 0x46, 0x9d, 0xe3, 0xe3,
|
||||
0xb6, 0x3c, 0xf4, 0x3a, 0x2c, 0x19, 0xf8, 0x54, 0x1f, 0xf6, 0x3c, 0xcd, 0xc5, 0x67, 0x7d, 0x6c,
|
||||
0x79, 0x9a, 0x6b, 0x7e, 0x81, 0x9b, 0xf9, 0xf5, 0xcc, 0x46, 0x4e, 0x45, 0x1c, 0x77, 0xc4, 0x50,
|
||||
0x47, 0xe6, 0x17, 0x18, 0x7d, 0x02, 0xb7, 0xc4, 0x08, 0x07, 0x1b, 0x43, 0xcb, 0xd0, 0xad, 0x93,
|
||||
0x67, 0x9a, 0x7b, 0x72, 0x8e, 0xfb, 0xb8, 0x59, 0xa0, 0xab, 0x58, 0x69, 0x07, 0x22, 0x51, 0x7d,
|
||||
0x9a, 0x23, 0x4a, 0xa2, 0xde, 0xe4, 0xa3, 0xa3, 0x08, 0x64, 0xc0, 0xaa, 0x60, 0x1c, 0xec, 0x5e,
|
||||
0x1b, 0xe8, 0x8e, 0xde, 0xc7, 0x1e, 0x76, 0xdc, 0x66, 0x91, 0x32, 0x5f, 0x97, 0x65, 0xf3, 0xd0,
|
||||
0xff, 0x3c, 0xf4, 0xe9, 0xd4, 0x15, 0xce, 0x26, 0x09, 0x89, 0x56, 0x01, 0x06, 0xba, 0xe3, 0x59,
|
||||
0xd8, 0xd1, 0x4c, 0xa3, 0x59, 0xa2, 0x9a, 0x98, 0xe3, 0x90, 0xae, 0xa1, 0x98, 0x50, 0x63, 0xca,
|
||||
0x7a, 0x6c, 0xba, 0x5e, 0xd7, 0xc3, 0xfd, 0x44, 0xa5, 0x85, 0x45, 0x9f, 0xbd, 0x94, 0xe8, 0x95,
|
||||
0xff, 0x66, 0x61, 0x91, 0xcd, 0xb5, 0x43, 0x61, 0x2a, 0xfe, 0xc9, 0x10, 0xbb, 0xb3, 0xb6, 0x92,
|
||||
0x34, 0x05, 0xe7, 0x2e, 0xa7, 0xe0, 0xfc, 0x75, 0x2a, 0xb8, 0x30, 0x7b, 0x05, 0x17, 0xa3, 0x0a,
|
||||
0xfe, 0x01, 0x2c, 0x85, 0x85, 0xee, 0x0e, 0x6c, 0xcb, 0xc5, 0x68, 0x03, 0x8a, 0xc7, 0x14, 0x4e,
|
||||
0xe5, 0x5e, 0xd9, 0x6c, 0xb4, 0xfd, 0xd8, 0xc1, 0xe8, 0x55, 0x8e, 0x57, 0xee, 0x43, 0x83, 0x41,
|
||||
0x1e, 0x61, 0x6f, 0x84, 0xce, 0x94, 0x77, 0x60, 0x41, 0xa2, 0x9b, 0x7a, 0x9a, 0x57, 0x84, 0x75,
|
||||
0x74, 0x70, 0x0f, 0x8f, 0xb4, 0x0e, 0x65, 0x59, 0xec, 0x49, 0x90, 0xb2, 0xc9, 0x14, 0x4d, 0xac,
|
||||
0x80, 0x18, 0xb3, 0x60, 0xb0, 0x0c, 0xc5, 0x93, 0xa1, 0xe3, 0xda, 0x0e, 0x67, 0xc1, 0xff, 0xd0,
|
||||
0x12, 0x14, 0x7a, 0x66, 0xdf, 0x64, 0xe6, 0x5c, 0x50, 0xd9, 0x0f, 0xba, 0x0d, 0x73, 0x86, 0xe9,
|
||||
0xe0, 0x13, 0x22, 0x64, 0x6a, 0x33, 0x05, 0x35, 0x00, 0x28, 0x9f, 0x02, 0x92, 0x27, 0xe0, 0x7b,
|
||||
0x6c, 0x43, 0xc1, 0xf4, 0x70, 0xdf, 0x6d, 0x66, 0xd6, 0x73, 0x1b, 0x95, 0xcd, 0x66, 0x74, 0x8b,
|
||||
0xc2, 0xb5, 0x54, 0x46, 0x46, 0xb6, 0xd4, 0xb7, 0x1d, 0x4c, 0x27, 0x2e, 0xab, 0xf4, 0x5b, 0xf9,
|
||||
0x14, 0x56, 0x18, 0xf1, 0x11, 0xf6, 0xb6, 0x3c, 0xcf, 0x31, 0x8f, 0x87, 0x64, 0xc6, 0x51, 0x3e,
|
||||
0x72, 0x0f, 0x6a, 0x7a, 0x40, 0x49, 0x94, 0x9f, 0xa5, 0xd8, 0x79, 0x09, 0xda, 0x35, 0x94, 0x17,
|
||||
0xe1, 0x76, 0x32, 0x67, 0x2e, 0xb4, 0x9f, 0x67, 0x60, 0x71, 0xcb, 0x30, 0x1c, 0xec, 0xba, 0xd8,
|
||||
0x38, 0x20, 0x91, 0xfc, 0x31, 0x95, 0xc4, 0x86, 0x90, 0x0f, 0x53, 0x1c, 0x6a, 0xf3, 0x28, 0x1f,
|
||||
0x90, 0x08, 0x99, 0xed, 0xc0, 0x92, 0xeb, 0xd9, 0x8e, 0x7e, 0x86, 0x35, 0x92, 0x26, 0x34, 0x9d,
|
||||
0x71, 0xe3, 0x71, 0x62, 0xa1, 0x4d, 0x73, 0xc7, 0xbe, 0x6d, 0x60, 0x3e, 0x8d, 0x8a, 0x38, 0xb9,
|
||||
0x04, 0x53, 0xbe, 0xca, 0xc2, 0x32, 0xf7, 0xca, 0x4f, 0x1c, 0xd3, 0xd7, 0xff, 0x41, 0xcf, 0x20,
|
||||
0x1a, 0x94, 0x6c, 0xa8, 0x2a, 0x2c, 0x86, 0x08, 0x85, 0x38, 0x3e, 0xdf, 0x36, 0xfd, 0x46, 0x4d,
|
||||
0x28, 0x71, 0xb7, 0xe7, 0x1e, 0x2f, 0x7e, 0xd1, 0x5b, 0x00, 0x81, 0x7b, 0x4f, 0xe2, 0xd7, 0x12,
|
||||
0x39, 0x7a, 0x0b, 0x5a, 0x7d, 0xfd, 0x42, 0xb8, 0x31, 0x36, 0xc2, 0xb1, 0xa5, 0x40, 0x67, 0xba,
|
||||
0xd9, 0xd7, 0x2f, 0x1e, 0x0a, 0x02, 0x39, 0xc0, 0x74, 0x00, 0xf0, 0xc5, 0xc0, 0x74, 0x74, 0x6a,
|
||||
0x54, 0xc5, 0x29, 0xa2, 0xa7, 0x34, 0x4e, 0xf9, 0x26, 0x03, 0x37, 0xc3, 0x02, 0x62, 0x0a, 0x24,
|
||||
0x12, 0xda, 0x85, 0x86, 0x2e, 0x54, 0xa8, 0x51, 0xa5, 0x08, 0x63, 0x5c, 0x0d, 0x8c, 0x31, 0x41,
|
||||
0xc9, 0x6a, 0xdd, 0x1f, 0x46, 0xff, 0x5d, 0xf4, 0x06, 0xcc, 0x3b, 0xb6, 0xed, 0x69, 0x03, 0x13,
|
||||
0x9f, 0x60, 0xdf, 0xa6, 0xb6, 0xeb, 0x64, 0x49, 0xff, 0xf8, 0x76, 0xad, 0x74, 0x48, 0xe0, 0xdd,
|
||||
0x8e, 0x5a, 0x21, 0x54, 0xec, 0xc7, 0xa0, 0xd1, 0xda, 0x31, 0x9f, 0xea, 0x1e, 0xd6, 0x9e, 0xe0,
|
||||
0x67, 0x54, 0xf0, 0xd5, 0xed, 0x9b, 0x7c, 0x48, 0x9d, 0x52, 0x1d, 0x32, 0xfc, 0xfb, 0xf8, 0x99,
|
||||
0x0a, 0x03, 0xff, 0x5b, 0xf9, 0x4b, 0xb0, 0xa9, 0x1d, 0xbb, 0x4f, 0x56, 0x34, 0x6b, 0xb5, 0xbf,
|
||||
0x0a, 0x25, 0xae, 0x63, 0xae, 0x73, 0x24, 0xe9, 0xfc, 0x90, 0x7d, 0xa9, 0x82, 0x04, 0xbd, 0x05,
|
||||
0x75, 0xdb, 0x31, 0xcf, 0x4c, 0x4b, 0xef, 0x09, 0x39, 0x16, 0xa8, 0x1c, 0x93, 0xcc, 0xbf, 0x26,
|
||||
0x48, 0x99, 0xec, 0x94, 0x5d, 0x68, 0x46, 0xf6, 0x12, 0x68, 0x48, 0x5a, 0x46, 0x66, 0xec, 0x32,
|
||||
0x14, 0x1d, 0x6e, 0x71, 0x4e, 0x1d, 0xfb, 0xa7, 0x56, 0xcf, 0xd6, 0x8d, 0x59, 0xcb, 0x45, 0xf9,
|
||||
0x5b, 0x06, 0x5a, 0xb1, 0x39, 0xae, 0xc3, 0xa2, 0xa4, 0x9d, 0x67, 0xc7, 0x2b, 0xe0, 0xf2, 0xa6,
|
||||
0xf4, 0x23, 0xb8, 0xc1, 0xf7, 0xd3, 0xb5, 0x4e, 0xed, 0x99, 0xcb, 0xeb, 0x5d, 0x3f, 0x3c, 0x31,
|
||||
0xf6, 0x89, 0xaa, 0x1d, 0xbf, 0x41, 0x45, 0xf3, 0x0d, 0x3e, 0x94, 0xe7, 0x66, 0xb7, 0xd0, 0xaf,
|
||||
0x32, 0xbe, 0x19, 0x86, 0xd3, 0xe3, 0x6c, 0xd5, 0x1a, 0x51, 0x54, 0x76, 0x72, 0x45, 0xfd, 0x33,
|
||||
0x03, 0xcb, 0x24, 0x25, 0xf2, 0x45, 0xba, 0x13, 0x48, 0x60, 0x19, 0x8a, 0x03, 0x07, 0x9f, 0x9a,
|
||||
0x17, 0x5c, 0x06, 0xfc, 0x0f, 0xad, 0x41, 0xc5, 0xf5, 0x74, 0xc7, 0xd3, 0xf4, 0x53, 0x22, 0x7e,
|
||||
0x6a, 0x2d, 0x2a, 0x50, 0xd0, 0x16, 0x81, 0x90, 0xe2, 0x08, 0x5b, 0x86, 0x76, 0x8c, 0x4f, 0x49,
|
||||
0xc2, 0xcd, 0xb3, 0xe2, 0x08, 0x5b, 0xc6, 0x36, 0x05, 0x90, 0x6c, 0xef, 0x60, 0x52, 0x0f, 0x98,
|
||||
0x4f, 0x59, 0x14, 0x2f, 0xab, 0x01, 0x20, 0xa8, 0x10, 0x8a, 0x72, 0x85, 0xb0, 0x0a, 0x40, 0x24,
|
||||
0xa5, 0x9d, 0xf6, 0xf4, 0x33, 0x97, 0x16, 0xd4, 0x25, 0x75, 0x8e, 0x40, 0xde, 0x25, 0x00, 0x1a,
|
||||
0xa6, 0xc3, 0xbb, 0x0b, 0xa4, 0xff, 0x76, 0xb8, 0x50, 0xb8, 0x1f, 0x88, 0x3c, 0x65, 0x44, 0x7b,
|
||||
0x4c, 0xd9, 0xd0, 0xc2, 0x90, 0x17, 0x45, 0x3b, 0x35, 0x91, 0x8c, 0x64, 0x22, 0xd3, 0x39, 0xde,
|
||||
0x0a, 0xcc, 0x99, 0xae, 0xc6, 0xa5, 0x9c, 0xa3, 0x53, 0x94, 0x4d, 0xf7, 0x90, 0xfe, 0x2b, 0x9f,
|
||||
0x11, 0x93, 0x4a, 0xa8, 0x4b, 0xc8, 0xa6, 0xd6, 0xa0, 0xc2, 0xb4, 0xa4, 0x49, 0x15, 0x0a, 0x30,
|
||||
0xd0, 0x3e, 0xa9, 0x53, 0xc2, 0x05, 0x6a, 0x36, 0x5a, 0xa0, 0xae, 0x90, 0x58, 0x97, 0x54, 0x99,
|
||||
0x1c, 0xf4, 0x0c, 0x65, 0x09, 0xd0, 0xa1, 0x63, 0xff, 0x18, 0x9f, 0xc8, 0x4e, 0xad, 0xbc, 0x09,
|
||||
0x8b, 0x21, 0x28, 0xaf, 0xc3, 0xee, 0x40, 0x75, 0xc0, 0xc0, 0x9a, 0xab, 0xf7, 0x84, 0x0d, 0x55,
|
||||
0x38, 0xec, 0x48, 0xef, 0x79, 0xca, 0x2f, 0x4b, 0x50, 0x3c, 0x38, 0x26, 0xbf, 0xa9, 0xb6, 0x76,
|
||||
0x0f, 0x6a, 0x41, 0x9a, 0x97, 0xfc, 0x6e, 0xde, 0x87, 0x1e, 0x72, 0x07, 0x7c, 0x8a, 0x1d, 0x37,
|
||||
0x28, 0x13, 0xc5, 0x2f, 0x7a, 0x00, 0x45, 0xd7, 0xd3, 0xbd, 0xa1, 0x4b, 0xed, 0x8d, 0x1c, 0x5b,
|
||||
0x7c, 0x35, 0xb3, 0xa9, 0xdb, 0x47, 0x14, 0xad, 0x72, 0x32, 0xf4, 0x1a, 0xcc, 0xb9, 0x9e, 0x83,
|
||||
0xf5, 0x3e, 0x91, 0x4f, 0x81, 0x3a, 0x52, 0x83, 0x3b, 0x52, 0xf9, 0x88, 0x22, 0xba, 0x1d, 0xb5,
|
||||
0xcc, 0x48, 0xba, 0x46, 0xe4, 0x30, 0x56, 0xbc, 0xdc, 0x39, 0x78, 0x8b, 0xcc, 0x49, 0x66, 0x27,
|
||||
0x3c, 0x4a, 0x53, 0xf0, 0x28, 0xb3, 0x61, 0x5b, 0xa4, 0xec, 0x63, 0xe5, 0x09, 0xa6, 0x3c, 0xca,
|
||||
0xd3, 0xac, 0x83, 0x8f, 0xdb, 0xf2, 0xd0, 0x23, 0x68, 0x06, 0xd2, 0x26, 0x72, 0x32, 0x74, 0x4f,
|
||||
0xd7, 0x2c, 0xdb, 0x3a, 0xc1, 0xcd, 0x39, 0x2a, 0x8a, 0x79, 0x2e, 0x8a, 0xc2, 0x3e, 0x01, 0xaa,
|
||||
0xcb, 0x3e, 0xf9, 0x1e, 0xa7, 0xa6, 0x70, 0xf4, 0x1a, 0xa0, 0x38, 0xa3, 0x26, 0x50, 0xd5, 0x2d,
|
||||
0xc4, 0xc6, 0xa0, 0x57, 0x01, 0x9d, 0x9a, 0x17, 0xd1, 0x42, 0xae, 0x42, 0x43, 0x69, 0x83, 0x62,
|
||||
0xe4, 0x0a, 0x6e, 0x17, 0x16, 0xe2, 0x47, 0xc3, 0xea, 0xf8, 0x12, 0xb2, 0xe1, 0x44, 0xcf, 0x84,
|
||||
0x1f, 0xc1, 0x8d, 0xe4, 0xb3, 0xe0, 0xfc, 0x84, 0x67, 0xc1, 0x25, 0x9c, 0x72, 0x08, 0xf4, 0x6c,
|
||||
0x4f, 0xef, 0xb1, 0x6d, 0xd4, 0xe8, 0x36, 0xe6, 0x28, 0x84, 0xae, 0x7f, 0x0d, 0x2a, 0xa6, 0xd5,
|
||||
0x33, 0x2d, 0xcc, 0xf0, 0x75, 0x8a, 0x07, 0x06, 0x12, 0x04, 0x0e, 0xee, 0xdb, 0x1e, 0x27, 0x68,
|
||||
0x30, 0x02, 0x06, 0x22, 0x04, 0xca, 0x07, 0x50, 0x64, 0x56, 0x8b, 0x2a, 0x50, 0xea, 0xee, 0x7f,
|
||||
0xbc, 0xf5, 0xb8, 0xdb, 0x69, 0xbc, 0x80, 0xe6, 0x61, 0xee, 0xa3, 0xc3, 0xc7, 0x07, 0x5b, 0x9d,
|
||||
0xee, 0xfe, 0xa3, 0x46, 0x06, 0xd5, 0x00, 0x76, 0x0e, 0xf6, 0xf6, 0xba, 0x1f, 0x7e, 0x48, 0xfe,
|
||||
0xb3, 0x04, 0xcd, 0xff, 0x1f, 0x76, 0x1a, 0x39, 0x54, 0x85, 0x72, 0xe7, 0xe1, 0xe3, 0x87, 0x14,
|
||||
0x99, 0x57, 0xfe, 0x9e, 0x05, 0xc4, 0x1c, 0x62, 0x1b, 0x9f, 0x99, 0x96, 0x74, 0x5e, 0xbb, 0x1e,
|
||||
0xbf, 0x0c, 0xdb, 0x6b, 0xfe, 0x72, 0xf6, 0x9a, 0x68, 0x09, 0xa5, 0x99, 0x5a, 0x42, 0xf9, 0x2a,
|
||||
0x96, 0xa0, 0xfc, 0x31, 0x0b, 0x8b, 0x21, 0xa9, 0xf2, 0xe0, 0x78, 0x6d, 0x62, 0x0d, 0x45, 0xaf,
|
||||
0xfc, 0xd8, 0xe8, 0x95, 0x28, 0xc0, 0xc2, 0x4c, 0x05, 0x58, 0xbc, 0x92, 0x00, 0xff, 0x90, 0x11,
|
||||
0x02, 0x0c, 0x9d, 0x48, 0xc2, 0xfb, 0xcc, 0x8c, 0xdd, 0xe7, 0xa8, 0xc0, 0x96, 0xbd, 0x7a, 0x60,
|
||||
0xcb, 0xa5, 0x04, 0x36, 0x65, 0x19, 0x96, 0xc2, 0xab, 0xe7, 0xc7, 0xfc, 0x27, 0xd0, 0x60, 0x70,
|
||||
0xa9, 0x8b, 0x73, 0x5d, 0x36, 0xa1, 0xbc, 0x03, 0x0b, 0xd2, 0x64, 0x41, 0x2b, 0xc8, 0xa6, 0xc0,
|
||||
0x78, 0x2b, 0x88, 0x11, 0xab, 0x1c, 0xaf, 0xfc, 0x2c, 0x2b, 0xc6, 0x47, 0x1a, 0x39, 0x89, 0xab,
|
||||
0x7d, 0x05, 0x1a, 0xd2, 0x6a, 0xe5, 0x32, 0xb1, 0x1e, 0xac, 0x97, 0xd5, 0x8b, 0x21, 0x52, 0xde,
|
||||
0x15, 0xca, 0x45, 0x48, 0x77, 0x58, 0x7b, 0x28, 0x54, 0x1a, 0xe6, 0x53, 0x4b, 0xc3, 0x82, 0x5c,
|
||||
0x1a, 0x76, 0xa1, 0xce, 0x76, 0xa0, 0x99, 0xd6, 0x49, 0x6f, 0x68, 0xe0, 0xc0, 0x16, 0x23, 0x5b,
|
||||
0x15, 0x2d, 0xa1, 0x2e, 0xa7, 0x53, 0x6b, 0x6c, 0xa0, 0xf8, 0x57, 0x3e, 0x15, 0xb1, 0x71, 0xc2,
|
||||
0x4e, 0x53, 0x98, 0xed, 0xa8, 0x4e, 0xd3, 0x9f, 0x72, 0x50, 0x0b, 0x53, 0x27, 0xe8, 0x3b, 0x33,
|
||||
0x46, 0xdf, 0xd9, 0xb4, 0x92, 0x27, 0x37, 0x59, 0xc9, 0x13, 0xae, 0x61, 0xf2, 0x33, 0xa8, 0x61,
|
||||
0x0a, 0x33, 0xa8, 0x61, 0x8a, 0xb3, 0xaf, 0x61, 0x4a, 0x57, 0x77, 0xf5, 0x72, 0x9a, 0xab, 0x7f,
|
||||
0x0f, 0x96, 0x93, 0xad, 0x09, 0xb5, 0xa0, 0xec, 0x0f, 0xcf, 0xb0, 0x5a, 0x5e, 0xfc, 0x2b, 0x2e,
|
||||
0x34, 0xa5, 0xfc, 0x10, 0x6e, 0xb6, 0x5e, 0x5b, 0x40, 0x78, 0x0f, 0x6e, 0x25, 0x4c, 0xca, 0xad,
|
||||
0x7a, 0xba, 0xc8, 0x1a, 0xf0, 0x7a, 0xd7, 0xb4, 0x4c, 0xf7, 0x3c, 0xbc, 0x83, 0x29, 0x79, 0xdd,
|
||||
0x86, 0x56, 0x12, 0x2f, 0x1e, 0x33, 0xff, 0x93, 0x85, 0xca, 0x91, 0xee, 0x89, 0x71, 0xd7, 0x97,
|
||||
0x43, 0xaf, 0xd4, 0x9b, 0xec, 0xc2, 0x3c, 0xf5, 0x09, 0x92, 0x05, 0x0d, 0xdd, 0xc3, 0x53, 0xb9,
|
||||
0x42, 0x55, 0x0c, 0xed, 0xe8, 0x1e, 0x46, 0x7b, 0x50, 0x0f, 0x3a, 0x8e, 0x8c, 0xd9, 0x34, 0x3e,
|
||||
0x51, 0x0b, 0x06, 0x53, 0x76, 0x0f, 0x60, 0xd1, 0xd5, 0x3d, 0xdc, 0xeb, 0x99, 0xb4, 0xb0, 0x3c,
|
||||
0xb3, 0x74, 0x6f, 0xe8, 0xf0, 0xba, 0x5e, 0x45, 0x3e, 0xea, 0x48, 0x60, 0x94, 0x7f, 0x67, 0xa1,
|
||||
0xc4, 0xeb, 0xee, 0x69, 0xf3, 0xed, 0xf7, 0xa1, 0x3c, 0xb0, 0x5d, 0xd3, 0x13, 0xd1, 0xa9, 0xb2,
|
||||
0x79, 0x2b, 0x08, 0x42, 0x9c, 0xe7, 0x21, 0x27, 0x50, 0x7d, 0x52, 0xf4, 0x0e, 0x2c, 0x06, 0xaa,
|
||||
0x7b, 0x82, 0x9f, 0x71, 0xb7, 0xcd, 0x25, 0xb9, 0x6d, 0xe0, 0x82, 0xef, 0xe3, 0x67, 0xcc, 0x63,
|
||||
0xef, 0xc2, 0x7c, 0x68, 0x38, 0x6f, 0x31, 0x54, 0x65, 0x4a, 0xd4, 0x86, 0x45, 0x52, 0x55, 0x4b,
|
||||
0xdd, 0x63, 0xea, 0x98, 0xac, 0x6b, 0xbc, 0x40, 0x50, 0x7e, 0xdb, 0xb8, 0x43, 0xce, 0x26, 0x9b,
|
||||
0x7e, 0x61, 0x83, 0x0d, 0x8d, 0xd7, 0xed, 0x74, 0x04, 0xbb, 0xdc, 0x09, 0x16, 0xdc, 0xa5, 0x38,
|
||||
0x3a, 0xe6, 0x65, 0x28, 0xd2, 0x96, 0xad, 0xdb, 0x2c, 0xd1, 0xd4, 0x50, 0x0f, 0x36, 0x4f, 0x7b,
|
||||
0x31, 0x2a, 0x47, 0x2b, 0xbb, 0x50, 0xa0, 0x00, 0x72, 0xe0, 0x67, 0x4d, 0x5e, 0x6b, 0xd8, 0xa7,
|
||||
0xf2, 0x2d, 0xa8, 0x65, 0x0a, 0xd8, 0x1f, 0xf6, 0x91, 0x02, 0x79, 0xcb, 0x36, 0x44, 0xa5, 0x52,
|
||||
0xe3, 0x72, 0x28, 0xee, 0xdb, 0x06, 0xee, 0x76, 0x54, 0x8a, 0x53, 0x76, 0xa1, 0x1e, 0x91, 0x2b,
|
||||
0x39, 0x46, 0x90, 0x83, 0x3d, 0x61, 0x79, 0xcc, 0x3b, 0x9d, 0x05, 0x95, 0x9e, 0xfe, 0xf7, 0x29,
|
||||
0x84, 0xe4, 0x4d, 0xd3, 0x32, 0xf0, 0x85, 0xb8, 0x74, 0xa1, 0x3f, 0xca, 0x6f, 0x33, 0xb0, 0xc8,
|
||||
0x59, 0x85, 0x8e, 0x02, 0xcf, 0xc7, 0x04, 0xee, 0x43, 0xbd, 0xaf, 0x5f, 0x68, 0xb4, 0xbf, 0xcb,
|
||||
0x7a, 0x62, 0xbc, 0xa5, 0x36, 0xdf, 0xd7, 0x2f, 0x82, 0x16, 0x98, 0xf2, 0xd7, 0x0c, 0x2c, 0x85,
|
||||
0x57, 0xc9, 0xe3, 0xd7, 0xeb, 0x00, 0xe2, 0x14, 0xe9, 0xaf, 0x73, 0x81, 0xaf, 0x73, 0x4e, 0x34,
|
||||
0x0d, 0x3b, 0xea, 0x1c, 0x27, 0xea, 0x26, 0xb7, 0xe1, 0xb2, 0xb3, 0x68, 0xc3, 0x4d, 0xd1, 0x2f,
|
||||
0xfd, 0x5d, 0xd6, 0xdf, 0x4e, 0xb8, 0xd0, 0x9d, 0x7e, 0x3b, 0x29, 0x4e, 0x94, 0xbd, 0xac, 0x13,
|
||||
0xe5, 0x26, 0x77, 0xa2, 0x7c, 0x9a, 0x13, 0x3d, 0x82, 0xf9, 0xe1, 0xa0, 0x67, 0xeb, 0x86, 0xe6,
|
||||
0x60, 0x77, 0xd8, 0xf3, 0x78, 0x1f, 0x5f, 0x89, 0x5b, 0x04, 0x91, 0xd1, 0x47, 0x03, 0xde, 0x00,
|
||||
0x1f, 0xf6, 0x3c, 0xb5, 0x3a, 0x94, 0xfe, 0x94, 0x5f, 0x04, 0xfd, 0xd4, 0x18, 0xe9, 0x68, 0x27,
|
||||
0x7a, 0x19, 0x4a, 0xf4, 0x3e, 0xcc, 0xbf, 0x45, 0x89, 0xfa, 0x51, 0x91, 0xa0, 0xbb, 0x06, 0xba,
|
||||
0x07, 0xf9, 0x73, 0xdd, 0x3d, 0xe7, 0x6f, 0x1a, 0x16, 0xc4, 0x55, 0x03, 0x9d, 0x6e, 0x57, 0x77,
|
||||
0xcf, 0x55, 0x8a, 0x56, 0xfe, 0x97, 0x85, 0x2a, 0x49, 0x47, 0x42, 0x05, 0x68, 0x33, 0xea, 0x1f,
|
||||
0x95, 0xcd, 0x1b, 0xd2, 0xfe, 0x82, 0xcc, 0x25, 0x39, 0x49, 0xc4, 0x45, 0xb3, 0xe9, 0x2e, 0x9a,
|
||||
0x93, 0x5c, 0x34, 0x7e, 0x2f, 0x54, 0x98, 0xe0, 0x5e, 0xe8, 0x03, 0xb8, 0xe1, 0xdf, 0xa6, 0x48,
|
||||
0xee, 0x45, 0xaa, 0xe2, 0x09, 0x6c, 0x7d, 0x51, 0x8c, 0x0d, 0x60, 0x6e, 0x3c, 0xd9, 0x95, 0x2e,
|
||||
0x9d, 0xec, 0x52, 0xb2, 0x53, 0x39, 0x35, 0x3b, 0xdd, 0xf4, 0x6f, 0x18, 0x22, 0x67, 0xab, 0xdf,
|
||||
0x64, 0x7d, 0x13, 0xd9, 0xd3, 0x9f, 0x60, 0x16, 0x96, 0x9f, 0x6f, 0x10, 0x7b, 0x1e, 0x79, 0x2c,
|
||||
0x35, 0x2f, 0x15, 0x52, 0xf3, 0x12, 0xeb, 0xee, 0xc6, 0x24, 0xc3, 0xe5, 0x66, 0xfb, 0xc8, 0x84,
|
||||
0x5a, 0x74, 0x25, 0x26, 0xb7, 0x2b, 0x4b, 0x49, 0xf9, 0x26, 0xb8, 0xf4, 0x4a, 0x2a, 0x44, 0xbf,
|
||||
0x9b, 0x81, 0xfc, 0x57, 0xc1, 0xa6, 0x92, 0x2a, 0xe2, 0xe9, 0x37, 0xf5, 0x36, 0x94, 0x58, 0xcc,
|
||||
0x14, 0x7b, 0x49, 0x09, 0x9a, 0xbe, 0xf4, 0x48, 0xd0, 0x14, 0x43, 0x62, 0xf1, 0x52, 0xa6, 0x7a,
|
||||
0xbe, 0xf1, 0x72, 0x15, 0x56, 0x12, 0xe5, 0xc2, 0xad, 0xef, 0xcb, 0x0c, 0x20, 0x8e, 0x97, 0xdb,
|
||||
0x0c, 0x23, 0xed, 0x6e, 0x1b, 0xea, 0xac, 0x6d, 0xa0, 0x4d, 0x6e, 0x7e, 0x35, 0x36, 0xc2, 0x2f,
|
||||
0x92, 0xfc, 0xde, 0x41, 0x4e, 0xea, 0x1d, 0x28, 0x9f, 0xf9, 0x25, 0x50, 0xe8, 0xc4, 0xff, 0x20,
|
||||
0x7c, 0xe2, 0x8f, 0x4f, 0x33, 0xc9, 0x91, 0x3f, 0xa8, 0xd4, 0xfc, 0x23, 0xbf, 0xec, 0x40, 0x99,
|
||||
0xc9, 0x1d, 0xe8, 0xcb, 0x8c, 0x7f, 0x0d, 0x1a, 0xb9, 0x99, 0x9e, 0x36, 0xce, 0xcd, 0x40, 0x92,
|
||||
0xca, 0xd7, 0xb9, 0xe0, 0x32, 0x35, 0x72, 0x87, 0xfd, 0xdd, 0xf4, 0xe5, 0xf4, 0x10, 0x9b, 0x4f,
|
||||
0x2f, 0xfd, 0xef, 0x40, 0x35, 0xe1, 0x35, 0x4a, 0xc5, 0x95, 0xee, 0x2f, 0x52, 0xb2, 0x43, 0xf1,
|
||||
0xb2, 0xd9, 0xa1, 0x94, 0x90, 0x1d, 0x5e, 0x83, 0xbc, 0x85, 0x2f, 0xc4, 0x45, 0xd0, 0x08, 0x2d,
|
||||
0x52, 0xb2, 0xcd, 0xaf, 0x17, 0xa0, 0xbc, 0xc7, 0x49, 0xd0, 0x1e, 0x54, 0xd9, 0xf3, 0x34, 0xfe,
|
||||
0x70, 0x74, 0x35, 0xfa, 0x84, 0x2a, 0xf4, 0x62, 0xb0, 0xf5, 0x62, 0x1a, 0x9a, 0xeb, 0xbe, 0x03,
|
||||
0x73, 0x8f, 0xb0, 0xc7, 0x79, 0xb5, 0xa2, 0xc4, 0x41, 0x03, 0xb4, 0xb5, 0x92, 0x88, 0xe3, 0x5c,
|
||||
0xf6, 0xa0, 0xca, 0x22, 0x46, 0xda, 0xa2, 0x42, 0x71, 0x36, 0xbe, 0xa8, 0x48, 0x72, 0xd9, 0x85,
|
||||
0x0a, 0xf1, 0x3e, 0x86, 0x73, 0xd1, 0x4a, 0xd2, 0x2b, 0x31, 0xc1, 0xeb, 0x76, 0x32, 0x92, 0x73,
|
||||
0xc2, 0xa4, 0x70, 0xe7, 0x8c, 0xa4, 0x7b, 0x53, 0x74, 0x2f, 0x3a, 0x2a, 0xf1, 0xce, 0xb6, 0x75,
|
||||
0x7f, 0x1c, 0x19, 0x9f, 0xe6, 0x3d, 0xa8, 0xd0, 0x24, 0xc9, 0xef, 0x4b, 0x6f, 0x47, 0x7b, 0x7a,
|
||||
0xf2, 0x51, 0xad, 0xb5, 0x9a, 0x82, 0x0d, 0x64, 0xc9, 0x6a, 0x26, 0xce, 0x2c, 0x46, 0x1e, 0x3a,
|
||||
0x82, 0xc8, 0xb2, 0x4c, 0x6a, 0x66, 0x73, 0x05, 0x73, 0x5e, 0xad, 0x28, 0x71, 0xb2, 0x82, 0xe3,
|
||||
0x0d, 0x69, 0xae, 0x11, 0x86, 0x08, 0x69, 0x24, 0xd6, 0x7c, 0x6e, 0xdd, 0x4e, 0x46, 0x72, 0x4e,
|
||||
0x9f, 0xc3, 0x82, 0x54, 0x4f, 0xf0, 0x75, 0x29, 0x89, 0x22, 0x09, 0x1b, 0xcd, 0xdd, 0x91, 0x34,
|
||||
0x9c, 0xbb, 0x06, 0x48, 0x4e, 0x60, 0x9c, 0x7d, 0x6c, 0x68, 0x42, 0xf2, 0x6f, 0xbd, 0x34, 0x9a,
|
||||
0x28, 0xd0, 0x0e, 0x9d, 0x57, 0xb4, 0x5e, 0x56, 0x63, 0xce, 0x1b, 0xd2, 0xf5, 0x8b, 0x69, 0x68,
|
||||
0xce, 0xee, 0x10, 0xe6, 0x99, 0xbe, 0x04, 0xbf, 0xf8, 0x80, 0xb0, 0xba, 0xd7, 0x52, 0xf1, 0x81,
|
||||
0x7c, 0x83, 0xf2, 0x51, 0x70, 0x8d, 0x57, 0x25, 0xb1, 0xe2, 0x5b, 0x96, 0x6f, 0x6a, 0x19, 0x4a,
|
||||
0xe4, 0x2b, 0x89, 0x5d, 0xb0, 0xbf, 0x9b, 0xbc, 0xcb, 0x54, 0xf9, 0x8e, 0xa8, 0x2b, 0x8f, 0x61,
|
||||
0x51, 0x96, 0xbb, 0x98, 0x21, 0x3e, 0x38, 0x49, 0x85, 0xf7, 0xc6, 0x50, 0xf1, 0x39, 0xde, 0x87,
|
||||
0xaa, 0xfc, 0x88, 0x44, 0x76, 0xd7, 0x78, 0x91, 0xd3, 0x5a, 0x4d, 0xc1, 0x72, 0x66, 0x1f, 0x43,
|
||||
0x5d, 0x24, 0x54, 0xb1, 0xd8, 0xf5, 0xd8, 0x88, 0x48, 0x01, 0xd0, 0xba, 0x33, 0x82, 0x82, 0xf3,
|
||||
0xfd, 0x04, 0x1a, 0x2c, 0x54, 0x73, 0x82, 0x83, 0x9e, 0x91, 0xc0, 0x38, 0xf2, 0xfe, 0x33, 0x81,
|
||||
0x71, 0xec, 0x01, 0xe4, 0x0f, 0xa1, 0x11, 0x32, 0x39, 0x02, 0xbb, 0x33, 0xda, 0xea, 0x08, 0x67,
|
||||
0x65, 0x8c, 0xe1, 0x11, 0x36, 0x47, 0x50, 0x93, 0x1e, 0x7e, 0xd1, 0x17, 0x2f, 0xb1, 0x51, 0xe1,
|
||||
0x17, 0x67, 0xad, 0xf5, 0x14, 0x82, 0x80, 0xa9, 0x06, 0x28, 0x22, 0x60, 0x02, 0xbd, 0x3b, 0x4e,
|
||||
0xc6, 0x84, 0xf9, 0x4b, 0x63, 0xc5, 0xcc, 0x05, 0x12, 0x32, 0xb6, 0x64, 0x81, 0x44, 0x9f, 0xa0,
|
||||
0x25, 0x08, 0x24, 0xfe, 0x86, 0xec, 0x63, 0xa8, 0xcb, 0x96, 0x16, 0xd1, 0x61, 0xf2, 0xcb, 0x2e,
|
||||
0x59, 0x87, 0x69, 0xaf, 0xa3, 0x3e, 0x87, 0x85, 0x70, 0x26, 0x22, 0xc0, 0xd0, 0x82, 0x92, 0x5f,
|
||||
0x20, 0x85, 0x9d, 0x3c, 0xe5, 0x25, 0x11, 0xc9, 0x66, 0xd2, 0x9b, 0x21, 0xd9, 0x3d, 0xe2, 0x0f,
|
||||
0x8c, 0x64, 0xf7, 0x48, 0x78, 0x68, 0xb4, 0x9d, 0xff, 0x2c, 0x3b, 0x38, 0x3e, 0x2e, 0xd2, 0x5e,
|
||||
0xc3, 0x1b, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x61, 0x2a, 0x98, 0xbe, 0x75, 0x33, 0x00, 0x00,
|
||||
}
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
|
@ -258,9 +258,6 @@ message ObjectBeginRequest {
|
||||
|
||||
google.protobuf.Timestamp expires_at = 4 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
|
||||
|
||||
bytes encrypted_metadata_nonce = 5 [(gogoproto.customtype) = "Nonce", (gogoproto.nullable) = false];
|
||||
bytes encrypted_metadata = 6; // TODO: set maximum size limit
|
||||
|
||||
pointerdb.RedundancyScheme redundancy_scheme = 7; // can be zero
|
||||
encryption.EncryptionParameters encryption_parameters = 8; // can be zero
|
||||
}
|
||||
@ -278,6 +275,9 @@ message ObjectBeginResponse {
|
||||
|
||||
message ObjectCommitRequest {
|
||||
bytes stream_id = 1 [(gogoproto.customtype) = "StreamID", (gogoproto.nullable) = false];
|
||||
|
||||
bytes encrypted_metadata_nonce = 2 [(gogoproto.customtype) = "Nonce", (gogoproto.nullable) = false];
|
||||
bytes encrypted_metadata = 3; // TODO: set maximum size limit
|
||||
}
|
||||
|
||||
message ObjectCommitResponse {
|
||||
@ -297,9 +297,12 @@ message ObjectListRequest {
|
||||
bytes bucket = 1;
|
||||
bytes encrypted_prefix = 2;
|
||||
bytes encrypted_cursor = 3;
|
||||
int32 limit = 4;
|
||||
bool recursive = 4;
|
||||
int32 limit = 5;
|
||||
|
||||
ObjectListItemIncludes object_includes = 6;
|
||||
|
||||
|
||||
ObjectListItemIncludes object_includes = 5;
|
||||
}
|
||||
|
||||
message ObjectListResponse {
|
||||
@ -352,9 +355,6 @@ message SatStreamID {
|
||||
google.protobuf.Timestamp creation_date = 5 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
|
||||
google.protobuf.Timestamp expiration_date = 6 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
|
||||
|
||||
bytes encrypted_metadata_nonce = 7 [(gogoproto.customtype) = "Nonce", (gogoproto.nullable) = false];
|
||||
bytes encrypted_metadata = 8;
|
||||
|
||||
bytes satellite_signature = 9;
|
||||
}
|
||||
|
||||
@ -450,8 +450,9 @@ message SegmentBeginDeleteRequest {
|
||||
}
|
||||
|
||||
message SegmentBeginDeleteResponse {
|
||||
bytes segment_id = 1 [(gogoproto.customtype) = "SegmentID", (gogoproto.nullable) = false];
|
||||
repeated AddressedOrderLimit addressed_limits = 2;
|
||||
bytes segment_id = 1 [(gogoproto.customtype) = "SegmentID", (gogoproto.nullable) = false];
|
||||
repeated AddressedOrderLimit addressed_limits = 2;
|
||||
bytes private_key = 3 [(gogoproto.customtype) = "PiecePrivateKey", (gogoproto.nullable) = false];
|
||||
}
|
||||
|
||||
message SegmentFinishDeleteRequest {
|
||||
@ -488,8 +489,15 @@ message SegmentDownloadRequest {
|
||||
}
|
||||
|
||||
message SegmentDownloadResponse {
|
||||
bytes segment_id = 1 [(gogoproto.customtype) = "SegmentID", (gogoproto.nullable) = false];
|
||||
bytes segment_id = 1 [(gogoproto.customtype) = "SegmentID", (gogoproto.nullable) = false];
|
||||
|
||||
repeated AddressedOrderLimit addressed_limits = 2;
|
||||
bytes encrypted_inline_data = 3;
|
||||
SegmentPosition next = 4; // can be nil
|
||||
bytes private_key = 3 [(gogoproto.customtype) = "PiecePrivateKey", (gogoproto.nullable) = false];
|
||||
|
||||
bytes encrypted_inline_data = 4;
|
||||
int64 segment_size = 5;
|
||||
bytes encrypted_key_nonce = 6 [(gogoproto.customtype) = "Nonce", (gogoproto.nullable) = false];
|
||||
bytes encrypted_key = 7;
|
||||
|
||||
SegmentPosition next = 8; // can be nil
|
||||
}
|
@ -34,6 +34,25 @@ type Object struct {
|
||||
Stream
|
||||
}
|
||||
|
||||
// ObjectInfo contains information about a specific object
|
||||
type ObjectInfo struct {
|
||||
Version uint32
|
||||
Bucket string
|
||||
Path Path
|
||||
IsPrefix bool
|
||||
|
||||
StreamID StreamID
|
||||
|
||||
Metadata []byte
|
||||
|
||||
ContentType string
|
||||
Created time.Time
|
||||
Modified time.Time
|
||||
Expires time.Time
|
||||
|
||||
Stream
|
||||
}
|
||||
|
||||
// Stream is information about an object stream
|
||||
type Stream struct {
|
||||
// Size is the total size of the stream in bytes
|
||||
|
@ -17,4 +17,5 @@ type ObjectListItem struct {
|
||||
ExpiresAt time.Time
|
||||
EncryptedMetadataNonce Nonce
|
||||
EncryptedMetadata []byte
|
||||
IsPrefix bool
|
||||
}
|
||||
|
@ -17,6 +17,16 @@ type SegmentListItem struct {
|
||||
// SegmentDownloadInfo represents segment download information inline/remote
|
||||
type SegmentDownloadInfo struct {
|
||||
SegmentID SegmentID
|
||||
Size int64
|
||||
EncryptedInlineData []byte
|
||||
Next SegmentPosition
|
||||
PiecePrivateKey PiecePrivateKey
|
||||
|
||||
SegmentEncryption SegmentEncryption
|
||||
}
|
||||
|
||||
// SegmentEncryption represents segment encryption key and nonce
|
||||
type SegmentEncryption struct {
|
||||
EncryptedKeyNonce Nonce
|
||||
EncryptedKey EncryptedPrivateKey
|
||||
}
|
||||
|
124
proto.lock
124
proto.lock
@ -2349,26 +2349,6 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"name": "encrypted_metadata_nonce",
|
||||
"type": "bytes",
|
||||
"options": [
|
||||
{
|
||||
"name": "(gogoproto.customtype)",
|
||||
"value": "Nonce"
|
||||
},
|
||||
{
|
||||
"name": "(gogoproto.nullable)",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"name": "encrypted_metadata",
|
||||
"type": "bytes"
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"name": "redundancy_scheme",
|
||||
@ -2443,6 +2423,26 @@
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "encrypted_metadata_nonce",
|
||||
"type": "bytes",
|
||||
"options": [
|
||||
{
|
||||
"name": "(gogoproto.customtype)",
|
||||
"value": "Nonce"
|
||||
},
|
||||
{
|
||||
"name": "(gogoproto.nullable)",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "encrypted_metadata",
|
||||
"type": "bytes"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -2499,11 +2499,16 @@
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"name": "recursive",
|
||||
"type": "bool"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"name": "limit",
|
||||
"type": "int32"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"id": 6,
|
||||
"name": "object_includes",
|
||||
"type": "ObjectListItemIncludes"
|
||||
}
|
||||
@ -2736,26 +2741,6 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"name": "encrypted_metadata_nonce",
|
||||
"type": "bytes",
|
||||
"options": [
|
||||
{
|
||||
"name": "(gogoproto.customtype)",
|
||||
"value": "Nonce"
|
||||
},
|
||||
{
|
||||
"name": "(gogoproto.nullable)",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"name": "encrypted_metadata",
|
||||
"type": "bytes"
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"name": "satellite_signature",
|
||||
@ -3171,6 +3156,21 @@
|
||||
"name": "addressed_limits",
|
||||
"type": "AddressedOrderLimit",
|
||||
"is_repeated": true
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "private_key",
|
||||
"type": "bytes",
|
||||
"options": [
|
||||
{
|
||||
"name": "(gogoproto.customtype)",
|
||||
"value": "PiecePrivateKey"
|
||||
},
|
||||
{
|
||||
"name": "(gogoproto.nullable)",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -3330,11 +3330,51 @@
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "private_key",
|
||||
"type": "bytes",
|
||||
"options": [
|
||||
{
|
||||
"name": "(gogoproto.customtype)",
|
||||
"value": "PiecePrivateKey"
|
||||
},
|
||||
{
|
||||
"name": "(gogoproto.nullable)",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"name": "encrypted_inline_data",
|
||||
"type": "bytes"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"id": 5,
|
||||
"name": "segment_size",
|
||||
"type": "int64"
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"name": "encrypted_key_nonce",
|
||||
"type": "bytes",
|
||||
"options": [
|
||||
{
|
||||
"name": "(gogoproto.customtype)",
|
||||
"value": "Nonce"
|
||||
},
|
||||
{
|
||||
"name": "(gogoproto.nullable)",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"name": "encrypted_key",
|
||||
"type": "bytes"
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"name": "next",
|
||||
"type": "SegmentPosition"
|
||||
}
|
||||
|
@ -117,18 +117,9 @@ func (endpoint *Endpoint) SegmentInfoOld(ctx context.Context, req *pb.SegmentInf
|
||||
return nil, status.Errorf(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
|
||||
path, err := CreatePath(ctx, keyInfo.ProjectID, req.Segment, req.Bucket, req.Path)
|
||||
pointer, _, err := endpoint.getPointer(ctx, keyInfo.ProjectID, req.Segment, req.Bucket, req.Path)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
|
||||
// TODO refactor to use []byte directly
|
||||
pointer, err := endpoint.metainfo.Get(ctx, path)
|
||||
if err != nil {
|
||||
if storage.ErrKeyNotFound.Has(err) {
|
||||
return nil, status.Errorf(codes.NotFound, err.Error())
|
||||
}
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &pb.SegmentInfoResponseOld{Pointer: pointer}, nil
|
||||
@ -347,18 +338,9 @@ func (endpoint *Endpoint) DownloadSegmentOld(ctx context.Context, req *pb.Segmen
|
||||
return nil, status.Errorf(codes.ResourceExhausted, "Exceeded Usage Limit")
|
||||
}
|
||||
|
||||
path, err := CreatePath(ctx, keyInfo.ProjectID, req.Segment, req.Bucket, req.Path)
|
||||
pointer, _, err := endpoint.getPointer(ctx, keyInfo.ProjectID, req.Segment, req.Bucket, req.Path)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
|
||||
// TODO refactor to use []byte directly
|
||||
pointer, err := endpoint.metainfo.Get(ctx, path)
|
||||
if err != nil {
|
||||
if storage.ErrKeyNotFound.Has(err) {
|
||||
return nil, status.Errorf(codes.NotFound, err.Error())
|
||||
}
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if pointer.Type == pb.Pointer_INLINE {
|
||||
@ -944,6 +926,9 @@ func (endpoint *Endpoint) BeginObject(ctx context.Context, req *pb.ObjectBeginRe
|
||||
|
||||
// take bucket RS values if not set in request
|
||||
pbRS := req.RedundancyScheme
|
||||
if pbRS.Type == 0 {
|
||||
pbRS.Type = pb.RedundancyScheme_SchemeType(bucket.DefaultRedundancyScheme.Algorithm)
|
||||
}
|
||||
if pbRS.ErasureShareSize == 0 {
|
||||
pbRS.ErasureShareSize = bucket.DefaultRedundancyScheme.ShareSize
|
||||
}
|
||||
@ -969,14 +954,12 @@ func (endpoint *Endpoint) BeginObject(ctx context.Context, req *pb.ObjectBeginRe
|
||||
}
|
||||
|
||||
streamID, err := endpoint.packStreamID(ctx, &pb.SatStreamID{
|
||||
Bucket: req.Bucket,
|
||||
EncryptedPath: req.EncryptedPath,
|
||||
Version: req.Version,
|
||||
Redundancy: pbRS,
|
||||
CreationDate: time.Now(),
|
||||
ExpirationDate: req.ExpiresAt,
|
||||
EncryptedMetadataNonce: req.EncryptedMetadataNonce,
|
||||
EncryptedMetadata: req.EncryptedMetadata,
|
||||
Bucket: req.Bucket,
|
||||
EncryptedPath: req.EncryptedPath,
|
||||
Version: req.Version,
|
||||
Redundancy: pbRS,
|
||||
CreationDate: time.Now(),
|
||||
ExpirationDate: req.ExpiresAt,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
@ -1011,7 +994,7 @@ func (endpoint *Endpoint) CommitObject(ctx context.Context, req *pb.ObjectCommit
|
||||
return nil, status.Errorf(codes.InvalidArgument, "stream ID expired")
|
||||
}
|
||||
|
||||
_, err = endpoint.validateAuth(ctx, macaroon.Action{
|
||||
keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{
|
||||
Op: macaroon.ActionWrite,
|
||||
Bucket: streamID.Bucket,
|
||||
EncryptedPath: streamID.EncryptedPath,
|
||||
@ -1021,7 +1004,47 @@ func (endpoint *Endpoint) CommitObject(ctx context.Context, req *pb.ObjectCommit
|
||||
return nil, status.Errorf(codes.Unauthenticated, err.Error())
|
||||
}
|
||||
|
||||
// we don't need to do anything for shim implementation
|
||||
segmentIndex := int64(0)
|
||||
var lastSegmentPointer *pb.Pointer
|
||||
var lastSegmentPath string
|
||||
for {
|
||||
path, err := CreatePath(ctx, keyInfo.ProjectID, segmentIndex, streamID.Bucket, streamID.EncryptedPath)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "unable to create segment path: %v", err.Error())
|
||||
}
|
||||
|
||||
pointer, err := endpoint.metainfo.Get(ctx, path)
|
||||
if err != nil {
|
||||
if storage.ErrKeyNotFound.Has(err) {
|
||||
break
|
||||
}
|
||||
return nil, status.Errorf(codes.Internal, "unable to create get segment: %v", err.Error())
|
||||
}
|
||||
|
||||
lastSegmentPointer = pointer
|
||||
lastSegmentPath = path
|
||||
segmentIndex++
|
||||
}
|
||||
if lastSegmentPointer == nil {
|
||||
return nil, status.Errorf(codes.NotFound, "unable to find object: %s/%s", streamID.Bucket, streamID.EncryptedPath)
|
||||
}
|
||||
|
||||
lastSegmentPointer.Metadata = req.EncryptedMetadata
|
||||
|
||||
err = endpoint.metainfo.Delete(ctx, lastSegmentPath)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
lastSegmentPath, err = CreatePath(ctx, keyInfo.ProjectID, -1, streamID.Bucket, streamID.EncryptedPath)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
|
||||
err = endpoint.metainfo.Put(ctx, lastSegmentPath, lastSegmentPointer)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
return &pb.ObjectCommitResponse{}, nil
|
||||
}
|
||||
@ -1045,16 +1068,14 @@ func (endpoint *Endpoint) GetObject(ctx context.Context, req *pb.ObjectGetReques
|
||||
return nil, status.Errorf(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
|
||||
path, err := CreatePath(ctx, keyInfo.ProjectID, -1, req.Bucket, req.EncryptedPath)
|
||||
pointer, _, err := endpoint.getPointer(ctx, keyInfo.ProjectID, -1, req.Bucket, req.EncryptedPath)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pointer, err := endpoint.metainfo.Get(ctx, path)
|
||||
streamMeta := &pb.StreamMeta{}
|
||||
err = proto.Unmarshal(pointer.Metadata, streamMeta)
|
||||
if err != nil {
|
||||
if storage.ErrKeyNotFound.Has(err) {
|
||||
return nil, status.Errorf(codes.NotFound, err.Error())
|
||||
}
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
@ -1076,6 +1097,14 @@ func (endpoint *Endpoint) GetObject(ctx context.Context, req *pb.ObjectGetReques
|
||||
ExpiresAt: pointer.ExpirationDate,
|
||||
CreatedAt: pointer.CreationDate,
|
||||
EncryptedMetadata: pointer.Metadata,
|
||||
EncryptionParameters: &pb.EncryptionParameters{
|
||||
CipherSuite: pb.CipherSuite(streamMeta.EncryptionType),
|
||||
BlockSize: int64(streamMeta.EncryptionBlockSize),
|
||||
},
|
||||
}
|
||||
|
||||
if pointer.Remote != nil {
|
||||
object.RedundancyScheme = pointer.Remote.Redundancy
|
||||
}
|
||||
|
||||
return &pb.ObjectGetResponse{
|
||||
@ -1110,7 +1139,7 @@ func (endpoint *Endpoint) ListObjects(ctx context.Context, req *pb.ObjectListReq
|
||||
metaflags := meta.All
|
||||
// TODO use flags
|
||||
// TODO find out how EncryptedCursor -> startAfter/endAfter
|
||||
segments, more, err := endpoint.metainfo.List(ctx, prefix, "", "", false, req.Limit, metaflags)
|
||||
segments, more, err := endpoint.metainfo.List(ctx, prefix, string(req.EncryptedCursor), "", req.Recursive, req.Limit, metaflags)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
@ -1118,10 +1147,12 @@ func (endpoint *Endpoint) ListObjects(ctx context.Context, req *pb.ObjectListReq
|
||||
items := make([]*pb.ObjectListItem, len(segments))
|
||||
for i, segment := range segments {
|
||||
items[i] = &pb.ObjectListItem{
|
||||
EncryptedPath: []byte(segment.Path),
|
||||
EncryptedMetadata: segment.Pointer.Metadata,
|
||||
CreatedAt: segment.Pointer.CreationDate,
|
||||
ExpiresAt: segment.Pointer.ExpirationDate,
|
||||
EncryptedPath: []byte(segment.Path),
|
||||
}
|
||||
if segment.Pointer != nil {
|
||||
items[i].EncryptedMetadata = segment.Pointer.Metadata
|
||||
items[i].CreatedAt = segment.Pointer.CreationDate
|
||||
items[i].ExpiresAt = segment.Pointer.ExpirationDate
|
||||
}
|
||||
}
|
||||
|
||||
@ -1135,7 +1166,7 @@ func (endpoint *Endpoint) ListObjects(ctx context.Context, req *pb.ObjectListReq
|
||||
func (endpoint *Endpoint) BeginDeleteObject(ctx context.Context, req *pb.ObjectBeginDeleteRequest) (resp *pb.ObjectBeginDeleteResponse, err error) {
|
||||
defer mon.Task()(&ctx)(&err)
|
||||
|
||||
_, err = endpoint.validateAuth(ctx, macaroon.Action{
|
||||
keyInfo, err := endpoint.validateAuth(ctx, macaroon.Action{
|
||||
Op: macaroon.ActionDelete,
|
||||
Bucket: req.Bucket,
|
||||
EncryptedPath: req.EncryptedPath,
|
||||
@ -1172,6 +1203,11 @@ func (endpoint *Endpoint) BeginDeleteObject(ctx context.Context, req *pb.ObjectB
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
_, _, err = endpoint.getPointer(ctx, keyInfo.ProjectID, -1, satStreamID.Bucket, satStreamID.EncryptedPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &pb.ObjectBeginDeleteResponse{
|
||||
StreamId: streamID,
|
||||
}, nil
|
||||
@ -1232,6 +1268,10 @@ func (endpoint *Endpoint) BeginSegment(ctx context.Context, req *pb.SegmentBegin
|
||||
|
||||
// no need to validate streamID fields because it was validated during BeginObject
|
||||
|
||||
if req.Position.Index < 0 {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "segment index must be greater then 0")
|
||||
}
|
||||
|
||||
exceeded, limit, err := endpoint.projectUsage.ExceedsStorageUsage(ctx, keyInfo.ProjectID)
|
||||
if err != nil {
|
||||
endpoint.log.Error("retrieving project storage totals", zap.Error(err))
|
||||
@ -1268,9 +1308,9 @@ func (endpoint *Endpoint) BeginSegment(ctx context.Context, req *pb.SegmentBegin
|
||||
|
||||
segmentID, err := endpoint.packSegmentID(ctx, &pb.SatSegmentID{
|
||||
StreamId: streamID,
|
||||
Index: req.Position.Index,
|
||||
OriginalOrderLimits: addressedLimits,
|
||||
RootPieceId: rootPieceID,
|
||||
Index: req.Position.Index,
|
||||
CreationDate: time.Now(),
|
||||
})
|
||||
|
||||
@ -1302,11 +1342,6 @@ func (endpoint *Endpoint) CommitSegment(ctx context.Context, req *pb.SegmentComm
|
||||
return nil, status.Errorf(codes.Unauthenticated, err.Error())
|
||||
}
|
||||
|
||||
if len(segmentID.OriginalOrderLimits) < len(req.UploadResult) {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "invalid number of upload results: wanted max %d got %d",
|
||||
len(segmentID.OriginalOrderLimits), len(req.UploadResult))
|
||||
}
|
||||
|
||||
pieces := make([]*pb.RemotePiece, len(req.UploadResult))
|
||||
for i, result := range req.UploadResult {
|
||||
pieces[i] = &pb.RemotePiece{
|
||||
@ -1330,10 +1365,6 @@ func (endpoint *Endpoint) CommitSegment(ctx context.Context, req *pb.SegmentComm
|
||||
ExpirationDate: streamID.ExpirationDate,
|
||||
}
|
||||
|
||||
if segmentID.Index == lastSegment {
|
||||
pointer.Metadata = streamID.EncryptedMetadata
|
||||
}
|
||||
|
||||
orderLimits := make([]*pb.OrderLimit, len(segmentID.OriginalOrderLimits))
|
||||
for i, orderLimit := range segmentID.OriginalOrderLimits {
|
||||
orderLimits[i] = orderLimit.Limit
|
||||
@ -1365,6 +1396,11 @@ func (endpoint *Endpoint) CommitSegment(ctx context.Context, req *pb.SegmentComm
|
||||
return nil, status.Errorf(codes.ResourceExhausted, "Exceeded Usage Limit")
|
||||
}
|
||||
|
||||
// clear hashes so we don't store them
|
||||
for _, piece := range pointer.GetRemote().GetRemotePieces() {
|
||||
piece.Hash = nil
|
||||
}
|
||||
|
||||
inlineUsed, remoteUsed := calculateSpaceUsed(pointer)
|
||||
|
||||
// ToDo: Replace with hash & signature validation
|
||||
@ -1410,6 +1446,10 @@ func (endpoint *Endpoint) MakeInlineSegment(ctx context.Context, req *pb.Segment
|
||||
return nil, status.Errorf(codes.Unauthenticated, err.Error())
|
||||
}
|
||||
|
||||
if req.Position.Index < 0 {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "segment index must be greater then 0")
|
||||
}
|
||||
|
||||
path, err := CreatePath(ctx, keyInfo.ProjectID, int64(req.Position.Index), streamID.Bucket, streamID.EncryptedPath)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, err.Error())
|
||||
@ -1442,10 +1482,6 @@ func (endpoint *Endpoint) MakeInlineSegment(ctx context.Context, req *pb.Segment
|
||||
InlineSegment: req.EncryptedInlineData,
|
||||
}
|
||||
|
||||
if req.Position.Index == lastSegment {
|
||||
pointer.Metadata = streamID.EncryptedMetadata
|
||||
}
|
||||
|
||||
err = endpoint.metainfo.Put(ctx, path, pointer)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
@ -1456,11 +1492,6 @@ func (endpoint *Endpoint) MakeInlineSegment(ctx context.Context, req *pb.Segment
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
pointer, err = endpoint.metainfo.Get(ctx, path)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
return &pb.SegmentMakeInlineResponse{}, nil
|
||||
}
|
||||
|
||||
@ -1483,23 +1514,16 @@ func (endpoint *Endpoint) BeginDeleteSegment(ctx context.Context, req *pb.Segmen
|
||||
return nil, status.Errorf(codes.Unauthenticated, err.Error())
|
||||
}
|
||||
|
||||
path, err := CreatePath(ctx, keyInfo.ProjectID, int64(req.Position.Index), streamID.Bucket, streamID.EncryptedPath)
|
||||
pointer, _, err := endpoint.getPointer(ctx, keyInfo.ProjectID, int64(req.Position.Index), streamID.Bucket, streamID.EncryptedPath)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
|
||||
pointer, err := endpoint.metainfo.Get(ctx, path)
|
||||
if err != nil {
|
||||
if storage.ErrKeyNotFound.Has(err) {
|
||||
return nil, status.Errorf(codes.NotFound, err.Error())
|
||||
}
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var limits []*pb.AddressedOrderLimit
|
||||
var privateKey storj.PiecePrivateKey
|
||||
if pointer.Type == pb.Pointer_REMOTE && pointer.Remote != nil {
|
||||
bucketID := createBucketID(keyInfo.ProjectID, streamID.Bucket)
|
||||
limits, _, err = endpoint.orders.CreateDeleteOrderLimits(ctx, bucketID, pointer)
|
||||
limits, privateKey, err = endpoint.orders.CreateDeleteOrderLimits(ctx, bucketID, pointer)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
@ -1515,6 +1539,7 @@ func (endpoint *Endpoint) BeginDeleteSegment(ctx context.Context, req *pb.Segmen
|
||||
return &pb.SegmentBeginDeleteResponse{
|
||||
SegmentId: segmentID,
|
||||
AddressedLimits: limits,
|
||||
PrivateKey: privateKey,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@ -1539,17 +1564,9 @@ func (endpoint *Endpoint) FinishDeleteSegment(ctx context.Context, req *pb.Segme
|
||||
return nil, status.Errorf(codes.Unauthenticated, err.Error())
|
||||
}
|
||||
|
||||
path, err := CreatePath(ctx, keyInfo.ProjectID, int64(segmentID.Index), streamID.Bucket, streamID.EncryptedPath)
|
||||
pointer, path, err := endpoint.getPointer(ctx, keyInfo.ProjectID, int64(segmentID.Index), streamID.Bucket, streamID.EncryptedPath)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
|
||||
pointer, err := endpoint.metainfo.Get(ctx, path)
|
||||
if err != nil {
|
||||
if storage.ErrKeyNotFound.Has(err) {
|
||||
return nil, status.Errorf(codes.NotFound, err.Error())
|
||||
}
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, piece := range pointer.GetRemote().GetRemotePieces() {
|
||||
@ -1666,21 +1683,40 @@ func (endpoint *Endpoint) DownloadSegment(ctx context.Context, req *pb.SegmentDo
|
||||
return nil, status.Errorf(codes.ResourceExhausted, "Exceeded Usage Limit")
|
||||
}
|
||||
|
||||
path, err := CreatePath(ctx, keyInfo.ProjectID, int64(req.CursorPosition.Index), streamID.Bucket, streamID.EncryptedPath)
|
||||
pointer, _, err := endpoint.getPointer(ctx, keyInfo.ProjectID, int64(req.CursorPosition.Index), streamID.Bucket, streamID.EncryptedPath)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
|
||||
pointer, err := endpoint.metainfo.Get(ctx, path)
|
||||
if err != nil {
|
||||
if storage.ErrKeyNotFound.Has(err) {
|
||||
return nil, status.Errorf(codes.NotFound, err.Error())
|
||||
}
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
segmentID, err := endpoint.packSegmentID(ctx, &pb.SatSegmentID{})
|
||||
|
||||
var encryptedKeyNonce storj.Nonce
|
||||
var encryptedKey []byte
|
||||
if len(pointer.Metadata) != 0 {
|
||||
var segmentMeta *pb.SegmentMeta
|
||||
if req.CursorPosition.Index == lastSegment {
|
||||
streamMeta := &pb.StreamMeta{}
|
||||
err = proto.Unmarshal(pointer.Metadata, streamMeta)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
segmentMeta = streamMeta.LastSegmentMeta
|
||||
} else {
|
||||
err = proto.Unmarshal(pointer.Metadata, segmentMeta)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
}
|
||||
if segmentMeta != nil {
|
||||
encryptedKeyNonce, err = storj.NonceFromBytes(segmentMeta.KeyNonce)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "unable to get encryption key nonce from metadata: %v", err.Error())
|
||||
}
|
||||
|
||||
encryptedKey = segmentMeta.EncryptedKey
|
||||
}
|
||||
}
|
||||
|
||||
if pointer.Type == pb.Pointer_INLINE {
|
||||
err := endpoint.orders.UpdateGetInlineOrder(ctx, keyInfo.ProjectID, streamID.Bucket, int64(len(pointer.InlineSegment)))
|
||||
if err != nil {
|
||||
@ -1688,23 +1724,75 @@ func (endpoint *Endpoint) DownloadSegment(ctx context.Context, req *pb.SegmentDo
|
||||
}
|
||||
return &pb.SegmentDownloadResponse{
|
||||
SegmentId: segmentID,
|
||||
SegmentSize: pointer.SegmentSize,
|
||||
EncryptedInlineData: pointer.InlineSegment,
|
||||
|
||||
EncryptedKeyNonce: encryptedKeyNonce,
|
||||
EncryptedKey: encryptedKey,
|
||||
}, nil
|
||||
} else if pointer.Type == pb.Pointer_REMOTE && pointer.Remote != nil {
|
||||
limits, _, err := endpoint.orders.CreateGetOrderLimits(ctx, bucketID, pointer)
|
||||
limits, privateKey, err := endpoint.orders.CreateGetOrderLimits(ctx, bucketID, pointer)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
limits = sortLimits(limits, pointer)
|
||||
|
||||
// workaround to avoid sending nil values on top level
|
||||
for i := range limits {
|
||||
if limits[i] == nil {
|
||||
limits[i] = &pb.AddressedOrderLimit{}
|
||||
}
|
||||
}
|
||||
|
||||
return &pb.SegmentDownloadResponse{
|
||||
SegmentId: segmentID,
|
||||
AddressedLimits: limits,
|
||||
PrivateKey: privateKey,
|
||||
SegmentSize: pointer.SegmentSize,
|
||||
|
||||
EncryptedKeyNonce: encryptedKeyNonce,
|
||||
EncryptedKey: encryptedKey,
|
||||
}, nil
|
||||
}
|
||||
|
||||
return &pb.SegmentDownloadResponse{}, status.Errorf(codes.Internal, "invalid type of pointer")
|
||||
}
|
||||
|
||||
func (endpoint *Endpoint) getPointer(ctx context.Context, projectID uuid.UUID, segmentIndex int64, bucket, encryptedPath []byte) (*pb.Pointer, string, error) {
|
||||
path, err := CreatePath(ctx, projectID, segmentIndex, bucket, encryptedPath)
|
||||
if err != nil {
|
||||
return nil, "", status.Errorf(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
|
||||
pointer, err := endpoint.metainfo.Get(ctx, path)
|
||||
if err != nil {
|
||||
if storage.ErrKeyNotFound.Has(err) {
|
||||
return nil, "", status.Errorf(codes.NotFound, err.Error())
|
||||
}
|
||||
return nil, "", status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
return pointer, path, nil
|
||||
}
|
||||
|
||||
// sortLimits sorts order limits and fill missing ones with nil values
|
||||
func sortLimits(limits []*pb.AddressedOrderLimit, pointer *pb.Pointer) []*pb.AddressedOrderLimit {
|
||||
sorted := make([]*pb.AddressedOrderLimit, pointer.GetRemote().GetRedundancy().GetTotal())
|
||||
for _, piece := range pointer.GetRemote().GetRemotePieces() {
|
||||
sorted[piece.GetPieceNum()] = getLimitByStorageNodeID(limits, piece.NodeId)
|
||||
}
|
||||
return sorted
|
||||
}
|
||||
|
||||
func getLimitByStorageNodeID(limits []*pb.AddressedOrderLimit, storageNodeID storj.NodeID) *pb.AddressedOrderLimit {
|
||||
for _, limit := range limits {
|
||||
if limit.GetLimit().StorageNodeId == storageNodeID {
|
||||
return limit
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (endpoint *Endpoint) packStreamID(ctx context.Context, satStreamID *pb.SatStreamID) (streamID storj.StreamID, err error) {
|
||||
defer mon.Task()(&ctx)(&err)
|
||||
|
||||
|
@ -875,69 +875,6 @@ func TestBucketNameValidation(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestBeginCommitObject(t *testing.T) {
|
||||
testplanet.Run(t, testplanet.Config{
|
||||
SatelliteCount: 1, StorageNodeCount: 0, UplinkCount: 1,
|
||||
}, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) {
|
||||
apiKey := planet.Uplinks[0].APIKey[planet.Satellites[0].ID()]
|
||||
uplink := planet.Uplinks[0]
|
||||
|
||||
config := uplink.GetConfig(planet.Satellites[0])
|
||||
metainfoService := planet.Satellites[0].Metainfo.Service
|
||||
|
||||
projects, err := planet.Satellites[0].DB.Console().Projects().GetAll(ctx)
|
||||
require.NoError(t, err)
|
||||
projectID := projects[0].ID
|
||||
|
||||
bucket := storj.Bucket{
|
||||
Name: "initial-bucket",
|
||||
ProjectID: projectID,
|
||||
PathCipher: config.GetEncryptionParameters().CipherSuite,
|
||||
}
|
||||
_, err = metainfoService.CreateBucket(ctx, bucket)
|
||||
require.NoError(t, err)
|
||||
|
||||
metainfoClient, err := planet.Uplinks[0].DialMetainfo(ctx, planet.Satellites[0], apiKey)
|
||||
require.NoError(t, err)
|
||||
defer ctx.Check(metainfoClient.Close)
|
||||
|
||||
streamID, err := metainfoClient.BeginObject(ctx, metainfo.BeginObjectParams{
|
||||
Bucket: []byte(bucket.Name),
|
||||
EncryptedPath: []byte("encrypted-path"),
|
||||
Redundancy: storj.RedundancyScheme{},
|
||||
EncryptionParameters: storj.EncryptionParameters{},
|
||||
ExpiresAt: time.Time{},
|
||||
EncryptedMetadataNonce: testrand.Nonce(),
|
||||
EncryptedMetadata: testrand.Bytes(memory.KiB),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
err = metainfoClient.CommitObject(ctx, streamID)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
func TestBeginFinishDeleteObject(t *testing.T) {
|
||||
testplanet.Run(t, testplanet.Config{
|
||||
SatelliteCount: 1, StorageNodeCount: 0, UplinkCount: 1,
|
||||
}, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) {
|
||||
apiKey := planet.Uplinks[0].APIKey[planet.Satellites[0].ID()]
|
||||
|
||||
metainfoClient, err := planet.Uplinks[0].DialMetainfo(ctx, planet.Satellites[0], apiKey)
|
||||
require.NoError(t, err)
|
||||
defer ctx.Check(metainfoClient.Close)
|
||||
|
||||
streamID, err := metainfoClient.BeginDeleteObject(ctx, metainfo.BeginDeleteObjectParams{
|
||||
Bucket: []byte("initial-bucket"),
|
||||
EncryptedPath: []byte("encrypted-path"),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
err = metainfoClient.FinishDeleteObject(ctx, streamID)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
func TestListGetObjects(t *testing.T) {
|
||||
testplanet.Run(t, testplanet.Config{
|
||||
SatelliteCount: 1, StorageNodeCount: 0, UplinkCount: 1,
|
||||
@ -967,14 +904,14 @@ func TestListGetObjects(t *testing.T) {
|
||||
require.NotEmpty(t, item.EncryptedPath)
|
||||
require.True(t, item.CreatedAt.Before(time.Now()))
|
||||
|
||||
object, streamID, err := metainfoClient.GetObject(ctx, metainfo.GetObjectParams{
|
||||
object, err := metainfoClient.GetObject(ctx, metainfo.GetObjectParams{
|
||||
Bucket: []byte(expectedBucketName),
|
||||
EncryptedPath: item.EncryptedPath,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, item.EncryptedPath, []byte(object.Path))
|
||||
|
||||
require.NotEmpty(t, streamID)
|
||||
require.NotEmpty(t, object.StreamID)
|
||||
}
|
||||
|
||||
items, _, err = metainfoClient.ListObjects(ctx, metainfo.ListObjectsParams{
|
||||
@ -1023,10 +960,8 @@ func TestBeginCommitListSegment(t *testing.T) {
|
||||
OptimalShares: 3,
|
||||
TotalShares: 4,
|
||||
},
|
||||
EncryptionParameters: storj.EncryptionParameters{},
|
||||
ExpiresAt: time.Now().UTC().Add(24 * time.Hour),
|
||||
EncryptedMetadataNonce: testrand.Nonce(),
|
||||
EncryptedMetadata: testrand.Bytes(memory.KiB),
|
||||
EncryptionParameters: storj.EncryptionParameters{},
|
||||
ExpiresAt: time.Now().UTC().Add(24 * time.Hour),
|
||||
}
|
||||
streamID, err := metainfoClient.BeginObject(ctx, params)
|
||||
require.NoError(t, err)
|
||||
@ -1034,7 +969,7 @@ func TestBeginCommitListSegment(t *testing.T) {
|
||||
segmentID, limits, _, err := metainfoClient.BeginSegment(ctx, metainfo.BeginSegmentParams{
|
||||
StreamID: streamID,
|
||||
Position: storj.SegmentPosition{
|
||||
Index: -1,
|
||||
Index: 0,
|
||||
},
|
||||
MaxOderLimit: memory.MiB.Int64(),
|
||||
})
|
||||
@ -1052,8 +987,9 @@ func TestBeginCommitListSegment(t *testing.T) {
|
||||
},
|
||||
}
|
||||
}
|
||||
err = metainfoClient.CommitSegment2(ctx, metainfo.CommitSegmentParams{
|
||||
SegmentID: segmentID,
|
||||
err = metainfoClient.CommitSegmentNew(ctx, metainfo.CommitSegmentParams{
|
||||
SegmentID: segmentID,
|
||||
|
||||
SizeEncryptedData: memory.MiB.Int64(),
|
||||
UploadResult: []*pb.SegmentPieceUploadResult{
|
||||
makeResult(0),
|
||||
@ -1063,7 +999,9 @@ func TestBeginCommitListSegment(t *testing.T) {
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
err = metainfoClient.CommitObject(ctx, streamID)
|
||||
err = metainfoClient.CommitObject(ctx, metainfo.CommitObjectParams{
|
||||
StreamID: streamID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
objects, _, err := metainfoClient.ListObjects(ctx, metainfo.ListObjectsParams{
|
||||
@ -1073,17 +1011,16 @@ func TestBeginCommitListSegment(t *testing.T) {
|
||||
require.Len(t, objects, 1)
|
||||
|
||||
require.Equal(t, params.EncryptedPath, objects[0].EncryptedPath)
|
||||
require.Equal(t, params.EncryptedMetadata, objects[0].EncryptedMetadata)
|
||||
require.Equal(t, params.ExpiresAt, objects[0].ExpiresAt)
|
||||
|
||||
_, streamID, err = metainfoClient.GetObject(ctx, metainfo.GetObjectParams{
|
||||
object, err := metainfoClient.GetObject(ctx, metainfo.GetObjectParams{
|
||||
Bucket: []byte(bucket.Name),
|
||||
EncryptedPath: objects[0].EncryptedPath,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
segments, _, err := metainfoClient.ListSegments2(ctx, metainfo.ListSegmentsParams{
|
||||
StreamID: streamID,
|
||||
segments, _, err := metainfoClient.ListSegmentsNew(ctx, metainfo.ListSegmentsParams{
|
||||
StreamID: object.StreamID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Len(t, segments, 1)
|
||||
@ -1138,15 +1075,13 @@ func TestInlineSegment(t *testing.T) {
|
||||
OptimalShares: 3,
|
||||
TotalShares: 4,
|
||||
},
|
||||
EncryptionParameters: storj.EncryptionParameters{},
|
||||
ExpiresAt: time.Now().UTC().Add(24 * time.Hour),
|
||||
EncryptedMetadataNonce: testrand.Nonce(),
|
||||
EncryptedMetadata: testrand.Bytes(memory.KiB),
|
||||
EncryptionParameters: storj.EncryptionParameters{},
|
||||
ExpiresAt: time.Now().UTC().Add(24 * time.Hour),
|
||||
}
|
||||
streamID, err := metainfoClient.BeginObject(ctx, params)
|
||||
require.NoError(t, err)
|
||||
|
||||
segments := []int32{0, 1, 2, 3, 4, 5, -1}
|
||||
segments := []int32{0, 1, 2, 3, 4, 5, 6}
|
||||
segmentsData := make([][]byte, len(segments))
|
||||
for i, segment := range segments {
|
||||
segmentsData[i] = testrand.Bytes(memory.KiB)
|
||||
@ -1160,7 +1095,9 @@ func TestInlineSegment(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
err = metainfoClient.CommitObject(ctx, streamID)
|
||||
err = metainfoClient.CommitObject(ctx, metainfo.CommitObjectParams{
|
||||
StreamID: streamID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
objects, _, err := metainfoClient.ListObjects(ctx, metainfo.ListObjectsParams{
|
||||
@ -1170,10 +1107,9 @@ func TestInlineSegment(t *testing.T) {
|
||||
require.Len(t, objects, 1)
|
||||
|
||||
require.Equal(t, params.EncryptedPath, objects[0].EncryptedPath)
|
||||
require.Equal(t, params.EncryptedMetadata, objects[0].EncryptedMetadata)
|
||||
require.Equal(t, params.ExpiresAt, objects[0].ExpiresAt)
|
||||
|
||||
_, streamID, err = metainfoClient.GetObject(ctx, metainfo.GetObjectParams{
|
||||
object, err := metainfoClient.GetObject(ctx, metainfo.GetObjectParams{
|
||||
Bucket: params.Bucket,
|
||||
EncryptedPath: params.EncryptedPath,
|
||||
})
|
||||
@ -1192,8 +1128,8 @@ func TestInlineSegment(t *testing.T) {
|
||||
{Index: 0, Result: len(segments), More: false, Limit: len(segments)},
|
||||
{Index: 0, Result: len(segments) - 1, More: true, Limit: len(segments) - 1},
|
||||
} {
|
||||
items, more, err := metainfoClient.ListSegments2(ctx, metainfo.ListSegmentsParams{
|
||||
StreamID: streamID,
|
||||
items, more, err := metainfoClient.ListSegmentsNew(ctx, metainfo.ListSegmentsParams{
|
||||
StreamID: object.StreamID,
|
||||
CursorPosition: storj.SegmentPosition{
|
||||
Index: test.Index,
|
||||
},
|
||||
@ -1206,11 +1142,17 @@ func TestInlineSegment(t *testing.T) {
|
||||
}
|
||||
|
||||
{ // test download inline segments
|
||||
for i, segment := range segments {
|
||||
items, _, err := metainfoClient.ListSegmentsNew(ctx, metainfo.ListSegmentsParams{
|
||||
StreamID: object.StreamID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, len(segments), len(items))
|
||||
|
||||
for i, item := range items {
|
||||
info, limits, err := metainfoClient.DownloadSegment(ctx, metainfo.DownloadSegmentParams{
|
||||
StreamID: streamID,
|
||||
StreamID: object.StreamID,
|
||||
Position: storj.SegmentPosition{
|
||||
Index: segment,
|
||||
Index: item.Position.Index,
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@ -1226,12 +1168,12 @@ func TestInlineSegment(t *testing.T) {
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
items, _, err := metainfoClient.ListSegments2(ctx, metainfo.ListSegmentsParams{
|
||||
items, _, err := metainfoClient.ListSegmentsNew(ctx, metainfo.ListSegmentsParams{
|
||||
StreamID: streamID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
for _, item := range items {
|
||||
segmentID, limits, err := metainfoClient.BeginDeleteSegment(ctx, metainfo.BeginDeleteSegmentParams{
|
||||
segmentID, limits, _, err := metainfoClient.BeginDeleteSegment(ctx, metainfo.BeginDeleteSegmentParams{
|
||||
StreamID: streamID,
|
||||
Position: storj.SegmentPosition{
|
||||
Index: item.Position.Index,
|
||||
@ -1246,7 +1188,7 @@ func TestInlineSegment(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
items, _, err = metainfoClient.ListSegments2(ctx, metainfo.ListSegmentsParams{
|
||||
items, _, err = metainfoClient.ListSegmentsNew(ctx, metainfo.ListSegmentsParams{
|
||||
StreamID: streamID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@ -1284,20 +1226,20 @@ func TestRemoteSegment(t *testing.T) {
|
||||
// List segments
|
||||
// Download segment
|
||||
|
||||
_, streamID, err := metainfoClient.GetObject(ctx, metainfo.GetObjectParams{
|
||||
object, err := metainfoClient.GetObject(ctx, metainfo.GetObjectParams{
|
||||
Bucket: []byte(expectedBucketName),
|
||||
EncryptedPath: items[0].EncryptedPath,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
segments, _, err := metainfoClient.ListSegments2(ctx, metainfo.ListSegmentsParams{
|
||||
StreamID: streamID,
|
||||
segments, _, err := metainfoClient.ListSegmentsNew(ctx, metainfo.ListSegmentsParams{
|
||||
StreamID: object.StreamID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Len(t, segments, 1)
|
||||
|
||||
_, limits, err := metainfoClient.DownloadSegment(ctx, metainfo.DownloadSegmentParams{
|
||||
StreamID: streamID,
|
||||
StreamID: object.StreamID,
|
||||
Position: storj.SegmentPosition{
|
||||
Index: segments[0].Position.Index,
|
||||
},
|
||||
@ -1318,13 +1260,13 @@ func TestRemoteSegment(t *testing.T) {
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
segments, _, err := metainfoClient.ListSegments2(ctx, metainfo.ListSegmentsParams{
|
||||
segments, _, err := metainfoClient.ListSegmentsNew(ctx, metainfo.ListSegmentsParams{
|
||||
StreamID: streamID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
for _, segment := range segments {
|
||||
segmentID, limits, err := metainfoClient.BeginDeleteSegment(ctx, metainfo.BeginDeleteSegmentParams{
|
||||
segmentID, limits, _, err := metainfoClient.BeginDeleteSegment(ctx, metainfo.BeginDeleteSegmentParams{
|
||||
StreamID: streamID,
|
||||
Position: storj.SegmentPosition{
|
||||
Index: segment.Position.Index,
|
||||
@ -1363,11 +1305,13 @@ func TestIDs(t *testing.T) {
|
||||
|
||||
{
|
||||
streamID := testrand.StreamID(256)
|
||||
err = metainfoClient.CommitObject(ctx, streamID)
|
||||
err = metainfoClient.CommitObject(ctx, metainfo.CommitObjectParams{
|
||||
StreamID: streamID,
|
||||
})
|
||||
require.Error(t, err) // invalid streamID
|
||||
|
||||
segmentID := testrand.SegmentID(512)
|
||||
err = metainfoClient.CommitSegment2(ctx, metainfo.CommitSegmentParams{
|
||||
err = metainfoClient.CommitSegmentNew(ctx, metainfo.CommitSegmentParams{
|
||||
SegmentID: segmentID,
|
||||
})
|
||||
require.Error(t, err) // invalid segmentID
|
||||
@ -1387,7 +1331,9 @@ func TestIDs(t *testing.T) {
|
||||
streamID, err := storj.StreamIDFromBytes(encodedStreamID)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = metainfoClient.CommitObject(ctx, streamID)
|
||||
err = metainfoClient.CommitObject(ctx, metainfo.CommitObjectParams{
|
||||
StreamID: streamID,
|
||||
})
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
@ -1403,7 +1349,7 @@ func TestIDs(t *testing.T) {
|
||||
segmentID, err := storj.SegmentIDFromBytes(encodedSegmentID)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = metainfoClient.CommitSegment2(ctx, metainfo.CommitSegmentParams{
|
||||
err = metainfoClient.CommitSegmentNew(ctx, metainfo.CommitSegmentParams{
|
||||
SegmentID: segmentID,
|
||||
})
|
||||
require.Error(t, err)
|
||||
|
@ -19,6 +19,7 @@ import (
|
||||
"storj.io/storj/pkg/encryption"
|
||||
"storj.io/storj/pkg/pb"
|
||||
"storj.io/storj/pkg/ranger"
|
||||
"storj.io/storj/pkg/storj"
|
||||
)
|
||||
|
||||
// ErasureScheme represents the general format of any erasure scheme algorithm.
|
||||
@ -106,6 +107,17 @@ func NewRedundancyStrategyFromProto(scheme *pb.RedundancyScheme) (RedundancyStra
|
||||
return NewRedundancyStrategy(es, int(scheme.GetRepairThreshold()), int(scheme.GetSuccessThreshold()))
|
||||
}
|
||||
|
||||
// NewRedundancyStrategyFromStorj creates new RedundancyStrategy from the given
|
||||
// storj.RedundancyScheme.
|
||||
func NewRedundancyStrategyFromStorj(scheme storj.RedundancyScheme) (RedundancyStrategy, error) {
|
||||
fc, err := infectious.NewFEC(int(scheme.RequiredShares), int(scheme.TotalShares))
|
||||
if err != nil {
|
||||
return RedundancyStrategy{}, Error.Wrap(err)
|
||||
}
|
||||
es := NewRSScheme(fc, int(scheme.ShareSize))
|
||||
return NewRedundancyStrategy(es, int(scheme.RepairShares), int(scheme.OptimalShares))
|
||||
}
|
||||
|
||||
// RepairThreshold is the number of available erasure pieces below which
|
||||
// the data must be repaired to avoid loss
|
||||
func (rs *RedundancyStrategy) RepairThreshold() int {
|
||||
|
@ -4,6 +4,7 @@
|
||||
package metainfo
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"time"
|
||||
|
||||
@ -366,14 +367,12 @@ func convertProtoToBucket(pbBucket *pb.Bucket) (bucket storj.Bucket, err error)
|
||||
|
||||
// BeginObjectParams parmaters for BeginObject method
|
||||
type BeginObjectParams struct {
|
||||
Bucket []byte
|
||||
EncryptedPath []byte
|
||||
Version int32
|
||||
Redundancy storj.RedundancyScheme
|
||||
EncryptionParameters storj.EncryptionParameters
|
||||
ExpiresAt time.Time
|
||||
EncryptedMetadataNonce storj.Nonce
|
||||
EncryptedMetadata []byte
|
||||
Bucket []byte
|
||||
EncryptedPath []byte
|
||||
Version int32
|
||||
Redundancy storj.RedundancyScheme
|
||||
EncryptionParameters storj.EncryptionParameters
|
||||
ExpiresAt time.Time
|
||||
}
|
||||
|
||||
// BeginObject begins object creation
|
||||
@ -381,12 +380,10 @@ func (client *Client) BeginObject(ctx context.Context, params BeginObjectParams)
|
||||
defer mon.Task()(&ctx)(&err)
|
||||
|
||||
response, err := client.client.BeginObject(ctx, &pb.ObjectBeginRequest{
|
||||
Bucket: params.Bucket,
|
||||
EncryptedPath: params.EncryptedPath,
|
||||
Version: params.Version,
|
||||
ExpiresAt: params.ExpiresAt,
|
||||
EncryptedMetadataNonce: params.EncryptedMetadataNonce,
|
||||
EncryptedMetadata: params.EncryptedMetadata,
|
||||
Bucket: params.Bucket,
|
||||
EncryptedPath: params.EncryptedPath,
|
||||
Version: params.Version,
|
||||
ExpiresAt: params.ExpiresAt,
|
||||
RedundancyScheme: &pb.RedundancyScheme{
|
||||
Type: pb.RedundancyScheme_SchemeType(params.Redundancy.Algorithm),
|
||||
ErasureShareSize: params.Redundancy.ShareSize,
|
||||
@ -407,12 +404,22 @@ func (client *Client) BeginObject(ctx context.Context, params BeginObjectParams)
|
||||
return response.StreamId, nil
|
||||
}
|
||||
|
||||
// CommitObjectParams parmaters for CommitObject method
|
||||
type CommitObjectParams struct {
|
||||
StreamID storj.StreamID
|
||||
|
||||
EncryptedMetadataNonce storj.Nonce
|
||||
EncryptedMetadata []byte
|
||||
}
|
||||
|
||||
// CommitObject commits created object
|
||||
func (client *Client) CommitObject(ctx context.Context, streamID storj.StreamID) (err error) {
|
||||
func (client *Client) CommitObject(ctx context.Context, params CommitObjectParams) (err error) {
|
||||
defer mon.Task()(&ctx)(&err)
|
||||
|
||||
_, err = client.client.CommitObject(ctx, &pb.ObjectCommitRequest{
|
||||
StreamId: streamID,
|
||||
StreamId: params.StreamID,
|
||||
EncryptedMetadataNonce: params.EncryptedMetadataNonce,
|
||||
EncryptedMetadata: params.EncryptedMetadata,
|
||||
})
|
||||
return Error.Wrap(err)
|
||||
}
|
||||
@ -425,7 +432,7 @@ type GetObjectParams struct {
|
||||
}
|
||||
|
||||
// GetObject gets single object
|
||||
func (client *Client) GetObject(ctx context.Context, params GetObjectParams) (_ storj.Object, _ storj.StreamID, err error) {
|
||||
func (client *Client) GetObject(ctx context.Context, params GetObjectParams) (_ storj.ObjectInfo, err error) {
|
||||
defer mon.Task()(&ctx)(&err)
|
||||
|
||||
response, err := client.client.GetObject(ctx, &pb.ObjectGetRequest{
|
||||
@ -433,21 +440,46 @@ func (client *Client) GetObject(ctx context.Context, params GetObjectParams) (_
|
||||
EncryptedPath: params.EncryptedPath,
|
||||
Version: params.Version,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return storj.Object{}, storj.StreamID{}, Error.Wrap(err)
|
||||
if status.Code(err) == codes.NotFound {
|
||||
return storj.ObjectInfo{}, storj.ErrObjectNotFound.Wrap(err)
|
||||
}
|
||||
return storj.ObjectInfo{}, Error.Wrap(err)
|
||||
}
|
||||
|
||||
object := storj.Object{
|
||||
Bucket: storj.Bucket{
|
||||
Name: string(response.Object.Bucket),
|
||||
object := storj.ObjectInfo{
|
||||
Bucket: string(response.Object.Bucket),
|
||||
Path: storj.Path(response.Object.EncryptedPath),
|
||||
|
||||
StreamID: response.Object.StreamId,
|
||||
|
||||
Created: response.Object.CreatedAt,
|
||||
Modified: response.Object.CreatedAt,
|
||||
Expires: response.Object.ExpiresAt,
|
||||
Metadata: response.Object.EncryptedMetadata,
|
||||
Stream: storj.Stream{
|
||||
Size: response.Object.TotalSize,
|
||||
EncryptionParameters: storj.EncryptionParameters{
|
||||
CipherSuite: storj.CipherSuite(response.Object.EncryptionParameters.CipherSuite),
|
||||
BlockSize: int32(response.Object.EncryptionParameters.BlockSize),
|
||||
},
|
||||
},
|
||||
Path: storj.Path(response.Object.EncryptedPath),
|
||||
Created: response.Object.CreatedAt,
|
||||
Expires: response.Object.ExpiresAt,
|
||||
// TODO custom type for response object or modify storj.Object
|
||||
}
|
||||
|
||||
return object, response.Object.StreamId, nil
|
||||
pbRS := response.Object.RedundancyScheme
|
||||
if pbRS != nil {
|
||||
object.Stream.RedundancyScheme = storj.RedundancyScheme{
|
||||
Algorithm: storj.RedundancyAlgorithm(pbRS.Type),
|
||||
ShareSize: pbRS.ErasureShareSize,
|
||||
RequiredShares: int16(pbRS.MinReq),
|
||||
RepairShares: int16(pbRS.RepairThreshold),
|
||||
OptimalShares: int16(pbRS.SuccessThreshold),
|
||||
TotalShares: int16(pbRS.Total),
|
||||
}
|
||||
}
|
||||
|
||||
return object, nil
|
||||
}
|
||||
|
||||
// BeginDeleteObjectParams parameters for BeginDeleteObject method
|
||||
@ -467,6 +499,9 @@ func (client *Client) BeginDeleteObject(ctx context.Context, params BeginDeleteO
|
||||
Version: params.Version,
|
||||
})
|
||||
if err != nil {
|
||||
if status.Code(err) == codes.NotFound {
|
||||
return storj.StreamID{}, storj.ErrObjectNotFound.Wrap(err)
|
||||
}
|
||||
return storj.StreamID{}, Error.Wrap(err)
|
||||
}
|
||||
|
||||
@ -490,6 +525,7 @@ type ListObjectsParams struct {
|
||||
EncryptedCursor []byte
|
||||
Limit int32
|
||||
IncludeMetadata bool
|
||||
Recursive bool
|
||||
}
|
||||
|
||||
// ListObjects lists objects according to specific parameters
|
||||
@ -504,6 +540,7 @@ func (client *Client) ListObjects(ctx context.Context, params ListObjectsParams)
|
||||
ObjectIncludes: &pb.ObjectListItemIncludes{
|
||||
Metadata: params.IncludeMetadata,
|
||||
},
|
||||
Recursive: params.Recursive,
|
||||
})
|
||||
if err != nil {
|
||||
return []storj.ObjectListItem{}, false, Error.Wrap(err)
|
||||
@ -511,6 +548,12 @@ func (client *Client) ListObjects(ctx context.Context, params ListObjectsParams)
|
||||
|
||||
objects := make([]storj.ObjectListItem, len(response.Items))
|
||||
for i, object := range response.Items {
|
||||
encryptedPath := object.EncryptedPath
|
||||
isPrefix := false
|
||||
if !params.Recursive && len(encryptedPath) != 0 && encryptedPath[len(encryptedPath)-1] == '/' && !bytes.Equal(encryptedPath, params.EncryptedPrefix) {
|
||||
isPrefix = true
|
||||
}
|
||||
|
||||
objects[i] = storj.ObjectListItem{
|
||||
EncryptedPath: object.EncryptedPath,
|
||||
Version: object.Version,
|
||||
@ -520,6 +563,8 @@ func (client *Client) ListObjects(ctx context.Context, params ListObjectsParams)
|
||||
ExpiresAt: object.ExpiresAt,
|
||||
EncryptedMetadataNonce: object.EncryptedMetadataNonce,
|
||||
EncryptedMetadata: object.EncryptedMetadata,
|
||||
|
||||
IsPrefix: isPrefix,
|
||||
}
|
||||
}
|
||||
|
||||
@ -555,22 +600,21 @@ func (client *Client) BeginSegment(ctx context.Context, params BeginSegmentParam
|
||||
// CommitSegmentParams parameters for CommitSegment method
|
||||
type CommitSegmentParams struct {
|
||||
SegmentID storj.SegmentID
|
||||
EncryptedKeyNonce storj.Nonce
|
||||
EncryptedKey []byte
|
||||
Encryption storj.SegmentEncryption
|
||||
SizeEncryptedData int64
|
||||
// TODO find better way for this
|
||||
|
||||
UploadResult []*pb.SegmentPieceUploadResult
|
||||
}
|
||||
|
||||
// CommitSegment2 commits segment after upload
|
||||
func (client *Client) CommitSegment2(ctx context.Context, params CommitSegmentParams) (err error) {
|
||||
// TODO method name will be changed when new methods will be fully integrated with client side
|
||||
// CommitSegmentNew commits segment after upload
|
||||
func (client *Client) CommitSegmentNew(ctx context.Context, params CommitSegmentParams) (err error) {
|
||||
defer mon.Task()(&ctx)(&err)
|
||||
|
||||
_, err = client.client.CommitSegment(ctx, &pb.SegmentCommitRequest{
|
||||
SegmentId: params.SegmentID,
|
||||
EncryptedKeyNonce: params.EncryptedKeyNonce,
|
||||
EncryptedKey: params.EncryptedKey,
|
||||
SegmentId: params.SegmentID,
|
||||
|
||||
EncryptedKeyNonce: params.Encryption.EncryptedKeyNonce,
|
||||
EncryptedKey: params.Encryption.EncryptedKey,
|
||||
SizeEncryptedData: params.SizeEncryptedData,
|
||||
UploadResult: params.UploadResult,
|
||||
})
|
||||
@ -585,8 +629,7 @@ func (client *Client) CommitSegment2(ctx context.Context, params CommitSegmentPa
|
||||
type MakeInlineSegmentParams struct {
|
||||
StreamID storj.StreamID
|
||||
Position storj.SegmentPosition
|
||||
EncryptedKeyNonce storj.Nonce
|
||||
EncryptedKey []byte
|
||||
Encryption storj.SegmentEncryption
|
||||
EncryptedInlineData []byte
|
||||
}
|
||||
|
||||
@ -600,8 +643,8 @@ func (client *Client) MakeInlineSegment(ctx context.Context, params MakeInlineSe
|
||||
PartNumber: params.Position.PartNumber,
|
||||
Index: params.Position.Index,
|
||||
},
|
||||
EncryptedKeyNonce: params.EncryptedKeyNonce,
|
||||
EncryptedKey: params.EncryptedKey,
|
||||
EncryptedKeyNonce: params.Encryption.EncryptedKeyNonce,
|
||||
EncryptedKey: params.Encryption.EncryptedKey,
|
||||
EncryptedInlineData: params.EncryptedInlineData,
|
||||
})
|
||||
if err != nil {
|
||||
@ -618,7 +661,7 @@ type BeginDeleteSegmentParams struct {
|
||||
}
|
||||
|
||||
// BeginDeleteSegment begins segment upload process
|
||||
func (client *Client) BeginDeleteSegment(ctx context.Context, params BeginDeleteSegmentParams) (_ storj.SegmentID, limits []*pb.AddressedOrderLimit, err error) {
|
||||
func (client *Client) BeginDeleteSegment(ctx context.Context, params BeginDeleteSegmentParams) (_ storj.SegmentID, limits []*pb.AddressedOrderLimit, _ storj.PiecePrivateKey, err error) {
|
||||
defer mon.Task()(&ctx)(&err)
|
||||
|
||||
response, err := client.client.BeginDeleteSegment(ctx, &pb.SegmentBeginDeleteRequest{
|
||||
@ -629,16 +672,16 @@ func (client *Client) BeginDeleteSegment(ctx context.Context, params BeginDelete
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return storj.SegmentID{}, nil, Error.Wrap(err)
|
||||
return storj.SegmentID{}, nil, storj.PiecePrivateKey{}, Error.Wrap(err)
|
||||
}
|
||||
|
||||
return response.SegmentId, response.AddressedLimits, nil
|
||||
return response.SegmentId, response.AddressedLimits, response.PrivateKey, nil
|
||||
}
|
||||
|
||||
// FinishDeleteSegmentParams parameters for FinishDeleteSegment method
|
||||
type FinishDeleteSegmentParams struct {
|
||||
SegmentID storj.SegmentID
|
||||
// TODO find better way to pass this
|
||||
|
||||
DeleteResults []*pb.SegmentPieceDeleteResult
|
||||
}
|
||||
|
||||
@ -676,7 +719,13 @@ func (client *Client) DownloadSegment(ctx context.Context, params DownloadSegmen
|
||||
|
||||
info := storj.SegmentDownloadInfo{
|
||||
SegmentID: response.SegmentId,
|
||||
Size: response.SegmentSize,
|
||||
EncryptedInlineData: response.EncryptedInlineData,
|
||||
PiecePrivateKey: response.PrivateKey,
|
||||
SegmentEncryption: storj.SegmentEncryption{
|
||||
EncryptedKeyNonce: response.EncryptedKeyNonce,
|
||||
EncryptedKey: response.EncryptedKey,
|
||||
},
|
||||
}
|
||||
if response.Next != nil {
|
||||
info.Next = storj.SegmentPosition{
|
||||
@ -685,6 +734,12 @@ func (client *Client) DownloadSegment(ctx context.Context, params DownloadSegmen
|
||||
}
|
||||
}
|
||||
|
||||
for i := range response.AddressedLimits {
|
||||
if response.AddressedLimits[i].Limit == nil {
|
||||
response.AddressedLimits[i] = nil
|
||||
}
|
||||
}
|
||||
|
||||
return info, response.AddressedLimits, nil
|
||||
}
|
||||
|
||||
@ -695,9 +750,8 @@ type ListSegmentsParams struct {
|
||||
Limit int32
|
||||
}
|
||||
|
||||
// ListSegments2 lists object segments
|
||||
func (client *Client) ListSegments2(ctx context.Context, params ListSegmentsParams) (_ []storj.SegmentListItem, more bool, err error) {
|
||||
// TODO method name will be changed when new methods will be fully integrated with client side
|
||||
// ListSegmentsNew lists object segments
|
||||
func (client *Client) ListSegmentsNew(ctx context.Context, params ListSegmentsParams) (_ []storj.SegmentListItem, more bool, err error) {
|
||||
defer mon.Task()(&ctx)(&err)
|
||||
|
||||
response, err := client.client.ListSegments(ctx, &pb.SegmentListRequest{
|
||||
|
Loading…
Reference in New Issue
Block a user