diff --git a/chromeos_update_engine/update_metadata.pb.go b/chromeos_update_engine/update_metadata.pb.go index 4b3fe8c..8c4face 100644 --- a/chromeos_update_engine/update_metadata.pb.go +++ b/chromeos_update_engine/update_metadata.pb.go @@ -13,6 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. // + // Update file format: An update file contains all the operations needed // to update a system to a specific version. It can be a full payload which // can update from any version, or a delta payload which can only update @@ -48,11 +49,14 @@ // char payload_signatures_message[payload_signatures_message_size]; // // }; + // The DeltaArchiveManifest protobuf is an ordered list of InstallOperation // objects. These objects are stored in a linear array in the // DeltaArchiveManifest. Each operation is applied in order by the client. + // The DeltaArchiveManifest also contains the initial and final // checksums for the device. + // The client will perform each InstallOperation in order, beginning even // before the entire delta file is downloaded (but after at least the // protobuf is downloaded). The types of operations are explained: @@ -87,8 +91,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 -// protoc v5.27.1 +// protoc-gen-go v1.32.0 +// protoc v3.21.12 // source: update_metadata.proto package chromeos_update_engine @@ -128,6 +132,12 @@ const ( InstallOperation_BROTLI_BSDIFF InstallOperation_Type = 10 // Like SOURCE_BSDIFF, but compressed with brotli. // On minor version 5 or newer, these operations are supported: InstallOperation_PUFFDIFF InstallOperation_Type = 9 // The data is in puffdiff format. + // On minor version 8 or newer, these operations are supported: + InstallOperation_ZUCCHINI InstallOperation_Type = 11 + // On minor version 9 or newer, these operations are supported: + InstallOperation_LZ4DIFF_BSDIFF InstallOperation_Type = 12 + InstallOperation_LZ4DIFF_PUFFDIFF InstallOperation_Type = 13 + InstallOperation_ZSTD InstallOperation_Type = 14 ) // Enum value maps for InstallOperation_Type. @@ -144,19 +154,27 @@ var ( 7: "DISCARD", 10: "BROTLI_BSDIFF", 9: "PUFFDIFF", + 11: "ZUCCHINI", + 12: "LZ4DIFF_BSDIFF", + 13: "LZ4DIFF_PUFFDIFF", + 14: "ZSTD", } InstallOperation_Type_value = map[string]int32{ - "REPLACE": 0, - "REPLACE_BZ": 1, - "MOVE": 2, - "BSDIFF": 3, - "SOURCE_COPY": 4, - "SOURCE_BSDIFF": 5, - "REPLACE_XZ": 8, - "ZERO": 6, - "DISCARD": 7, - "BROTLI_BSDIFF": 10, - "PUFFDIFF": 9, + "REPLACE": 0, + "REPLACE_BZ": 1, + "MOVE": 2, + "BSDIFF": 3, + "SOURCE_COPY": 4, + "SOURCE_BSDIFF": 5, + "REPLACE_XZ": 8, + "ZERO": 6, + "DISCARD": 7, + "BROTLI_BSDIFF": 10, + "PUFFDIFF": 9, + "ZUCCHINI": 11, + "LZ4DIFF_BSDIFF": 12, + "LZ4DIFF_PUFFDIFF": 13, + "ZSTD": 14, } ) @@ -194,22 +212,28 @@ func (x *InstallOperation_Type) UnmarshalJSON(b []byte) error { // Deprecated: Use InstallOperation_Type.Descriptor instead. func (InstallOperation_Type) EnumDescriptor() ([]byte, []int) { - return file_update_metadata_proto_rawDescGZIP(), []int{4, 0} + return file_update_metadata_proto_rawDescGZIP(), []int{3, 0} } type CowMergeOperation_Type int32 const ( - CowMergeOperation_COW_COPY CowMergeOperation_Type = 0 // identical blocks + CowMergeOperation_COW_COPY CowMergeOperation_Type = 0 // identical blocks + CowMergeOperation_COW_XOR CowMergeOperation_Type = 1 // used when src/dst blocks are highly similar + CowMergeOperation_COW_REPLACE CowMergeOperation_Type = 2 // Raw replace operation ) // Enum value maps for CowMergeOperation_Type. var ( CowMergeOperation_Type_name = map[int32]string{ 0: "COW_COPY", + 1: "COW_XOR", + 2: "COW_REPLACE", } CowMergeOperation_Type_value = map[string]int32{ - "COW_COPY": 0, + "COW_COPY": 0, + "COW_XOR": 1, + "COW_REPLACE": 2, } ) @@ -247,21 +271,9 @@ func (x *CowMergeOperation_Type) UnmarshalJSON(b []byte) error { // Deprecated: Use CowMergeOperation_Type.Descriptor instead. func (CowMergeOperation_Type) EnumDescriptor() ([]byte, []int) { - return file_update_metadata_proto_rawDescGZIP(), []int{5, 0} -} - -// Data is packed into blocks on disk, always starting from the beginning -// of the block. If a file's data is too large for one block, it overflows -// into another block, which may or may not be the following block on the -// physical partition. An ordered list of extents is another -// representation of an ordered list of blocks. For example, a file stored -// in blocks 9, 10, 11, 2, 18, 12 (in that order) would be stored in -// extents { {9, 3}, {2, 1}, {18, 1}, {12, 1} } (in that order). -// In general, files are stored sequentially on disk, so it's more efficient -// to use extents to encode the block lists (this is effectively -// run-length encoding). -// A sentinel value (kuint64max) as the start block denotes a sparse-hole -// in a file whose block-length is specified by num_blocks. + return file_update_metadata_proto_rawDescGZIP(), []int{4, 0} +} + type Extent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -317,17 +329,6 @@ func (x *Extent) GetNumBlocks() uint64 { return 0 } -// Signatures: Updates may be signed by the OS vendor. The client verifies -// an update's signature by hashing the entire download. The section of the -// download that contains the signature is at the end of the file, so when -// signing a file, only the part up to the signature part is signed. -// Then, the client looks inside the download's Signatures message for a -// Signature message that it knows how to handle. Generally, a client will -// only know how to handle one type of signature, but an update may contain -// many signatures to support many different types of client. Then client -// selects a Signature message and uses that, along with a known public key, -// to verify the download. The public key is expected to be part of the -// client. type Signatures struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -430,103 +431,6 @@ func (x *PartitionInfo) GetHash() []byte { return nil } -// Describe an image we are based on in a human friendly way. -// Examples: -// -// dev-channel, x86-alex, 1.2.3, mp-v3 -// nplusone-channel, x86-alex, 1.2.4, mp-v3, dev-channel, 1.2.3 -// -// All fields will be set, if this message is present. -type ImageInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Board *string `protobuf:"bytes,1,opt,name=board" json:"board,omitempty"` - Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` - Channel *string `protobuf:"bytes,3,opt,name=channel" json:"channel,omitempty"` - Version *string `protobuf:"bytes,4,opt,name=version" json:"version,omitempty"` - // If these values aren't present, they should be assumed to match - // the equivalent value above. They are normally only different for - // special image types such as nplusone images. - BuildChannel *string `protobuf:"bytes,5,opt,name=build_channel,json=buildChannel" json:"build_channel,omitempty"` - BuildVersion *string `protobuf:"bytes,6,opt,name=build_version,json=buildVersion" json:"build_version,omitempty"` -} - -func (x *ImageInfo) Reset() { - *x = ImageInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_update_metadata_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ImageInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ImageInfo) ProtoMessage() {} - -func (x *ImageInfo) ProtoReflect() protoreflect.Message { - mi := &file_update_metadata_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ImageInfo.ProtoReflect.Descriptor instead. -func (*ImageInfo) Descriptor() ([]byte, []int) { - return file_update_metadata_proto_rawDescGZIP(), []int{3} -} - -func (x *ImageInfo) GetBoard() string { - if x != nil && x.Board != nil { - return *x.Board - } - return "" -} - -func (x *ImageInfo) GetKey() string { - if x != nil && x.Key != nil { - return *x.Key - } - return "" -} - -func (x *ImageInfo) GetChannel() string { - if x != nil && x.Channel != nil { - return *x.Channel - } - return "" -} - -func (x *ImageInfo) GetVersion() string { - if x != nil && x.Version != nil { - return *x.Version - } - return "" -} - -func (x *ImageInfo) GetBuildChannel() string { - if x != nil && x.BuildChannel != nil { - return *x.BuildChannel - } - return "" -} - -func (x *ImageInfo) GetBuildVersion() string { - if x != nil && x.BuildVersion != nil { - return *x.BuildVersion - } - return "" -} - type InstallOperation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -567,7 +471,7 @@ type InstallOperation struct { func (x *InstallOperation) Reset() { *x = InstallOperation{} if protoimpl.UnsafeEnabled { - mi := &file_update_metadata_proto_msgTypes[4] + mi := &file_update_metadata_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -580,7 +484,7 @@ func (x *InstallOperation) String() string { func (*InstallOperation) ProtoMessage() {} func (x *InstallOperation) ProtoReflect() protoreflect.Message { - mi := &file_update_metadata_proto_msgTypes[4] + mi := &file_update_metadata_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -593,7 +497,7 @@ func (x *InstallOperation) ProtoReflect() protoreflect.Message { // Deprecated: Use InstallOperation.ProtoReflect.Descriptor instead. func (*InstallOperation) Descriptor() ([]byte, []int) { - return file_update_metadata_proto_rawDescGZIP(), []int{4} + return file_update_metadata_proto_rawDescGZIP(), []int{3} } func (x *InstallOperation) GetType() InstallOperation_Type { @@ -673,12 +577,20 @@ type CowMergeOperation struct { Type *CowMergeOperation_Type `protobuf:"varint,1,opt,name=type,enum=chromeos_update_engine.CowMergeOperation_Type" json:"type,omitempty"` SrcExtent *Extent `protobuf:"bytes,2,opt,name=src_extent,json=srcExtent" json:"src_extent,omitempty"` DstExtent *Extent `protobuf:"bytes,3,opt,name=dst_extent,json=dstExtent" json:"dst_extent,omitempty"` + // For COW_XOR, source location might be unaligned, so this field is in range + // [0, block_size), representing how much should the src_extent shift toward + // larger block number. If this field is non-zero, then src_extent will + // include 1 extra block in the end, as the merge op actually references the + // first |src_offset| bytes of that extra block. For example, if |dst_extent| + // is [10, 15], |src_offset| is 500, then src_extent might look like [25, 31]. + // Note that |src_extent| contains 1 extra block than the |dst_extent|. + SrcOffset *uint32 `protobuf:"varint,4,opt,name=src_offset,json=srcOffset" json:"src_offset,omitempty"` } func (x *CowMergeOperation) Reset() { *x = CowMergeOperation{} if protoimpl.UnsafeEnabled { - mi := &file_update_metadata_proto_msgTypes[5] + mi := &file_update_metadata_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -691,7 +603,7 @@ func (x *CowMergeOperation) String() string { func (*CowMergeOperation) ProtoMessage() {} func (x *CowMergeOperation) ProtoReflect() protoreflect.Message { - mi := &file_update_metadata_proto_msgTypes[5] + mi := &file_update_metadata_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -704,7 +616,7 @@ func (x *CowMergeOperation) ProtoReflect() protoreflect.Message { // Deprecated: Use CowMergeOperation.ProtoReflect.Descriptor instead. func (*CowMergeOperation) Descriptor() ([]byte, []int) { - return file_update_metadata_proto_rawDescGZIP(), []int{5} + return file_update_metadata_proto_rawDescGZIP(), []int{4} } func (x *CowMergeOperation) GetType() CowMergeOperation_Type { @@ -728,6 +640,13 @@ func (x *CowMergeOperation) GetDstExtent() *Extent { return nil } +func (x *CowMergeOperation) GetSrcOffset() uint32 { + if x != nil && x.SrcOffset != nil { + return *x.SrcOffset + } + return 0 +} + // Describes the update to apply to a single partition. type PartitionUpdate struct { state protoimpl.MessageState @@ -765,7 +684,6 @@ type PartitionUpdate struct { // Whether a failure in the postinstall step for this partition should be // ignored. PostinstallOptional *bool `protobuf:"varint,9,opt,name=postinstall_optional,json=postinstallOptional" json:"postinstall_optional,omitempty"` - // On minor version 6 or newer, these fields are supported: // The extent for data covered by verity hash tree. HashTreeDataExtent *Extent `protobuf:"bytes,10,opt,name=hash_tree_data_extent,json=hashTreeDataExtent" json:"hash_tree_data_extent,omitempty"` // The extent to store verity hash tree. @@ -788,6 +706,13 @@ type PartitionUpdate struct { // skip writing the raw bytes for these extents. During snapshot merge, the // bytes will read from the source partitions instead. MergeOperations []*CowMergeOperation `protobuf:"bytes,18,rep,name=merge_operations,json=mergeOperations" json:"merge_operations,omitempty"` + // Estimated size for COW image. This is used by libsnapshot + // as a hint. If set to 0, libsnapshot should use alternative + // methods for estimating size. + EstimateCowSize *uint64 `protobuf:"varint,19,opt,name=estimate_cow_size,json=estimateCowSize" json:"estimate_cow_size,omitempty"` + // Information about the cow used by Cow Writer to specify + // number of cow operations to be written + EstimateOpCountMax *uint64 `protobuf:"varint,20,opt,name=estimate_op_count_max,json=estimateOpCountMax" json:"estimate_op_count_max,omitempty"` } // Default values for PartitionUpdate fields. @@ -798,7 +723,7 @@ const ( func (x *PartitionUpdate) Reset() { *x = PartitionUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_update_metadata_proto_msgTypes[6] + mi := &file_update_metadata_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -811,7 +736,7 @@ func (x *PartitionUpdate) String() string { func (*PartitionUpdate) ProtoMessage() {} func (x *PartitionUpdate) ProtoReflect() protoreflect.Message { - mi := &file_update_metadata_proto_msgTypes[6] + mi := &file_update_metadata_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -824,7 +749,7 @@ func (x *PartitionUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use PartitionUpdate.ProtoReflect.Descriptor instead. func (*PartitionUpdate) Descriptor() ([]byte, []int) { - return file_update_metadata_proto_rawDescGZIP(), []int{6} + return file_update_metadata_proto_rawDescGZIP(), []int{5} } func (x *PartitionUpdate) GetPartitionName() string { @@ -953,6 +878,20 @@ func (x *PartitionUpdate) GetMergeOperations() []*CowMergeOperation { return nil } +func (x *PartitionUpdate) GetEstimateCowSize() uint64 { + if x != nil && x.EstimateCowSize != nil { + return *x.EstimateCowSize + } + return 0 +} + +func (x *PartitionUpdate) GetEstimateOpCountMax() uint64 { + if x != nil && x.EstimateOpCountMax != nil { + return *x.EstimateOpCountMax + } + return 0 +} + type DynamicPartitionGroup struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -970,7 +909,7 @@ type DynamicPartitionGroup struct { func (x *DynamicPartitionGroup) Reset() { *x = DynamicPartitionGroup{} if protoimpl.UnsafeEnabled { - mi := &file_update_metadata_proto_msgTypes[7] + mi := &file_update_metadata_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -983,7 +922,7 @@ func (x *DynamicPartitionGroup) String() string { func (*DynamicPartitionGroup) ProtoMessage() {} func (x *DynamicPartitionGroup) ProtoReflect() protoreflect.Message { - mi := &file_update_metadata_proto_msgTypes[7] + mi := &file_update_metadata_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -996,7 +935,7 @@ func (x *DynamicPartitionGroup) ProtoReflect() protoreflect.Message { // Deprecated: Use DynamicPartitionGroup.ProtoReflect.Descriptor instead. func (*DynamicPartitionGroup) Descriptor() ([]byte, []int) { - return file_update_metadata_proto_rawDescGZIP(), []int{7} + return file_update_metadata_proto_rawDescGZIP(), []int{6} } func (x *DynamicPartitionGroup) GetName() string { @@ -1020,6 +959,61 @@ func (x *DynamicPartitionGroup) GetPartitionNames() []string { return nil } +type VABCFeatureSet struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Threaded *bool `protobuf:"varint,1,opt,name=threaded" json:"threaded,omitempty"` + BatchWrites *bool `protobuf:"varint,2,opt,name=batch_writes,json=batchWrites" json:"batch_writes,omitempty"` +} + +func (x *VABCFeatureSet) Reset() { + *x = VABCFeatureSet{} + if protoimpl.UnsafeEnabled { + mi := &file_update_metadata_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VABCFeatureSet) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VABCFeatureSet) ProtoMessage() {} + +func (x *VABCFeatureSet) ProtoReflect() protoreflect.Message { + mi := &file_update_metadata_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VABCFeatureSet.ProtoReflect.Descriptor instead. +func (*VABCFeatureSet) Descriptor() ([]byte, []int) { + return file_update_metadata_proto_rawDescGZIP(), []int{7} +} + +func (x *VABCFeatureSet) GetThreaded() bool { + if x != nil && x.Threaded != nil { + return *x.Threaded + } + return false +} + +func (x *VABCFeatureSet) GetBatchWrites() bool { + if x != nil && x.BatchWrites != nil { + return *x.BatchWrites + } + return false +} + // Metadata related to all dynamic partitions. type DynamicPartitionMetadata struct { state protoimpl.MessageState @@ -1038,6 +1032,23 @@ type DynamicPartitionMetadata struct { // partitions if possible. If this is unset, the update_engine daemon MUST // NOT create snapshots for dynamic partitions. SnapshotEnabled *bool `protobuf:"varint,2,opt,name=snapshot_enabled,json=snapshotEnabled" json:"snapshot_enabled,omitempty"` + // If this is set to false, update_engine should not use VABC regardless. If + // this is set to true, update_engine may choose to use VABC if device + // supports it, but not guaranteed. + // VABC stands for Virtual AB Compression + VabcEnabled *bool `protobuf:"varint,3,opt,name=vabc_enabled,json=vabcEnabled" json:"vabc_enabled,omitempty"` + // The compression algorithm used by VABC. Available ones are "gz", "brotli". + // See system/core/fs_mgr/libsnapshot/cow_writer.cpp for available options, + // as this parameter is ultimated forwarded to libsnapshot's CowWriter + VabcCompressionParam *string `protobuf:"bytes,4,opt,name=vabc_compression_param,json=vabcCompressionParam" json:"vabc_compression_param,omitempty"` + // COW version used by VABC. The represents the major version in the COW + // header + CowVersion *uint32 `protobuf:"varint,5,opt,name=cow_version,json=cowVersion" json:"cow_version,omitempty"` + // A collection of knobs to tune Virtual AB Compression + VabcFeatureSet *VABCFeatureSet `protobuf:"bytes,6,opt,name=vabc_feature_set,json=vabcFeatureSet" json:"vabc_feature_set,omitempty"` + // Max bytes to be compressed at once during ota. Options: 4k, 8k, 16k, 32k, + // 64k, 128k + CompressionFactor *uint64 `protobuf:"varint,7,opt,name=compression_factor,json=compressionFactor" json:"compression_factor,omitempty"` } func (x *DynamicPartitionMetadata) Reset() { @@ -1086,19 +1097,168 @@ func (x *DynamicPartitionMetadata) GetSnapshotEnabled() bool { return false } +func (x *DynamicPartitionMetadata) GetVabcEnabled() bool { + if x != nil && x.VabcEnabled != nil { + return *x.VabcEnabled + } + return false +} + +func (x *DynamicPartitionMetadata) GetVabcCompressionParam() string { + if x != nil && x.VabcCompressionParam != nil { + return *x.VabcCompressionParam + } + return "" +} + +func (x *DynamicPartitionMetadata) GetCowVersion() uint32 { + if x != nil && x.CowVersion != nil { + return *x.CowVersion + } + return 0 +} + +func (x *DynamicPartitionMetadata) GetVabcFeatureSet() *VABCFeatureSet { + if x != nil { + return x.VabcFeatureSet + } + return nil +} + +func (x *DynamicPartitionMetadata) GetCompressionFactor() uint64 { + if x != nil && x.CompressionFactor != nil { + return *x.CompressionFactor + } + return 0 +} + +// Definition has been duplicated from +// $ANDROID_BUILD_TOP/build/tools/releasetools/ota_metadata.proto. Keep in sync. +type ApexInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PackageName *string `protobuf:"bytes,1,opt,name=package_name,json=packageName" json:"package_name,omitempty"` + Version *int64 `protobuf:"varint,2,opt,name=version" json:"version,omitempty"` + IsCompressed *bool `protobuf:"varint,3,opt,name=is_compressed,json=isCompressed" json:"is_compressed,omitempty"` + DecompressedSize *int64 `protobuf:"varint,4,opt,name=decompressed_size,json=decompressedSize" json:"decompressed_size,omitempty"` +} + +func (x *ApexInfo) Reset() { + *x = ApexInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_update_metadata_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ApexInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ApexInfo) ProtoMessage() {} + +func (x *ApexInfo) ProtoReflect() protoreflect.Message { + mi := &file_update_metadata_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ApexInfo.ProtoReflect.Descriptor instead. +func (*ApexInfo) Descriptor() ([]byte, []int) { + return file_update_metadata_proto_rawDescGZIP(), []int{9} +} + +func (x *ApexInfo) GetPackageName() string { + if x != nil && x.PackageName != nil { + return *x.PackageName + } + return "" +} + +func (x *ApexInfo) GetVersion() int64 { + if x != nil && x.Version != nil { + return *x.Version + } + return 0 +} + +func (x *ApexInfo) GetIsCompressed() bool { + if x != nil && x.IsCompressed != nil { + return *x.IsCompressed + } + return false +} + +func (x *ApexInfo) GetDecompressedSize() int64 { + if x != nil && x.DecompressedSize != nil { + return *x.DecompressedSize + } + return 0 +} + +// Definition has been duplicated from +// $ANDROID_BUILD_TOP/build/tools/releasetools/ota_metadata.proto. Keep in sync. +type ApexMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ApexInfo []*ApexInfo `protobuf:"bytes,1,rep,name=apex_info,json=apexInfo" json:"apex_info,omitempty"` +} + +func (x *ApexMetadata) Reset() { + *x = ApexMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_update_metadata_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ApexMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ApexMetadata) ProtoMessage() {} + +func (x *ApexMetadata) ProtoReflect() protoreflect.Message { + mi := &file_update_metadata_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ApexMetadata.ProtoReflect.Descriptor instead. +func (*ApexMetadata) Descriptor() ([]byte, []int) { + return file_update_metadata_proto_rawDescGZIP(), []int{10} +} + +func (x *ApexMetadata) GetApexInfo() []*ApexInfo { + if x != nil { + return x.ApexInfo + } + return nil +} + type DeltaArchiveManifest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Only present in major version = 1. List of install operations for the - // kernel and rootfs partitions. For major version = 2 see the |partitions| - // field. - // - // Deprecated: Marked as deprecated in update_metadata.proto. - InstallOperations []*InstallOperation `protobuf:"bytes,1,rep,name=install_operations,json=installOperations" json:"install_operations,omitempty"` - // Deprecated: Marked as deprecated in update_metadata.proto. - KernelInstallOperations []*InstallOperation `protobuf:"bytes,2,rep,name=kernel_install_operations,json=kernelInstallOperations" json:"kernel_install_operations,omitempty"` // (At time of writing) usually 4096 BlockSize *uint32 `protobuf:"varint,3,opt,name=block_size,json=blockSize,def=4096" json:"block_size,omitempty"` // If signatures are present, the offset into the blobs, generally @@ -1108,20 +1268,6 @@ type DeltaArchiveManifest struct { // file. SignaturesOffset *uint64 `protobuf:"varint,4,opt,name=signatures_offset,json=signaturesOffset" json:"signatures_offset,omitempty"` SignaturesSize *uint64 `protobuf:"varint,5,opt,name=signatures_size,json=signaturesSize" json:"signatures_size,omitempty"` - // Only present in major version = 1. Partition metadata used to validate the - // update. For major version = 2 see the |partitions| field. - // - // Deprecated: Marked as deprecated in update_metadata.proto. - OldKernelInfo *PartitionInfo `protobuf:"bytes,6,opt,name=old_kernel_info,json=oldKernelInfo" json:"old_kernel_info,omitempty"` - // Deprecated: Marked as deprecated in update_metadata.proto. - NewKernelInfo *PartitionInfo `protobuf:"bytes,7,opt,name=new_kernel_info,json=newKernelInfo" json:"new_kernel_info,omitempty"` - // Deprecated: Marked as deprecated in update_metadata.proto. - OldRootfsInfo *PartitionInfo `protobuf:"bytes,8,opt,name=old_rootfs_info,json=oldRootfsInfo" json:"old_rootfs_info,omitempty"` - // Deprecated: Marked as deprecated in update_metadata.proto. - NewRootfsInfo *PartitionInfo `protobuf:"bytes,9,opt,name=new_rootfs_info,json=newRootfsInfo" json:"new_rootfs_info,omitempty"` - // old_image_info will only be present for delta images. - OldImageInfo *ImageInfo `protobuf:"bytes,10,opt,name=old_image_info,json=oldImageInfo" json:"old_image_info,omitempty"` - NewImageInfo *ImageInfo `protobuf:"bytes,11,opt,name=new_image_info,json=newImageInfo" json:"new_image_info,omitempty"` // The minor version, also referred as "delta version", of the payload. // Minor version 0 is full payload, everything else is delta payload. MinorVersion *uint32 `protobuf:"varint,12,opt,name=minor_version,json=minorVersion,def=0" json:"minor_version,omitempty"` @@ -1139,6 +1285,12 @@ type DeltaArchiveManifest struct { DynamicPartitionMetadata *DynamicPartitionMetadata `protobuf:"bytes,15,opt,name=dynamic_partition_metadata,json=dynamicPartitionMetadata" json:"dynamic_partition_metadata,omitempty"` // If the payload only updates a subset of partitions on the device. PartialUpdate *bool `protobuf:"varint,16,opt,name=partial_update,json=partialUpdate" json:"partial_update,omitempty"` + // Information on compressed APEX to figure out how much space is required for + // their decompression + ApexInfo []*ApexInfo `protobuf:"bytes,17,rep,name=apex_info,json=apexInfo" json:"apex_info,omitempty"` + // Security patch level of the device, usually in the format of + // yyyy-mm-dd + SecurityPatchLevel *string `protobuf:"bytes,18,opt,name=security_patch_level,json=securityPatchLevel" json:"security_patch_level,omitempty"` } // Default values for DeltaArchiveManifest fields. @@ -1150,7 +1302,7 @@ const ( func (x *DeltaArchiveManifest) Reset() { *x = DeltaArchiveManifest{} if protoimpl.UnsafeEnabled { - mi := &file_update_metadata_proto_msgTypes[9] + mi := &file_update_metadata_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1163,7 +1315,7 @@ func (x *DeltaArchiveManifest) String() string { func (*DeltaArchiveManifest) ProtoMessage() {} func (x *DeltaArchiveManifest) ProtoReflect() protoreflect.Message { - mi := &file_update_metadata_proto_msgTypes[9] + mi := &file_update_metadata_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1176,23 +1328,7 @@ func (x *DeltaArchiveManifest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeltaArchiveManifest.ProtoReflect.Descriptor instead. func (*DeltaArchiveManifest) Descriptor() ([]byte, []int) { - return file_update_metadata_proto_rawDescGZIP(), []int{9} -} - -// Deprecated: Marked as deprecated in update_metadata.proto. -func (x *DeltaArchiveManifest) GetInstallOperations() []*InstallOperation { - if x != nil { - return x.InstallOperations - } - return nil -} - -// Deprecated: Marked as deprecated in update_metadata.proto. -func (x *DeltaArchiveManifest) GetKernelInstallOperations() []*InstallOperation { - if x != nil { - return x.KernelInstallOperations - } - return nil + return file_update_metadata_proto_rawDescGZIP(), []int{11} } func (x *DeltaArchiveManifest) GetBlockSize() uint32 { @@ -1216,52 +1352,6 @@ func (x *DeltaArchiveManifest) GetSignaturesSize() uint64 { return 0 } -// Deprecated: Marked as deprecated in update_metadata.proto. -func (x *DeltaArchiveManifest) GetOldKernelInfo() *PartitionInfo { - if x != nil { - return x.OldKernelInfo - } - return nil -} - -// Deprecated: Marked as deprecated in update_metadata.proto. -func (x *DeltaArchiveManifest) GetNewKernelInfo() *PartitionInfo { - if x != nil { - return x.NewKernelInfo - } - return nil -} - -// Deprecated: Marked as deprecated in update_metadata.proto. -func (x *DeltaArchiveManifest) GetOldRootfsInfo() *PartitionInfo { - if x != nil { - return x.OldRootfsInfo - } - return nil -} - -// Deprecated: Marked as deprecated in update_metadata.proto. -func (x *DeltaArchiveManifest) GetNewRootfsInfo() *PartitionInfo { - if x != nil { - return x.NewRootfsInfo - } - return nil -} - -func (x *DeltaArchiveManifest) GetOldImageInfo() *ImageInfo { - if x != nil { - return x.OldImageInfo - } - return nil -} - -func (x *DeltaArchiveManifest) GetNewImageInfo() *ImageInfo { - if x != nil { - return x.NewImageInfo - } - return nil -} - func (x *DeltaArchiveManifest) GetMinorVersion() uint32 { if x != nil && x.MinorVersion != nil { return *x.MinorVersion @@ -1297,6 +1387,20 @@ func (x *DeltaArchiveManifest) GetPartialUpdate() bool { return false } +func (x *DeltaArchiveManifest) GetApexInfo() []*ApexInfo { + if x != nil { + return x.ApexInfo + } + return nil +} + +func (x *DeltaArchiveManifest) GetSecurityPatchLevel() string { + if x != nil && x.SecurityPatchLevel != nil { + return *x.SecurityPatchLevel + } + return "" +} + type Signatures_Signature struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1318,7 +1422,7 @@ type Signatures_Signature struct { func (x *Signatures_Signature) Reset() { *x = Signatures_Signature{} if protoimpl.UnsafeEnabled { - mi := &file_update_metadata_proto_msgTypes[10] + mi := &file_update_metadata_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1331,7 +1435,7 @@ func (x *Signatures_Signature) String() string { func (*Signatures_Signature) ProtoMessage() {} func (x *Signatures_Signature) ProtoReflect() protoreflect.Message { - mi := &file_update_metadata_proto_msgTypes[10] + mi := &file_update_metadata_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1396,226 +1500,232 @@ var file_update_metadata_proto_rawDesc = []byte{ 0x0d, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0xb1, 0x01, 0x0a, 0x09, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, - 0x69, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x04, 0x0a, 0x10, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x41, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x2d, 0x2e, - 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, - 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x4c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x12, 0x3f, 0x0a, 0x0b, 0x73, 0x72, 0x63, 0x5f, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, - 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x73, 0x72, 0x63, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x72, 0x63, 0x5f, 0x6c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x73, 0x72, 0x63, 0x4c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x12, 0x3f, 0x0a, 0x0b, 0x64, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, + 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x9b, 0x05, 0x0a, 0x10, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x64, 0x73, 0x74, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x73, 0x74, 0x5f, 0x6c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x64, 0x73, 0x74, 0x4c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x12, 0x28, 0x0a, 0x10, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x68, 0x61, - 0x32, 0x35, 0x36, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, - 0x64, 0x61, 0x74, 0x61, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x48, 0x61, 0x73, 0x68, 0x12, 0x26, - 0x0a, 0x0f, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x73, 0x72, 0x63, 0x53, 0x68, 0x61, 0x32, - 0x35, 0x36, 0x48, 0x61, 0x73, 0x68, 0x22, 0xad, 0x01, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, - 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x42, 0x5a, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x04, - 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x02, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x0e, 0x0a, 0x06, 0x42, 0x53, - 0x44, 0x49, 0x46, 0x46, 0x10, 0x03, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x50, 0x59, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x42, 0x53, 0x44, 0x49, 0x46, 0x46, 0x10, 0x05, 0x12, 0x0e, - 0x0a, 0x0a, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x58, 0x5a, 0x10, 0x08, 0x12, 0x08, - 0x0a, 0x04, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x49, 0x53, 0x43, - 0x41, 0x52, 0x44, 0x10, 0x07, 0x12, 0x11, 0x0a, 0x0d, 0x42, 0x52, 0x4f, 0x54, 0x4c, 0x49, 0x5f, - 0x42, 0x53, 0x44, 0x49, 0x46, 0x46, 0x10, 0x0a, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x55, 0x46, 0x46, - 0x44, 0x49, 0x46, 0x46, 0x10, 0x09, 0x22, 0xeb, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x77, 0x4d, 0x65, - 0x72, 0x67, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x68, 0x72, - 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x2e, 0x43, 0x6f, 0x77, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x3d, 0x0a, 0x0a, 0x73, 0x72, 0x63, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x73, 0x72, 0x63, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x3d, 0x0a, 0x0a, 0x64, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x74, 0x52, 0x09, 0x64, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x14, - 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x57, 0x5f, 0x43, 0x4f, - 0x50, 0x59, 0x10, 0x00, 0x22, 0xcc, 0x08, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, - 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x27, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x75, 0x6e, 0x50, 0x6f, 0x73, - 0x74, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x6f, 0x73, 0x74, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x50, - 0x61, 0x74, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x64, 0x0a, 0x17, - 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, - 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x15, 0x6e, 0x65, 0x77, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x12, 0x53, 0x0a, 0x12, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x53, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x5f, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6e, 0x65, 0x77, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x48, 0x0a, 0x0a, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x70, 0x6f, 0x73, 0x74, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x70, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x51, 0x0a, 0x15, 0x68, 0x61, 0x73, - 0x68, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, - 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, - 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x12, 0x68, 0x61, 0x73, 0x68, 0x54, 0x72, - 0x65, 0x65, 0x44, 0x61, 0x74, 0x61, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x10, - 0x68, 0x61, 0x73, 0x68, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, - 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x54, 0x72, 0x65, 0x65, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x74, - 0x72, 0x65, 0x65, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x68, 0x61, 0x73, 0x68, 0x54, 0x72, 0x65, 0x65, 0x41, 0x6c, 0x67, - 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x24, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x74, - 0x72, 0x65, 0x65, 0x5f, 0x73, 0x61, 0x6c, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, - 0x68, 0x61, 0x73, 0x68, 0x54, 0x72, 0x65, 0x65, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x46, 0x0a, 0x0f, - 0x66, 0x65, 0x63, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, + 0x6e, 0x65, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x12, 0x3f, 0x0a, 0x0b, 0x73, 0x72, 0x63, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x66, 0x65, 0x63, 0x44, 0x61, 0x74, 0x61, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x0a, 0x66, 0x65, 0x63, 0x5f, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, + 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x73, 0x72, 0x63, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x72, 0x63, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x73, 0x72, 0x63, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x12, 0x3f, 0x0a, 0x0b, 0x64, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, + 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x64, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x73, 0x74, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x64, 0x73, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x12, 0x28, 0x0a, 0x10, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x64, 0x61, 0x74, 0x61, + 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x48, 0x61, 0x73, 0x68, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x72, + 0x63, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x73, 0x72, 0x63, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x48, 0x61, + 0x73, 0x68, 0x22, 0xef, 0x01, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x52, + 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x50, 0x4c, + 0x41, 0x43, 0x45, 0x5f, 0x42, 0x5a, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x04, 0x4d, 0x4f, 0x56, 0x45, + 0x10, 0x02, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x0e, 0x0a, 0x06, 0x42, 0x53, 0x44, 0x49, 0x46, 0x46, + 0x10, 0x03, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x43, 0x4f, 0x50, 0x59, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x4f, 0x55, 0x52, 0x43, + 0x45, 0x5f, 0x42, 0x53, 0x44, 0x49, 0x46, 0x46, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, + 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x58, 0x5a, 0x10, 0x08, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x45, + 0x52, 0x4f, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x49, 0x53, 0x43, 0x41, 0x52, 0x44, 0x10, + 0x07, 0x12, 0x11, 0x0a, 0x0d, 0x42, 0x52, 0x4f, 0x54, 0x4c, 0x49, 0x5f, 0x42, 0x53, 0x44, 0x49, + 0x46, 0x46, 0x10, 0x0a, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x55, 0x46, 0x46, 0x44, 0x49, 0x46, 0x46, + 0x10, 0x09, 0x12, 0x0c, 0x0a, 0x08, 0x5a, 0x55, 0x43, 0x43, 0x48, 0x49, 0x4e, 0x49, 0x10, 0x0b, + 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x5a, 0x34, 0x44, 0x49, 0x46, 0x46, 0x5f, 0x42, 0x53, 0x44, 0x49, + 0x46, 0x46, 0x10, 0x0c, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x5a, 0x34, 0x44, 0x49, 0x46, 0x46, 0x5f, + 0x50, 0x55, 0x46, 0x46, 0x44, 0x49, 0x46, 0x46, 0x10, 0x0d, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x53, + 0x54, 0x44, 0x10, 0x0e, 0x22, 0xa8, 0x02, 0x0a, 0x11, 0x43, 0x6f, 0x77, 0x4d, 0x65, 0x72, 0x67, + 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, + 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x2e, 0x43, 0x6f, 0x77, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3d, + 0x0a, 0x0a, 0x73, 0x72, 0x63, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x74, 0x52, 0x09, 0x73, 0x72, 0x63, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3d, 0x0a, + 0x0a, 0x64, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x74, 0x52, 0x09, 0x64, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x72, 0x63, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x09, 0x73, 0x72, 0x63, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x32, 0x0a, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x57, 0x5f, 0x43, 0x4f, 0x50, 0x59, 0x10, + 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x57, 0x5f, 0x58, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0f, + 0x0a, 0x0b, 0x43, 0x4f, 0x57, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x22, + 0xab, 0x09, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x75, + 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x75, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, + 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x27, + 0x0a, 0x0f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x64, 0x0a, 0x17, 0x6e, 0x65, 0x77, 0x5f, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, - 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x66, 0x65, 0x63, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x09, 0x66, 0x65, 0x63, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x73, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x01, 0x32, 0x52, 0x08, 0x66, 0x65, 0x63, 0x52, 0x6f, - 0x6f, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, - 0x10, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, - 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, - 0x2e, 0x43, 0x6f, 0x77, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x68, 0x0a, 0x15, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x8c, 0x01, - 0x0a, 0x18, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x45, 0x0a, 0x06, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x68, 0x72, - 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xe3, 0x08, 0x0a, - 0x14, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x6e, - 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x11, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x68, 0x0a, 0x19, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, - 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x17, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0a, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x3a, 0x04, 0x34, 0x30, 0x39, 0x36, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5f, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x27, - 0x0a, 0x0f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x51, 0x0a, 0x0f, 0x6f, 0x6c, 0x64, 0x5f, 0x6b, - 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x6f, 0x6c, 0x64, - 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x51, 0x0a, 0x0f, 0x6e, 0x65, - 0x77, 0x5f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, - 0x6e, 0x65, 0x77, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x51, 0x0a, - 0x0f, 0x6f, 0x6c, 0x64, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, - 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x0d, 0x6f, 0x6c, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x51, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, + 0x65, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x15, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x53, 0x0a, + 0x12, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x52, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x47, 0x0a, 0x0e, 0x6f, 0x6c, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x68, + 0x52, 0x10, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x53, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x48, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, - 0x6f, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x47, 0x0a, 0x0e, - 0x6e, 0x65, 0x77, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x01, 0x30, 0x52, - 0x0c, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, - 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, - 0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x6e, 0x0a, 0x1a, 0x64, - 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x18, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x42, 0x02, 0x48, 0x03, + 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x31, 0x0a, 0x14, 0x70, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x13, 0x70, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x51, 0x0a, 0x15, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x74, 0x72, 0x65, + 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x74, 0x52, 0x12, 0x68, 0x61, 0x73, 0x68, 0x54, 0x72, 0x65, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x10, 0x68, 0x61, 0x73, 0x68, 0x5f, + 0x74, 0x72, 0x65, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x74, 0x52, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x54, 0x72, 0x65, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x5f, 0x61, + 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, + 0x68, 0x61, 0x73, 0x68, 0x54, 0x72, 0x65, 0x65, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, + 0x6d, 0x12, 0x24, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x5f, 0x73, + 0x61, 0x6c, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x68, 0x54, + 0x72, 0x65, 0x65, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x46, 0x0a, 0x0f, 0x66, 0x65, 0x63, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, + 0x52, 0x0d, 0x66, 0x65, 0x63, 0x44, 0x61, 0x74, 0x61, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x3d, 0x0a, 0x0a, 0x66, 0x65, 0x63, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x74, 0x52, 0x09, 0x66, 0x65, 0x63, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, + 0x0a, 0x09, 0x66, 0x65, 0x63, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x0d, 0x3a, 0x01, 0x32, 0x52, 0x08, 0x66, 0x65, 0x63, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x10, 0x6d, 0x65, 0x72, 0x67, + 0x65, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x43, 0x6f, 0x77, 0x4d, + 0x65, 0x72, 0x67, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, + 0x0a, 0x11, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x77, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x65, 0x73, 0x74, 0x69, 0x6d, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x31, 0x0a, 0x15, 0x65, 0x73, + 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x6d, 0x61, 0x78, 0x18, 0x14, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x65, 0x73, 0x74, 0x69, 0x6d, + 0x61, 0x74, 0x65, 0x4f, 0x70, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x22, 0x68, 0x0a, + 0x15, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x27, + 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x0e, 0x56, 0x41, 0x42, 0x43, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x74, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x73, 0x22, 0x87, 0x03, 0x0a, 0x18, 0x44, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x45, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, + 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x44, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x29, 0x0a, 0x10, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x61, 0x62, 0x63, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x76, + 0x61, 0x62, 0x63, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x76, 0x61, + 0x62, 0x63, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x76, 0x61, 0x62, 0x63, + 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x77, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x63, 0x6f, 0x77, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x50, 0x0a, 0x10, 0x76, 0x61, 0x62, 0x63, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x68, + 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x56, 0x41, 0x42, 0x43, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x53, 0x65, 0x74, 0x52, 0x0e, 0x76, 0x61, 0x62, 0x63, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x53, 0x65, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, + 0x6f, 0x72, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x41, 0x70, 0x65, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, + 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x64, 0x65, + 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x4d, + 0x0a, 0x0c, 0x41, 0x70, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3d, + 0x0a, 0x09, 0x61, 0x70, 0x65, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x41, 0x70, 0x65, 0x78, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x61, 0x70, 0x65, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xdf, 0x04, + 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x4d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x04, 0x34, 0x30, 0x39, 0x36, + 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x26, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x01, 0x30, 0x52, 0x0c, 0x6d, 0x69, 0x6e, + 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x6e, 0x0a, 0x1a, 0x64, 0x79, 0x6e, 0x61, 0x6d, + 0x69, 0x63, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x63, 0x68, + 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x18, 0x64, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x3d, + 0x0a, 0x09, 0x61, 0x70, 0x65, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x11, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x41, 0x70, 0x65, 0x78, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x61, 0x70, 0x65, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x30, 0x0a, + 0x14, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x50, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4a, + 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x06, 0x10, + 0x07, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, + 0x09, 0x10, 0x0a, 0x4a, 0x04, 0x08, 0x0a, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x42, + 0x04, 0x5a, 0x02, 0x2e, 0x2f, } var ( @@ -1631,55 +1741,52 @@ func file_update_metadata_proto_rawDescGZIP() []byte { } var file_update_metadata_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_update_metadata_proto_msgTypes = make([]protoimpl.MessageInfo, 11) -var file_update_metadata_proto_goTypes = []any{ +var file_update_metadata_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_update_metadata_proto_goTypes = []interface{}{ (InstallOperation_Type)(0), // 0: chromeos_update_engine.InstallOperation.Type (CowMergeOperation_Type)(0), // 1: chromeos_update_engine.CowMergeOperation.Type (*Extent)(nil), // 2: chromeos_update_engine.Extent (*Signatures)(nil), // 3: chromeos_update_engine.Signatures (*PartitionInfo)(nil), // 4: chromeos_update_engine.PartitionInfo - (*ImageInfo)(nil), // 5: chromeos_update_engine.ImageInfo - (*InstallOperation)(nil), // 6: chromeos_update_engine.InstallOperation - (*CowMergeOperation)(nil), // 7: chromeos_update_engine.CowMergeOperation - (*PartitionUpdate)(nil), // 8: chromeos_update_engine.PartitionUpdate - (*DynamicPartitionGroup)(nil), // 9: chromeos_update_engine.DynamicPartitionGroup + (*InstallOperation)(nil), // 5: chromeos_update_engine.InstallOperation + (*CowMergeOperation)(nil), // 6: chromeos_update_engine.CowMergeOperation + (*PartitionUpdate)(nil), // 7: chromeos_update_engine.PartitionUpdate + (*DynamicPartitionGroup)(nil), // 8: chromeos_update_engine.DynamicPartitionGroup + (*VABCFeatureSet)(nil), // 9: chromeos_update_engine.VABCFeatureSet (*DynamicPartitionMetadata)(nil), // 10: chromeos_update_engine.DynamicPartitionMetadata - (*DeltaArchiveManifest)(nil), // 11: chromeos_update_engine.DeltaArchiveManifest - (*Signatures_Signature)(nil), // 12: chromeos_update_engine.Signatures.Signature + (*ApexInfo)(nil), // 11: chromeos_update_engine.ApexInfo + (*ApexMetadata)(nil), // 12: chromeos_update_engine.ApexMetadata + (*DeltaArchiveManifest)(nil), // 13: chromeos_update_engine.DeltaArchiveManifest + (*Signatures_Signature)(nil), // 14: chromeos_update_engine.Signatures.Signature } var file_update_metadata_proto_depIdxs = []int32{ - 12, // 0: chromeos_update_engine.Signatures.signatures:type_name -> chromeos_update_engine.Signatures.Signature + 14, // 0: chromeos_update_engine.Signatures.signatures:type_name -> chromeos_update_engine.Signatures.Signature 0, // 1: chromeos_update_engine.InstallOperation.type:type_name -> chromeos_update_engine.InstallOperation.Type 2, // 2: chromeos_update_engine.InstallOperation.src_extents:type_name -> chromeos_update_engine.Extent 2, // 3: chromeos_update_engine.InstallOperation.dst_extents:type_name -> chromeos_update_engine.Extent 1, // 4: chromeos_update_engine.CowMergeOperation.type:type_name -> chromeos_update_engine.CowMergeOperation.Type 2, // 5: chromeos_update_engine.CowMergeOperation.src_extent:type_name -> chromeos_update_engine.Extent 2, // 6: chromeos_update_engine.CowMergeOperation.dst_extent:type_name -> chromeos_update_engine.Extent - 12, // 7: chromeos_update_engine.PartitionUpdate.new_partition_signature:type_name -> chromeos_update_engine.Signatures.Signature + 14, // 7: chromeos_update_engine.PartitionUpdate.new_partition_signature:type_name -> chromeos_update_engine.Signatures.Signature 4, // 8: chromeos_update_engine.PartitionUpdate.old_partition_info:type_name -> chromeos_update_engine.PartitionInfo 4, // 9: chromeos_update_engine.PartitionUpdate.new_partition_info:type_name -> chromeos_update_engine.PartitionInfo - 6, // 10: chromeos_update_engine.PartitionUpdate.operations:type_name -> chromeos_update_engine.InstallOperation + 5, // 10: chromeos_update_engine.PartitionUpdate.operations:type_name -> chromeos_update_engine.InstallOperation 2, // 11: chromeos_update_engine.PartitionUpdate.hash_tree_data_extent:type_name -> chromeos_update_engine.Extent 2, // 12: chromeos_update_engine.PartitionUpdate.hash_tree_extent:type_name -> chromeos_update_engine.Extent 2, // 13: chromeos_update_engine.PartitionUpdate.fec_data_extent:type_name -> chromeos_update_engine.Extent 2, // 14: chromeos_update_engine.PartitionUpdate.fec_extent:type_name -> chromeos_update_engine.Extent - 7, // 15: chromeos_update_engine.PartitionUpdate.merge_operations:type_name -> chromeos_update_engine.CowMergeOperation - 9, // 16: chromeos_update_engine.DynamicPartitionMetadata.groups:type_name -> chromeos_update_engine.DynamicPartitionGroup - 6, // 17: chromeos_update_engine.DeltaArchiveManifest.install_operations:type_name -> chromeos_update_engine.InstallOperation - 6, // 18: chromeos_update_engine.DeltaArchiveManifest.kernel_install_operations:type_name -> chromeos_update_engine.InstallOperation - 4, // 19: chromeos_update_engine.DeltaArchiveManifest.old_kernel_info:type_name -> chromeos_update_engine.PartitionInfo - 4, // 20: chromeos_update_engine.DeltaArchiveManifest.new_kernel_info:type_name -> chromeos_update_engine.PartitionInfo - 4, // 21: chromeos_update_engine.DeltaArchiveManifest.old_rootfs_info:type_name -> chromeos_update_engine.PartitionInfo - 4, // 22: chromeos_update_engine.DeltaArchiveManifest.new_rootfs_info:type_name -> chromeos_update_engine.PartitionInfo - 5, // 23: chromeos_update_engine.DeltaArchiveManifest.old_image_info:type_name -> chromeos_update_engine.ImageInfo - 5, // 24: chromeos_update_engine.DeltaArchiveManifest.new_image_info:type_name -> chromeos_update_engine.ImageInfo - 8, // 25: chromeos_update_engine.DeltaArchiveManifest.partitions:type_name -> chromeos_update_engine.PartitionUpdate - 10, // 26: chromeos_update_engine.DeltaArchiveManifest.dynamic_partition_metadata:type_name -> chromeos_update_engine.DynamicPartitionMetadata - 27, // [27:27] is the sub-list for method output_type - 27, // [27:27] is the sub-list for method input_type - 27, // [27:27] is the sub-list for extension type_name - 27, // [27:27] is the sub-list for extension extendee - 0, // [0:27] is the sub-list for field type_name + 6, // 15: chromeos_update_engine.PartitionUpdate.merge_operations:type_name -> chromeos_update_engine.CowMergeOperation + 8, // 16: chromeos_update_engine.DynamicPartitionMetadata.groups:type_name -> chromeos_update_engine.DynamicPartitionGroup + 9, // 17: chromeos_update_engine.DynamicPartitionMetadata.vabc_feature_set:type_name -> chromeos_update_engine.VABCFeatureSet + 11, // 18: chromeos_update_engine.ApexMetadata.apex_info:type_name -> chromeos_update_engine.ApexInfo + 7, // 19: chromeos_update_engine.DeltaArchiveManifest.partitions:type_name -> chromeos_update_engine.PartitionUpdate + 10, // 20: chromeos_update_engine.DeltaArchiveManifest.dynamic_partition_metadata:type_name -> chromeos_update_engine.DynamicPartitionMetadata + 11, // 21: chromeos_update_engine.DeltaArchiveManifest.apex_info:type_name -> chromeos_update_engine.ApexInfo + 22, // [22:22] is the sub-list for method output_type + 22, // [22:22] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_update_metadata_proto_init() } @@ -1688,7 +1795,7 @@ func file_update_metadata_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_update_metadata_proto_msgTypes[0].Exporter = func(v any, i int) any { + file_update_metadata_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Extent); i { case 0: return &v.state @@ -1700,7 +1807,7 @@ func file_update_metadata_proto_init() { return nil } } - file_update_metadata_proto_msgTypes[1].Exporter = func(v any, i int) any { + file_update_metadata_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Signatures); i { case 0: return &v.state @@ -1712,7 +1819,7 @@ func file_update_metadata_proto_init() { return nil } } - file_update_metadata_proto_msgTypes[2].Exporter = func(v any, i int) any { + file_update_metadata_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartitionInfo); i { case 0: return &v.state @@ -1724,8 +1831,8 @@ func file_update_metadata_proto_init() { return nil } } - file_update_metadata_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*ImageInfo); i { + file_update_metadata_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstallOperation); i { case 0: return &v.state case 1: @@ -1736,8 +1843,8 @@ func file_update_metadata_proto_init() { return nil } } - file_update_metadata_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*InstallOperation); i { + file_update_metadata_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CowMergeOperation); i { case 0: return &v.state case 1: @@ -1748,8 +1855,8 @@ func file_update_metadata_proto_init() { return nil } } - file_update_metadata_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*CowMergeOperation); i { + file_update_metadata_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartitionUpdate); i { case 0: return &v.state case 1: @@ -1760,8 +1867,8 @@ func file_update_metadata_proto_init() { return nil } } - file_update_metadata_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*PartitionUpdate); i { + file_update_metadata_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DynamicPartitionGroup); i { case 0: return &v.state case 1: @@ -1772,8 +1879,8 @@ func file_update_metadata_proto_init() { return nil } } - file_update_metadata_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*DynamicPartitionGroup); i { + file_update_metadata_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VABCFeatureSet); i { case 0: return &v.state case 1: @@ -1784,7 +1891,7 @@ func file_update_metadata_proto_init() { return nil } } - file_update_metadata_proto_msgTypes[8].Exporter = func(v any, i int) any { + file_update_metadata_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DynamicPartitionMetadata); i { case 0: return &v.state @@ -1796,7 +1903,31 @@ func file_update_metadata_proto_init() { return nil } } - file_update_metadata_proto_msgTypes[9].Exporter = func(v any, i int) any { + file_update_metadata_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ApexInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_update_metadata_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ApexMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_update_metadata_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeltaArchiveManifest); i { case 0: return &v.state @@ -1808,7 +1939,7 @@ func file_update_metadata_proto_init() { return nil } } - file_update_metadata_proto_msgTypes[10].Exporter = func(v any, i int) any { + file_update_metadata_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Signatures_Signature); i { case 0: return &v.state @@ -1827,7 +1958,7 @@ func file_update_metadata_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_update_metadata_proto_rawDesc, NumEnums: 2, - NumMessages: 11, + NumMessages: 13, NumExtensions: 0, NumServices: 0, }, diff --git a/go.mod b/go.mod index ed5cd1f..65dfe6d 100644 --- a/go.mod +++ b/go.mod @@ -13,5 +13,6 @@ require ( github.com/VividCortex/ewma v1.1.1 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/valyala/gozstd v1.21.1 // indirect golang.org/x/sys v0.22.0 // indirect ) diff --git a/go.sum b/go.sum index 8827ffd..f6d7ff0 100644 --- a/go.sum +++ b/go.sum @@ -9,6 +9,8 @@ github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/Qd github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/spencercw/go-xz v0.0.0-20181128201811-c82a2123b492 h1:8J9q7E8tGpVB84cBsMr+X160ECRqwYhkZ6KeaY9kN1I= github.com/spencercw/go-xz v0.0.0-20181128201811-c82a2123b492/go.mod h1:EvRrgz1GcjNV5yfN+ISxA4sxn255MimeGQ/ROJnQPtQ= +github.com/valyala/gozstd v1.21.1 h1:TQFZVTk5zo7iJcX3o4XYBJujPdO31LFb4fVImwK873A= +github.com/valyala/gozstd v1.21.1/go.mod h1:y5Ew47GLlP37EkTB+B4s7r6A5rdaeB7ftbl9zoYiIPQ= github.com/vbauerster/mpb/v5 v5.4.0 h1:n8JPunifvQvh6P1D1HAl2Ur9YcmKT1tpoUuiea5mlmg= github.com/vbauerster/mpb/v5 v5.4.0/go.mod h1:fi4wVo7BVQ22QcvFObm+VwliQXlV1eBT8JDaKXR4JGI= golang.org/x/sys v0.0.0-20201218084310-7d0127a74742/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/payload.go b/payload.go index 261d634..a558ec7 100644 --- a/payload.go +++ b/payload.go @@ -12,6 +12,7 @@ import ( "os" "sort" "sync" + "github.com/valyala/gozstd" humanize "github.com/dustin/go-humanize" xz "github.com/spencercw/go-xz" @@ -290,6 +291,17 @@ func (p *Payload) Extract(partition *chromeos_update_engine.PartitionUpdate, out } break + case chromeos_update_engine.InstallOperation_ZSTD: + reader := gozstd.NewReader(teeReader) + n, err := io.Copy(out, reader) + if err != nil { + return err + } + if n != expectedUncompressedBlockSize { + return fmt.Errorf("Verify failed (Unexpected bytes written): %s (%d != %d)", name, n, expectedUncompressedBlockSize) + } + break + case chromeos_update_engine.InstallOperation_ZERO: reader := bytes.NewReader(make([]byte, expectedUncompressedBlockSize)) n, err := io.Copy(out, reader) diff --git a/update_metadata.proto b/update_metadata.proto index a2eccb5..e150c55 100644 --- a/update_metadata.proto +++ b/update_metadata.proto @@ -13,6 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. // + // Update file format: An update file contains all the operations needed // to update a system to a specific version. It can be a full payload which // can update from any version, or a delta payload which can only update @@ -48,11 +49,14 @@ // char payload_signatures_message[payload_signatures_message_size]; // // }; + // The DeltaArchiveManifest protobuf is an ordered list of InstallOperation // objects. These objects are stored in a linear array in the // DeltaArchiveManifest. Each operation is applied in order by the client. + // The DeltaArchiveManifest also contains the initial and final // checksums for the device. + // The client will perform each InstallOperation in order, beginning even // before the entire delta file is downloaded (but after at least the // protobuf is downloaded). The types of operations are explained: @@ -84,9 +88,13 @@ // // The operations allowed in the payload (supported by the client) depend on the // major and minor version. See InstallOperation.Type below for details. + syntax = "proto2"; + package chromeos_update_engine; -option optimize_for = LITE_RUNTIME; + +option go_package = "./"; + // Data is packed into blocks on disk, always starting from the beginning // of the block. If a file's data is too large for one block, it overflows // into another block, which may or may not be the following block on the @@ -99,10 +107,12 @@ option optimize_for = LITE_RUNTIME; // run-length encoding). // A sentinel value (kuint64max) as the start block denotes a sparse-hole // in a file whose block-length is specified by num_blocks. + message Extent { optional uint64 start_block = 1; optional uint64 num_blocks = 2; } + // Signatures: Updates may be signed by the OS vendor. The client verifies // an update's signature by hashing the entire download. The section of the // download that contains the signature is at the end of the file, so when @@ -114,10 +124,12 @@ message Extent { // selects a Signature message and uses that, along with a known public key, // to verify the download. The public key is expected to be part of the // client. + message Signatures { message Signature { optional uint32 version = 1 [deprecated = true]; optional bytes data = 2; + // The DER encoded signature size of EC keys is nondeterministic for // different input of sha256 hash. However, we need the size of the // serialized signatures protobuf string to be fixed before signing; @@ -129,47 +141,46 @@ message Signatures { } repeated Signature signatures = 1; } + message PartitionInfo { optional uint64 size = 1; optional bytes hash = 2; } -// Describe an image we are based on in a human friendly way. -// Examples: -// dev-channel, x86-alex, 1.2.3, mp-v3 -// nplusone-channel, x86-alex, 1.2.4, mp-v3, dev-channel, 1.2.3 -// -// All fields will be set, if this message is present. -message ImageInfo { - optional string board = 1; - optional string key = 2; - optional string channel = 3; - optional string version = 4; - // If these values aren't present, they should be assumed to match - // the equivalent value above. They are normally only different for - // special image types such as nplusone images. - optional string build_channel = 5; - optional string build_version = 6; -} + message InstallOperation { enum Type { REPLACE = 0; // Replace destination extents w/ attached data. REPLACE_BZ = 1; // Replace destination extents w/ attached bzipped data. MOVE = 2 [deprecated = true]; // Move source extents to target extents. BSDIFF = 3 [deprecated = true]; // The data is a bsdiff binary diff. + // On minor version 2 or newer, these operations are supported: - SOURCE_COPY = 4; // Copy from source to target partition - SOURCE_BSDIFF = 5; // Like BSDIFF, but read from source partition + SOURCE_COPY = 4; // Copy from source to target partition + SOURCE_BSDIFF = 5; // Like BSDIFF, but read from source partition + // On minor version 3 or newer and on major version 2 or newer, these // operations are supported: - REPLACE_XZ = 8; // Replace destination extents w/ attached xz data. + REPLACE_XZ = 8; // Replace destination extents w/ attached xz data. + // On minor version 4 or newer, these operations are supported: - ZERO = 6; // Write zeros in the destination. + ZERO = 6; // Write zeros in the destination. DISCARD = 7; // Discard the destination blocks, reading as undefined. BROTLI_BSDIFF = 10; // Like SOURCE_BSDIFF, but compressed with brotli. + // On minor version 5 or newer, these operations are supported: PUFFDIFF = 9; // The data is in puffdiff format. + + // On minor version 8 or newer, these operations are supported: + ZUCCHINI = 11; + + // On minor version 9 or newer, these operations are supported: + LZ4DIFF_BSDIFF = 12; + LZ4DIFF_PUFFDIFF = 13; + + ZSTD = 14; } required Type type = 1; + // Only minor version 6 or newer support 64 bits |data_offset| and // |data_length|, older client will read them as uint32. // The offset into the delta file (after the protobuf) @@ -177,6 +188,7 @@ message InstallOperation { optional uint64 data_offset = 2; // The length of the data in the delta file optional uint64 data_length = 3; + // Ordered list of extents that are read from (if any) and written to. repeated Extent src_extents = 4; // Byte length of src, equal to the number of blocks in src_extents * @@ -184,22 +196,26 @@ message InstallOperation { // pass that external program the number of bytes to read from the blocks we // pass it. This is not used in any other operation. optional uint64 src_length = 5; + repeated Extent dst_extents = 6; // Byte length of dst, equal to the number of blocks in dst_extents * // block_size. Used for BSDIFF and SOURCE_BSDIFF, but not in any other // operation. optional uint64 dst_length = 7; + // Optional SHA 256 hash of the blob associated with this operation. // This is used as a primary validation for http-based downloads and // as a defense-in-depth validation for https-based downloads. If // the operation doesn't refer to any blob, this field will have // zero bytes. optional bytes data_sha256_hash = 8; + // Indicates the SHA 256 hash of the source data referenced in src_extents at // the time of applying the operation. If present, the update_engine daemon // MUST read and verify the source data before applying the operation. optional bytes src_sha256_hash = 9; } + // Hints to VAB snapshot to skip writing some blocks if these blocks are // identical to the ones on the source image. The src & dst extents for each // CowMergeOperation should be contiguous, and they're a subset of an OTA @@ -208,78 +224,125 @@ message InstallOperation { // read after write, similar to the inplace update schema. message CowMergeOperation { enum Type { - COW_COPY = 0; // identical blocks + COW_COPY = 0; // identical blocks + COW_XOR = 1; // used when src/dst blocks are highly similar + COW_REPLACE = 2; // Raw replace operation } optional Type type = 1; + optional Extent src_extent = 2; optional Extent dst_extent = 3; + // For COW_XOR, source location might be unaligned, so this field is in range + // [0, block_size), representing how much should the src_extent shift toward + // larger block number. If this field is non-zero, then src_extent will + // include 1 extra block in the end, as the merge op actually references the + // first |src_offset| bytes of that extra block. For example, if |dst_extent| + // is [10, 15], |src_offset| is 500, then src_extent might look like [25, 31]. + // Note that |src_extent| contains 1 extra block than the |dst_extent|. + optional uint32 src_offset = 4; } + // Describes the update to apply to a single partition. message PartitionUpdate { // A platform-specific name to identify the partition set being updated. For // example, in Chrome OS this could be "ROOT" or "KERNEL". required string partition_name = 1; + // Whether this partition carries a filesystem with post-install program that // must be run to finalize the update process. See also |postinstall_path| and // |filesystem_type|. optional bool run_postinstall = 2; + // The path of the executable program to run during the post-install step, // relative to the root of this filesystem. If not set, the default "postinst" // will be used. This setting is only used when |run_postinstall| is set and // true. optional string postinstall_path = 3; + // The filesystem type as passed to the mount(2) syscall when mounting the new // filesystem to run the post-install program. If not set, a fixed list of // filesystems will be attempted. This setting is only used if // |run_postinstall| is set and true. optional string filesystem_type = 4; + // If present, a list of signatures of the new_partition_info.hash signed with // different keys. If the update_engine daemon requires vendor-signed images // and has its public key installed, one of the signatures should be valid // for /postinstall to run. repeated Signatures.Signature new_partition_signature = 5; + optional PartitionInfo old_partition_info = 6; optional PartitionInfo new_partition_info = 7; + // The list of operations to be performed to apply this PartitionUpdate. The // associated operation blobs (in operations[i].data_offset, data_length) // should be stored contiguously and in the same order. repeated InstallOperation operations = 8; + // Whether a failure in the postinstall step for this partition should be // ignored. optional bool postinstall_optional = 9; + // On minor version 6 or newer, these fields are supported: + // The extent for data covered by verity hash tree. optional Extent hash_tree_data_extent = 10; + // The extent to store verity hash tree. optional Extent hash_tree_extent = 11; + // The hash algorithm used in verity hash tree. optional string hash_tree_algorithm = 12; + // The salt used for verity hash tree. optional bytes hash_tree_salt = 13; + // The extent for data covered by FEC. optional Extent fec_data_extent = 14; + // The extent to store FEC. optional Extent fec_extent = 15; + // The number of FEC roots. optional uint32 fec_roots = 16 [default = 2]; + // Per-partition version used for downgrade detection, added // as an effort to support partial updates. For most partitions, // this is the build timestamp. optional string version = 17; + // A sorted list of CowMergeOperation. When writing cow, we can choose to // skip writing the raw bytes for these extents. During snapshot merge, the // bytes will read from the source partitions instead. repeated CowMergeOperation merge_operations = 18; + + // Estimated size for COW image. This is used by libsnapshot + // as a hint. If set to 0, libsnapshot should use alternative + // methods for estimating size. + optional uint64 estimate_cow_size = 19; + + // Information about the cow used by Cow Writer to specify + // number of cow operations to be written + optional uint64 estimate_op_count_max = 20; } + message DynamicPartitionGroup { // Name of the group. required string name = 1; + // Maximum size of the group. The sum of sizes of all partitions in the group // must not exceed the maximum size of the group. optional uint64 size = 2; + // A list of partitions that belong to the group. repeated string partition_names = 3; } + +message VABCFeatureSet { + optional bool threaded = 1; + optional bool batch_writes = 2; +} + // Metadata related to all dynamic partitions. message DynamicPartitionMetadata { // All updatable groups present in |partitions| of this DeltaArchiveManifest. @@ -289,20 +352,60 @@ message DynamicPartitionMetadata { // - If an updatable group is in the manifest but not on the device, the group // is added to the device. repeated DynamicPartitionGroup groups = 1; + // Whether dynamic partitions have snapshots during the update. If this is // set to true, the update_engine daemon creates snapshots for all dynamic // partitions if possible. If this is unset, the update_engine daemon MUST // NOT create snapshots for dynamic partitions. optional bool snapshot_enabled = 2; + + // If this is set to false, update_engine should not use VABC regardless. If + // this is set to true, update_engine may choose to use VABC if device + // supports it, but not guaranteed. + // VABC stands for Virtual AB Compression + optional bool vabc_enabled = 3; + + // The compression algorithm used by VABC. Available ones are "gz", "brotli". + // See system/core/fs_mgr/libsnapshot/cow_writer.cpp for available options, + // as this parameter is ultimated forwarded to libsnapshot's CowWriter + optional string vabc_compression_param = 4; + + // COW version used by VABC. The represents the major version in the COW + // header + optional uint32 cow_version = 5; + + // A collection of knobs to tune Virtual AB Compression + optional VABCFeatureSet vabc_feature_set = 6; + + // Max bytes to be compressed at once during ota. Options: 4k, 8k, 16k, 32k, + // 64k, 128k + optional uint64 compression_factor = 7; +} + +// Definition has been duplicated from +// $ANDROID_BUILD_TOP/build/tools/releasetools/ota_metadata.proto. Keep in sync. +message ApexInfo { + optional string package_name = 1; + optional int64 version = 2; + optional bool is_compressed = 3; + optional int64 decompressed_size = 4; +} + +// Definition has been duplicated from +// $ANDROID_BUILD_TOP/build/tools/releasetools/ota_metadata.proto. Keep in sync. +message ApexMetadata { + repeated ApexInfo apex_info = 1; } + message DeltaArchiveManifest { // Only present in major version = 1. List of install operations for the // kernel and rootfs partitions. For major version = 2 see the |partitions| // field. - repeated InstallOperation install_operations = 1 [deprecated = true]; - repeated InstallOperation kernel_install_operations = 2 [deprecated = true]; + reserved 1, 2; + // (At time of writing) usually 4096 optional uint32 block_size = 3 [default = 4096]; + // If signatures are present, the offset into the blobs, generally // tacked onto the end of the file, and the length. We use an offset // rather than a bool to allow for more flexibility in future file formats. @@ -310,18 +413,14 @@ message DeltaArchiveManifest { // file. optional uint64 signatures_offset = 4; optional uint64 signatures_size = 5; - // Only present in major version = 1. Partition metadata used to validate the - // update. For major version = 2 see the |partitions| field. - optional PartitionInfo old_kernel_info = 6 [deprecated = true]; - optional PartitionInfo new_kernel_info = 7 [deprecated = true]; - optional PartitionInfo old_rootfs_info = 8 [deprecated = true]; - optional PartitionInfo new_rootfs_info = 9 [deprecated = true]; - // old_image_info will only be present for delta images. - optional ImageInfo old_image_info = 10; - optional ImageInfo new_image_info = 11; + + // Fields deprecated in major version 2. + reserved 6,7,8,9,10,11; + // The minor version, also referred as "delta version", of the payload. // Minor version 0 is full payload, everything else is delta payload. optional uint32 minor_version = 12 [default = 0]; + // Only present in major version >= 2. List of partitions that will be // updated, in the order they will be updated. This field replaces the // |install_operations|, |kernel_install_operations| and the @@ -329,11 +428,22 @@ message DeltaArchiveManifest { // array can have more than two partitions if needed, and they are identified // by the partition name. repeated PartitionUpdate partitions = 13; + // The maximum timestamp of the OS allowed to apply this payload. // Can be used to prevent downgrading the OS. optional int64 max_timestamp = 14; + // Metadata related to all dynamic partitions. optional DynamicPartitionMetadata dynamic_partition_metadata = 15; + // If the payload only updates a subset of partitions on the device. optional bool partial_update = 16; + + // Information on compressed APEX to figure out how much space is required for + // their decompression + repeated ApexInfo apex_info = 17; + + // Security patch level of the device, usually in the format of + // yyyy-mm-dd + optional string security_patch_level = 18; }