From 850a09e75aacef559b5fdddf435c64c5dceb38a3 Mon Sep 17 00:00:00 2001 From: Jayant Shrivastava Date: Thu, 19 Nov 2020 17:31:39 -0500 Subject: [PATCH] sql: implement sequence caching Previously, incrementing sequences at a high throughput would result in many distributed writes to the KV layer due to MVCC. This has caused garbage collection problems in the past. This would occur in situations such as bulk importing data while using the sequence number as an id for each new row being added. This change allows clients to cache sequence numbers in their local session data. When the cache is empty, the sequence will be incremented once by the cache size * increment amount, which are both sequence options. Then, all the intermediate values will be cached locally on a node to be given out whenever the sequence is incremented. To accommodate schema changes, cached sequences values will be invalidated when new descriptor versions are seen by the cache. This invalidation can occur when old versions are seen as well to accommodate schema change rollbacks. Release note (sql change): Using the CACHE sequence option no longer results in an "unimplemented" error. The CACHE option is now fully implemented and will allow nodes to cache sequence numbers. A cache size of 1 means that there is no cache, and cache sizes of less than 1 are not valid. --- pkg/sql/catalog/descpb/structured.pb.go | 800 +++++++++--------- pkg/sql/catalog/descpb/structured.proto | 4 + pkg/sql/catalog/systemschema/system.go | 1 + pkg/sql/exec_util.go | 5 + .../logictest/testdata/logic_test/sequences | 73 +- pkg/sql/planner.go | 10 + pkg/sql/sequence.go | 66 +- pkg/sql/sequence_test.go | 288 ++++++- pkg/sql/sessiondata/BUILD.bazel | 1 + pkg/sql/sessiondata/sequence_cache.go | 69 ++ pkg/sql/sessiondata/session_data.go | 4 + 11 files changed, 914 insertions(+), 407 deletions(-) create mode 100644 pkg/sql/sessiondata/sequence_cache.go diff --git a/pkg/sql/catalog/descpb/structured.pb.go b/pkg/sql/catalog/descpb/structured.pb.go index dc5f9d9ca5c1..c8cb79d100c1 100644 --- a/pkg/sql/catalog/descpb/structured.pb.go +++ b/pkg/sql/catalog/descpb/structured.pb.go @@ -75,7 +75,7 @@ func (x *ConstraintValidity) UnmarshalJSON(data []byte) error { return nil } func (ConstraintValidity) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{0} + return fileDescriptor_structured_a57fd22810a6582f, []int{0} } // SystemColumnKind is an enum representing the different kind of system @@ -120,7 +120,7 @@ func (x *SystemColumnKind) UnmarshalJSON(data []byte) error { return nil } func (SystemColumnKind) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{1} + return fileDescriptor_structured_a57fd22810a6582f, []int{1} } // State indicates whether a descriptor is public (i.e., normally visible, @@ -172,7 +172,7 @@ func (x *DescriptorState) UnmarshalJSON(data []byte) error { return nil } func (DescriptorState) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{2} + return fileDescriptor_structured_a57fd22810a6582f, []int{2} } // SurvivalGoal is the survival goal for a database. @@ -211,7 +211,7 @@ func (x *SurvivalGoal) UnmarshalJSON(data []byte) error { return nil } func (SurvivalGoal) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{3} + return fileDescriptor_structured_a57fd22810a6582f, []int{3} } type ForeignKeyReference_Action int32 @@ -256,7 +256,7 @@ func (x *ForeignKeyReference_Action) UnmarshalJSON(data []byte) error { return nil } func (ForeignKeyReference_Action) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{0, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{0, 0} } // Match is the algorithm used to compare composite keys. @@ -296,7 +296,7 @@ func (x *ForeignKeyReference_Match) UnmarshalJSON(data []byte) error { return nil } func (ForeignKeyReference_Match) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{0, 1} + return fileDescriptor_structured_a57fd22810a6582f, []int{0, 1} } // The direction of a column in the index. @@ -333,7 +333,7 @@ func (x *IndexDescriptor_Direction) UnmarshalJSON(data []byte) error { return nil } func (IndexDescriptor_Direction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{8, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{8, 0} } // The type of the index. @@ -370,7 +370,7 @@ func (x *IndexDescriptor_Type) UnmarshalJSON(data []byte) error { return nil } func (IndexDescriptor_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{8, 1} + return fileDescriptor_structured_a57fd22810a6582f, []int{8, 1} } type ConstraintToUpdate_ConstraintType int32 @@ -416,7 +416,7 @@ func (x *ConstraintToUpdate_ConstraintType) UnmarshalJSON(data []byte) error { return nil } func (ConstraintToUpdate_ConstraintType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{9, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{9, 0} } // A descriptor within a mutation is unavailable for reads, writes @@ -481,7 +481,7 @@ func (x *DescriptorMutation_State) UnmarshalJSON(data []byte) error { return nil } func (DescriptorMutation_State) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{13, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{13, 0} } // Direction of mutation. @@ -524,7 +524,7 @@ func (x *DescriptorMutation_Direction) UnmarshalJSON(data []byte) error { return nil } func (DescriptorMutation_Direction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{13, 1} + return fileDescriptor_structured_a57fd22810a6582f, []int{13, 1} } // AuditMode indicates which auditing actions to take when this table is used. @@ -561,7 +561,7 @@ func (x *TableDescriptor_AuditMode) UnmarshalJSON(data []byte) error { return nil } func (TableDescriptor_AuditMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{15, 0} } // Represents the kind of type that this type descriptor represents. @@ -606,7 +606,7 @@ func (x *TypeDescriptor_Kind) UnmarshalJSON(data []byte) error { return nil } func (TypeDescriptor_Kind) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{17, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{17, 0} } // Represents what operations are allowed on this ENUM member. @@ -647,7 +647,7 @@ func (x *TypeDescriptor_EnumMember_Capability) UnmarshalJSON(data []byte) error return nil } func (TypeDescriptor_EnumMember_Capability) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{17, 0, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{17, 0, 0} } type TypeDescriptor_EnumMember_Direction int32 @@ -689,7 +689,7 @@ func (x *TypeDescriptor_EnumMember_Direction) UnmarshalJSON(data []byte) error { return nil } func (TypeDescriptor_EnumMember_Direction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{17, 0, 1} + return fileDescriptor_structured_a57fd22810a6582f, []int{17, 0, 1} } // ForeignKeyReference is deprecated, replaced by ForeignKeyConstraint in v19.2 @@ -719,7 +719,7 @@ func (m *ForeignKeyReference) Reset() { *m = ForeignKeyReference{} } func (m *ForeignKeyReference) String() string { return proto.CompactTextString(m) } func (*ForeignKeyReference) ProtoMessage() {} func (*ForeignKeyReference) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{0} + return fileDescriptor_structured_a57fd22810a6582f, []int{0} } func (m *ForeignKeyReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -767,7 +767,7 @@ func (m *ForeignKeyConstraint) Reset() { *m = ForeignKeyConstraint{} } func (m *ForeignKeyConstraint) String() string { return proto.CompactTextString(m) } func (*ForeignKeyConstraint) ProtoMessage() {} func (*ForeignKeyConstraint) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{1} + return fileDescriptor_structured_a57fd22810a6582f, []int{1} } func (m *ForeignKeyConstraint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -805,7 +805,7 @@ func (m *UniqueWithoutIndexConstraint) Reset() { *m = UniqueWithoutIndex func (m *UniqueWithoutIndexConstraint) String() string { return proto.CompactTextString(m) } func (*UniqueWithoutIndexConstraint) ProtoMessage() {} func (*UniqueWithoutIndexConstraint) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{2} + return fileDescriptor_structured_a57fd22810a6582f, []int{2} } func (m *UniqueWithoutIndexConstraint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -873,7 +873,7 @@ func (m *ColumnDescriptor) Reset() { *m = ColumnDescriptor{} } func (m *ColumnDescriptor) String() string { return proto.CompactTextString(m) } func (*ColumnDescriptor) ProtoMessage() {} func (*ColumnDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{3} + return fileDescriptor_structured_a57fd22810a6582f, []int{3} } func (m *ColumnDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -929,7 +929,7 @@ func (m *ColumnFamilyDescriptor) Reset() { *m = ColumnFamilyDescriptor{} func (m *ColumnFamilyDescriptor) String() string { return proto.CompactTextString(m) } func (*ColumnFamilyDescriptor) ProtoMessage() {} func (*ColumnFamilyDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{4} + return fileDescriptor_structured_a57fd22810a6582f, []int{4} } func (m *ColumnFamilyDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -975,7 +975,7 @@ func (m *InterleaveDescriptor) Reset() { *m = InterleaveDescriptor{} } func (m *InterleaveDescriptor) String() string { return proto.CompactTextString(m) } func (*InterleaveDescriptor) ProtoMessage() {} func (*InterleaveDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{5} + return fileDescriptor_structured_a57fd22810a6582f, []int{5} } func (m *InterleaveDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1019,7 +1019,7 @@ func (m *InterleaveDescriptor_Ancestor) Reset() { *m = InterleaveDescrip func (m *InterleaveDescriptor_Ancestor) String() string { return proto.CompactTextString(m) } func (*InterleaveDescriptor_Ancestor) ProtoMessage() {} func (*InterleaveDescriptor_Ancestor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{5, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{5, 0} } func (m *InterleaveDescriptor_Ancestor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1074,7 +1074,7 @@ func (m *ShardedDescriptor) Reset() { *m = ShardedDescriptor{} } func (m *ShardedDescriptor) String() string { return proto.CompactTextString(m) } func (*ShardedDescriptor) ProtoMessage() {} func (*ShardedDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{6} + return fileDescriptor_structured_a57fd22810a6582f, []int{6} } func (m *ShardedDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1125,7 +1125,7 @@ func (m *PartitioningDescriptor) Reset() { *m = PartitioningDescriptor{} func (m *PartitioningDescriptor) String() string { return proto.CompactTextString(m) } func (*PartitioningDescriptor) ProtoMessage() {} func (*PartitioningDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{7} + return fileDescriptor_structured_a57fd22810a6582f, []int{7} } func (m *PartitioningDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1168,7 +1168,7 @@ func (m *PartitioningDescriptor_List) Reset() { *m = PartitioningDescrip func (m *PartitioningDescriptor_List) String() string { return proto.CompactTextString(m) } func (*PartitioningDescriptor_List) ProtoMessage() {} func (*PartitioningDescriptor_List) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{7, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{7, 0} } func (m *PartitioningDescriptor_List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1213,7 +1213,7 @@ func (m *PartitioningDescriptor_Range) Reset() { *m = PartitioningDescri func (m *PartitioningDescriptor_Range) String() string { return proto.CompactTextString(m) } func (*PartitioningDescriptor_Range) ProtoMessage() {} func (*PartitioningDescriptor_Range) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{7, 1} + return fileDescriptor_structured_a57fd22810a6582f, []int{7, 1} } func (m *PartitioningDescriptor_Range) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1380,7 +1380,7 @@ func (m *IndexDescriptor) Reset() { *m = IndexDescriptor{} } func (m *IndexDescriptor) String() string { return proto.CompactTextString(m) } func (*IndexDescriptor) ProtoMessage() {} func (*IndexDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{8} + return fileDescriptor_structured_a57fd22810a6582f, []int{8} } func (m *IndexDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1432,7 +1432,7 @@ func (m *ConstraintToUpdate) Reset() { *m = ConstraintToUpdate{} } func (m *ConstraintToUpdate) String() string { return proto.CompactTextString(m) } func (*ConstraintToUpdate) ProtoMessage() {} func (*ConstraintToUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{9} + return fileDescriptor_structured_a57fd22810a6582f, []int{9} } func (m *ConstraintToUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1479,7 +1479,7 @@ func (m *PrimaryKeySwap) Reset() { *m = PrimaryKeySwap{} } func (m *PrimaryKeySwap) String() string { return proto.CompactTextString(m) } func (*PrimaryKeySwap) ProtoMessage() {} func (*PrimaryKeySwap) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{10} + return fileDescriptor_structured_a57fd22810a6582f, []int{10} } func (m *PrimaryKeySwap) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1519,7 +1519,7 @@ func (m *ComputedColumnSwap) Reset() { *m = ComputedColumnSwap{} } func (m *ComputedColumnSwap) String() string { return proto.CompactTextString(m) } func (*ComputedColumnSwap) ProtoMessage() {} func (*ComputedColumnSwap) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{11} + return fileDescriptor_structured_a57fd22810a6582f, []int{11} } func (m *ComputedColumnSwap) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1567,7 +1567,7 @@ func (m *MaterializedViewRefresh) Reset() { *m = MaterializedViewRefresh func (m *MaterializedViewRefresh) String() string { return proto.CompactTextString(m) } func (*MaterializedViewRefresh) ProtoMessage() {} func (*MaterializedViewRefresh) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{12} + return fileDescriptor_structured_a57fd22810a6582f, []int{12} } func (m *MaterializedViewRefresh) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1624,7 +1624,7 @@ func (m *DescriptorMutation) Reset() { *m = DescriptorMutation{} } func (m *DescriptorMutation) String() string { return proto.CompactTextString(m) } func (*DescriptorMutation) ProtoMessage() {} func (*DescriptorMutation) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{13} + return fileDescriptor_structured_a57fd22810a6582f, []int{13} } func (m *DescriptorMutation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1962,7 +1962,7 @@ func (m *NameInfo) Reset() { *m = NameInfo{} } func (m *NameInfo) String() string { return proto.CompactTextString(m) } func (*NameInfo) ProtoMessage() {} func (*NameInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{14} + return fileDescriptor_structured_a57fd22810a6582f, []int{14} } func (m *NameInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2152,7 +2152,7 @@ func (m *TableDescriptor) Reset() { *m = TableDescriptor{} } func (m *TableDescriptor) String() string { return proto.CompactTextString(m) } func (*TableDescriptor) ProtoMessage() {} func (*TableDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15} + return fileDescriptor_structured_a57fd22810a6582f, []int{15} } func (m *TableDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2480,7 +2480,7 @@ func (m *TableDescriptor_SchemaChangeLease) Reset() { *m = TableDescript func (m *TableDescriptor_SchemaChangeLease) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_SchemaChangeLease) ProtoMessage() {} func (*TableDescriptor_SchemaChangeLease) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{15, 0} } func (m *TableDescriptor_SchemaChangeLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2526,7 +2526,7 @@ func (m *TableDescriptor_CheckConstraint) Reset() { *m = TableDescriptor func (m *TableDescriptor_CheckConstraint) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_CheckConstraint) ProtoMessage() {} func (*TableDescriptor_CheckConstraint) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15, 1} + return fileDescriptor_structured_a57fd22810a6582f, []int{15, 1} } func (m *TableDescriptor_CheckConstraint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2566,7 +2566,7 @@ func (m *TableDescriptor_Reference) Reset() { *m = TableDescriptor_Refer func (m *TableDescriptor_Reference) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_Reference) ProtoMessage() {} func (*TableDescriptor_Reference) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15, 2} + return fileDescriptor_structured_a57fd22810a6582f, []int{15, 2} } func (m *TableDescriptor_Reference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2603,7 +2603,7 @@ func (m *TableDescriptor_MutationJob) Reset() { *m = TableDescriptor_Mut func (m *TableDescriptor_MutationJob) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_MutationJob) ProtoMessage() {} func (*TableDescriptor_MutationJob) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15, 3} + return fileDescriptor_structured_a57fd22810a6582f, []int{15, 3} } func (m *TableDescriptor_MutationJob) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2640,13 +2640,16 @@ type TableDescriptor_SequenceOpts struct { // Whether the sequence is virtual. Virtual bool `protobuf:"varint,5,opt,name=virtual" json:"virtual"` SequenceOwner TableDescriptor_SequenceOpts_SequenceOwner `protobuf:"bytes,6,opt,name=sequence_owner,json=sequenceOwner" json:"sequence_owner"` + // The number of values (which have already been created in KV) + // that a node can cache locally. + CacheSize int64 `protobuf:"varint,7,opt,name=cache_size,json=cacheSize" json:"cache_size"` } func (m *TableDescriptor_SequenceOpts) Reset() { *m = TableDescriptor_SequenceOpts{} } func (m *TableDescriptor_SequenceOpts) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_SequenceOpts) ProtoMessage() {} func (*TableDescriptor_SequenceOpts) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15, 4} + return fileDescriptor_structured_a57fd22810a6582f, []int{15, 4} } func (m *TableDescriptor_SequenceOpts) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2686,7 +2689,7 @@ func (m *TableDescriptor_SequenceOpts_SequenceOwner) String() string { } func (*TableDescriptor_SequenceOpts_SequenceOwner) ProtoMessage() {} func (*TableDescriptor_SequenceOpts_SequenceOwner) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15, 4, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{15, 4, 0} } func (m *TableDescriptor_SequenceOpts_SequenceOwner) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2726,7 +2729,7 @@ func (m *TableDescriptor_Replacement) Reset() { *m = TableDescriptor_Rep func (m *TableDescriptor_Replacement) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_Replacement) ProtoMessage() {} func (*TableDescriptor_Replacement) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15, 5} + return fileDescriptor_structured_a57fd22810a6582f, []int{15, 5} } func (m *TableDescriptor_Replacement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2763,7 +2766,7 @@ func (m *TableDescriptor_GCDescriptorMutation) Reset() { *m = TableDescr func (m *TableDescriptor_GCDescriptorMutation) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_GCDescriptorMutation) ProtoMessage() {} func (*TableDescriptor_GCDescriptorMutation) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15, 6} + return fileDescriptor_structured_a57fd22810a6582f, []int{15, 6} } func (m *TableDescriptor_GCDescriptorMutation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2800,7 +2803,7 @@ func (m *TableDescriptor_LocalityConfig) Reset() { *m = TableDescriptor_ func (m *TableDescriptor_LocalityConfig) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_LocalityConfig) ProtoMessage() {} func (*TableDescriptor_LocalityConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15, 7} + return fileDescriptor_structured_a57fd22810a6582f, []int{15, 7} } func (m *TableDescriptor_LocalityConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2980,7 +2983,7 @@ func (m *TableDescriptor_LocalityConfig_RegionalByTable) String() string { } func (*TableDescriptor_LocalityConfig_RegionalByTable) ProtoMessage() {} func (*TableDescriptor_LocalityConfig_RegionalByTable) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15, 7, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{15, 7, 0} } func (m *TableDescriptor_LocalityConfig_RegionalByTable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3018,7 +3021,7 @@ func (m *TableDescriptor_LocalityConfig_RegionalByRow) String() string { } func (*TableDescriptor_LocalityConfig_RegionalByRow) ProtoMessage() {} func (*TableDescriptor_LocalityConfig_RegionalByRow) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15, 7, 1} + return fileDescriptor_structured_a57fd22810a6582f, []int{15, 7, 1} } func (m *TableDescriptor_LocalityConfig_RegionalByRow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3050,7 +3053,7 @@ func (m *TableDescriptor_LocalityConfig_Global) Reset() { *m = TableDesc func (m *TableDescriptor_LocalityConfig_Global) String() string { return proto.CompactTextString(m) } func (*TableDescriptor_LocalityConfig_Global) ProtoMessage() {} func (*TableDescriptor_LocalityConfig_Global) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{15, 7, 2} + return fileDescriptor_structured_a57fd22810a6582f, []int{15, 7, 2} } func (m *TableDescriptor_LocalityConfig_Global) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3101,7 +3104,7 @@ func (m *DatabaseDescriptor) Reset() { *m = DatabaseDescriptor{} } func (m *DatabaseDescriptor) String() string { return proto.CompactTextString(m) } func (*DatabaseDescriptor) ProtoMessage() {} func (*DatabaseDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{16} + return fileDescriptor_structured_a57fd22810a6582f, []int{16} } func (m *DatabaseDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3209,7 +3212,7 @@ func (m *DatabaseDescriptor_SchemaInfo) Reset() { *m = DatabaseDescripto func (m *DatabaseDescriptor_SchemaInfo) String() string { return proto.CompactTextString(m) } func (*DatabaseDescriptor_SchemaInfo) ProtoMessage() {} func (*DatabaseDescriptor_SchemaInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{16, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{16, 0} } func (m *DatabaseDescriptor_SchemaInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3249,7 +3252,7 @@ func (m *DatabaseDescriptor_RegionConfig) Reset() { *m = DatabaseDescrip func (m *DatabaseDescriptor_RegionConfig) String() string { return proto.CompactTextString(m) } func (*DatabaseDescriptor_RegionConfig) ProtoMessage() {} func (*DatabaseDescriptor_RegionConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{16, 2} + return fileDescriptor_structured_a57fd22810a6582f, []int{16, 2} } func (m *DatabaseDescriptor_RegionConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3284,7 +3287,7 @@ func (m *DatabaseDescriptor_RegionConfig_Region) Reset() { func (m *DatabaseDescriptor_RegionConfig_Region) String() string { return proto.CompactTextString(m) } func (*DatabaseDescriptor_RegionConfig_Region) ProtoMessage() {} func (*DatabaseDescriptor_RegionConfig_Region) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{16, 2, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{16, 2, 0} } func (m *DatabaseDescriptor_RegionConfig_Region) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3347,7 +3350,7 @@ func (m *TypeDescriptor) Reset() { *m = TypeDescriptor{} } func (m *TypeDescriptor) String() string { return proto.CompactTextString(m) } func (*TypeDescriptor) ProtoMessage() {} func (*TypeDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{17} + return fileDescriptor_structured_a57fd22810a6582f, []int{17} } func (m *TypeDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3496,7 +3499,7 @@ func (m *TypeDescriptor_EnumMember) Reset() { *m = TypeDescriptor_EnumMe func (m *TypeDescriptor_EnumMember) String() string { return proto.CompactTextString(m) } func (*TypeDescriptor_EnumMember) ProtoMessage() {} func (*TypeDescriptor_EnumMember) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{17, 0} + return fileDescriptor_structured_a57fd22810a6582f, []int{17, 0} } func (m *TypeDescriptor_EnumMember) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3532,7 +3535,7 @@ func (m *TypeDescriptor_RegionConfig) Reset() { *m = TypeDescriptor_Regi func (m *TypeDescriptor_RegionConfig) String() string { return proto.CompactTextString(m) } func (*TypeDescriptor_RegionConfig) ProtoMessage() {} func (*TypeDescriptor_RegionConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{17, 1} + return fileDescriptor_structured_a57fd22810a6582f, []int{17, 1} } func (m *TypeDescriptor_RegionConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3580,7 +3583,7 @@ func (m *SchemaDescriptor) Reset() { *m = SchemaDescriptor{} } func (m *SchemaDescriptor) String() string { return proto.CompactTextString(m) } func (*SchemaDescriptor) ProtoMessage() {} func (*SchemaDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{18} + return fileDescriptor_structured_a57fd22810a6582f, []int{18} } func (m *SchemaDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3683,7 +3686,7 @@ func (m *Descriptor) Reset() { *m = Descriptor{} } func (m *Descriptor) String() string { return proto.CompactTextString(m) } func (*Descriptor) ProtoMessage() {} func (*Descriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_structured_068faf732f314ec2, []int{19} + return fileDescriptor_structured_a57fd22810a6582f, []int{19} } func (m *Descriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5295,6 +5298,9 @@ func (this *TableDescriptor_SequenceOpts) Equal(that interface{}) bool { if !this.SequenceOwner.Equal(&that1.SequenceOwner) { return false } + if this.CacheSize != that1.CacheSize { + return false + } return true } func (this *TableDescriptor_SequenceOpts_SequenceOwner) Equal(that interface{}) bool { @@ -7631,6 +7637,9 @@ func (m *TableDescriptor_SequenceOpts) MarshalTo(dAtA []byte) (int, error) { return 0, err } i += n28 + dAtA[i] = 0x38 + i++ + i = encodeVarintStructured(dAtA, i, uint64(m.CacheSize)) return i, nil } @@ -9071,6 +9080,7 @@ func (m *TableDescriptor_SequenceOpts) Size() (n int) { n += 2 l = m.SequenceOwner.Size() n += 1 + l + sovStructured(uint64(l)) + n += 1 + sovStructured(uint64(m.CacheSize)) return n } @@ -15602,6 +15612,25 @@ func (m *TableDescriptor_SequenceOpts) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CacheSize", wireType) + } + m.CacheSize = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStructured + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CacheSize |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipStructured(dAtA[iNdEx:]) @@ -18298,334 +18327,335 @@ var ( ) func init() { - proto.RegisterFile("sql/catalog/descpb/structured.proto", fileDescriptor_structured_068faf732f314ec2) -} - -var fileDescriptor_structured_068faf732f314ec2 = []byte{ - // 5189 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7c, 0xc9, 0x73, 0x23, 0xd7, - 0x79, 0x38, 0xb1, 0x03, 0x1f, 0xb6, 0xe6, 0x1b, 0xce, 0x0c, 0x44, 0x4b, 0x24, 0x07, 0xa3, 0x91, - 0xa8, 0x91, 0x45, 0x8e, 0x28, 0x5b, 0x1e, 0x49, 0x96, 0x7f, 0x02, 0x01, 0x70, 0x08, 0x0e, 0x09, - 0x50, 0x4d, 0x72, 0x46, 0xb6, 0x7f, 0x76, 0xbb, 0x89, 0x7e, 0x00, 0x5b, 0xd3, 0xe8, 0xc6, 0x74, - 0x37, 0x66, 0x88, 0x54, 0x0e, 0x29, 0x9f, 0x72, 0xca, 0x72, 0xc8, 0xd1, 0x15, 0x57, 0xca, 0x55, - 0xf1, 0x2d, 0xe5, 0xaa, 0x54, 0x72, 0xcb, 0xd9, 0xb7, 0x38, 0x17, 0x97, 0x4f, 0xac, 0x84, 0xca, - 0x21, 0xff, 0x41, 0x52, 0x3a, 0xa5, 0xde, 0xd6, 0x0b, 0x16, 0x0e, 0x48, 0x2a, 0x3e, 0x48, 0xc5, - 0xfe, 0xb6, 0xb7, 0x7d, 0xfb, 0x7b, 0x18, 0xb8, 0xeb, 0x3c, 0x37, 0xd6, 0xdb, 0xaa, 0xab, 0x1a, - 0x56, 0x77, 0x5d, 0xc3, 0x4e, 0xbb, 0x7f, 0xbc, 0xee, 0xb8, 0xf6, 0xa0, 0xed, 0x0e, 0x6c, 0xac, - 0xad, 0xf5, 0x6d, 0xcb, 0xb5, 0xd0, 0xcd, 0xb6, 0xd5, 0x7e, 0x66, 0x5b, 0x6a, 0xfb, 0x64, 0xcd, - 0x79, 0x6e, 0x90, 0xff, 0x8e, 0x55, 0x07, 0x2f, 0x96, 0x06, 0xae, 0x6e, 0xac, 0x9f, 0x18, 0xed, - 0x75, 0x57, 0xef, 0x61, 0xc7, 0x55, 0x7b, 0x7d, 0xc6, 0xb0, 0x58, 0x9e, 0x20, 0xb5, 0x6f, 0xeb, - 0x2f, 0x74, 0x03, 0x77, 0x31, 0xa7, 0xb9, 0x49, 0x68, 0xdc, 0x61, 0x1f, 0x3b, 0xec, 0xff, 0x1c, - 0xfc, 0x5a, 0x17, 0x5b, 0xeb, 0x5d, 0x6c, 0xe9, 0xa6, 0x86, 0x4f, 0xd7, 0xdb, 0x96, 0xd9, 0xd1, - 0xbb, 0x1c, 0xb5, 0xd0, 0xb5, 0xba, 0x16, 0xfd, 0x73, 0x9d, 0xfc, 0xc5, 0xa0, 0xe5, 0x9f, 0x27, - 0xe0, 0xc6, 0x96, 0x65, 0x63, 0xbd, 0x6b, 0x3e, 0xc6, 0x43, 0x19, 0x77, 0xb0, 0x8d, 0xcd, 0x36, - 0x46, 0x2b, 0x90, 0x70, 0xd5, 0x63, 0x03, 0x97, 0x22, 0x2b, 0x91, 0xd5, 0xfc, 0x26, 0xfc, 0xf6, - 0x6c, 0x79, 0xee, 0xeb, 0xb3, 0xe5, 0x68, 0xa3, 0x26, 0x33, 0x04, 0xba, 0x07, 0x09, 0x3a, 0x4a, - 0x29, 0x4a, 0x29, 0x8a, 0x9c, 0x22, 0xd5, 0x20, 0x40, 0x42, 0x46, 0xb1, 0xa8, 0x04, 0x71, 0x53, - 0xed, 0xe1, 0x52, 0x6c, 0x25, 0xb2, 0x9a, 0xd9, 0x8c, 0x13, 0x2a, 0x99, 0x42, 0xd0, 0x63, 0x48, - 0xbf, 0x50, 0x0d, 0x5d, 0xd3, 0xdd, 0x61, 0x29, 0xbe, 0x12, 0x59, 0x2d, 0x6c, 0xbc, 0xb3, 0x36, - 0x71, 0xab, 0xd6, 0xaa, 0x96, 0xe9, 0xb8, 0xb6, 0xaa, 0x9b, 0xee, 0x13, 0xce, 0xc0, 0x05, 0x79, - 0x02, 0xd0, 0x03, 0x98, 0x77, 0x4e, 0x54, 0x1b, 0x6b, 0x4a, 0xdf, 0xc6, 0x1d, 0xfd, 0x54, 0x31, - 0xb0, 0x59, 0x4a, 0xac, 0x44, 0x56, 0x13, 0x9c, 0xb4, 0xc8, 0xd0, 0xfb, 0x14, 0xbb, 0x8b, 0x4d, - 0x74, 0x08, 0x19, 0xcb, 0x54, 0x34, 0x6c, 0x60, 0x17, 0x97, 0x92, 0x74, 0xfc, 0xf7, 0xa7, 0x8c, - 0x3f, 0x61, 0x83, 0xd6, 0x2a, 0x6d, 0x57, 0xb7, 0x4c, 0x31, 0x0f, 0xcb, 0xac, 0x51, 0x41, 0x5c, - 0xea, 0xa0, 0xaf, 0xa9, 0x2e, 0x2e, 0xa5, 0xae, 0x2d, 0xf5, 0x88, 0x0a, 0x42, 0xbb, 0x90, 0xe8, - 0xa9, 0x6e, 0xfb, 0xa4, 0x94, 0xa6, 0x12, 0x1f, 0x5c, 0x42, 0xe2, 0x1e, 0xe1, 0xe3, 0x02, 0x99, - 0x90, 0xf2, 0x53, 0x48, 0xb2, 0x71, 0x50, 0x1e, 0x32, 0xcd, 0x96, 0x52, 0xa9, 0x1e, 0x36, 0x5a, - 0x4d, 0x69, 0x0e, 0xe5, 0x20, 0x2d, 0xd7, 0x0f, 0x0e, 0xe5, 0x46, 0xf5, 0x50, 0x8a, 0x90, 0xaf, - 0x83, 0xfa, 0xa1, 0xd2, 0x3c, 0xda, 0xdd, 0x95, 0xa2, 0xa8, 0x08, 0x59, 0xf2, 0x55, 0xab, 0x6f, - 0x55, 0x8e, 0x76, 0x0f, 0xa5, 0x18, 0xca, 0x42, 0xaa, 0x5a, 0x39, 0xa8, 0x56, 0x6a, 0x75, 0x29, - 0xbe, 0x18, 0xff, 0xf5, 0xaf, 0x96, 0xe6, 0xca, 0x0f, 0x20, 0x41, 0x87, 0x43, 0x00, 0xc9, 0x83, - 0xc6, 0xde, 0xfe, 0x6e, 0x5d, 0x9a, 0x43, 0x69, 0x88, 0x6f, 0x11, 0x11, 0x11, 0xc2, 0xb1, 0x5f, - 0x91, 0x0f, 0x1b, 0x95, 0x5d, 0x29, 0xca, 0x38, 0x3e, 0x8e, 0xff, 0xd7, 0x2f, 0x97, 0x23, 0xe5, - 0x7f, 0x4b, 0xc0, 0x82, 0x3f, 0x77, 0xff, 0xb4, 0x51, 0x15, 0x8a, 0x96, 0xad, 0x77, 0x75, 0x53, - 0xa1, 0x3a, 0xa7, 0xe8, 0x1a, 0xd7, 0xc7, 0x6f, 0x91, 0xf5, 0x9c, 0x9f, 0x2d, 0xe7, 0x5b, 0x14, - 0x7d, 0x48, 0xb0, 0x8d, 0x1a, 0x57, 0xd0, 0xbc, 0x15, 0x00, 0x6a, 0xe8, 0x31, 0xcc, 0x73, 0x21, - 0x6d, 0xcb, 0x18, 0xf4, 0x4c, 0x45, 0xd7, 0x9c, 0x52, 0x74, 0x25, 0xb6, 0x9a, 0xdf, 0x5c, 0x3e, - 0x3f, 0x5b, 0x2e, 0x32, 0x11, 0x55, 0x8a, 0x6b, 0xd4, 0x9c, 0xaf, 0xcf, 0x96, 0xd3, 0xe2, 0x43, - 0xe6, 0xc3, 0xf3, 0x6f, 0xcd, 0x41, 0x4f, 0xe1, 0xa6, 0x2d, 0xf6, 0x56, 0x0b, 0x0a, 0x8c, 0x51, - 0x81, 0x77, 0xcf, 0xcf, 0x96, 0x6f, 0x78, 0x9b, 0xaf, 0x4d, 0x16, 0x7a, 0xc3, 0x1e, 0x25, 0xd0, - 0x1c, 0xd4, 0x82, 0x00, 0xd8, 0x5f, 0x6e, 0x9c, 0x2e, 0x77, 0x99, 0x2f, 0x77, 0xde, 0x17, 0x1d, - 0x5e, 0xf2, 0xbc, 0x3d, 0x82, 0xd0, 0x3c, 0xc3, 0x4b, 0x5c, 0x68, 0x78, 0xc9, 0xeb, 0x1a, 0x5e, - 0xc8, 0x8c, 0x52, 0xff, 0x27, 0x66, 0x94, 0xfe, 0xc6, 0xcd, 0x28, 0xf3, 0x0d, 0x98, 0x11, 0xd3, - 0xdd, 0x9d, 0x78, 0x1a, 0xa4, 0xec, 0x4e, 0x3c, 0x9d, 0x95, 0x72, 0x3b, 0xf1, 0x74, 0x4e, 0xca, - 0xef, 0xc4, 0xd3, 0x79, 0xa9, 0x50, 0xfe, 0xef, 0x08, 0xbc, 0x7e, 0x64, 0xea, 0xcf, 0x07, 0xf8, - 0xa9, 0xee, 0x9e, 0x58, 0x03, 0x97, 0xfa, 0xc5, 0x80, 0x6e, 0x3f, 0x80, 0xf4, 0x88, 0x52, 0xdf, - 0xe4, 0xa7, 0x9c, 0x0a, 0x9f, 0x6d, 0xca, 0xe5, 0x27, 0xfa, 0x10, 0x60, 0x4c, 0x83, 0x5f, 0x3b, - 0x3f, 0x5b, 0xce, 0x4c, 0x56, 0xb3, 0x4c, 0xdb, 0x53, 0xae, 0x3f, 0x8e, 0x13, 0xe6, 0xd6, 0xfc, - 0xd7, 0x09, 0x90, 0xd8, 0x24, 0x6a, 0xd8, 0x69, 0xdb, 0x7a, 0xdf, 0xb5, 0x6c, 0x6f, 0x06, 0x91, - 0xb1, 0x19, 0xbc, 0x05, 0x51, 0x5d, 0xe3, 0x41, 0xe4, 0x16, 0xdf, 0x81, 0x28, 0x5d, 0xbc, 0xbf, - 0x94, 0xa8, 0xae, 0xa1, 0x35, 0x88, 0x93, 0x48, 0x47, 0xd7, 0x90, 0xdd, 0x58, 0x1c, 0x9d, 0x25, - 0xee, 0xad, 0xb1, 0x40, 0x78, 0x28, 0x53, 0x3a, 0xb4, 0x02, 0x69, 0x73, 0x60, 0x18, 0x34, 0x88, - 0x91, 0x95, 0xa5, 0xc5, 0x74, 0x05, 0x14, 0xdd, 0x81, 0x9c, 0x86, 0x3b, 0xea, 0xc0, 0x70, 0x15, - 0x7c, 0xda, 0xb7, 0x99, 0xa5, 0xc8, 0x59, 0x0e, 0xab, 0x9f, 0xf6, 0x6d, 0xf4, 0x3a, 0x24, 0x4f, - 0x74, 0x4d, 0xc3, 0x26, 0x35, 0x14, 0x21, 0x82, 0xc3, 0xd0, 0x06, 0xcc, 0x0f, 0x1c, 0xec, 0x28, - 0x0e, 0x7e, 0x3e, 0x20, 0x5a, 0x42, 0xcf, 0x05, 0xe8, 0xb9, 0x24, 0xf9, 0xe1, 0x15, 0x09, 0xc1, - 0x01, 0xc7, 0x93, 0xa3, 0xb8, 0x03, 0xb9, 0xb6, 0xd5, 0xeb, 0x0f, 0x5c, 0xcc, 0x06, 0xcd, 0xb2, - 0x41, 0x39, 0x8c, 0x0e, 0xba, 0x01, 0xf3, 0xd6, 0x4b, 0x73, 0x44, 0x6c, 0x2e, 0x2c, 0x96, 0x10, - 0x04, 0xc5, 0x7e, 0x06, 0x52, 0xbf, 0xab, 0xa8, 0xae, 0x6b, 0xeb, 0xc7, 0x44, 0xb6, 0x39, 0xe8, - 0x95, 0xf2, 0xa1, 0x3d, 0x2d, 0xec, 0x3f, 0xaa, 0x08, 0x74, 0x73, 0xd0, 0x93, 0x0b, 0xfd, 0x6e, - 0xf0, 0x1b, 0x6d, 0xc1, 0x1b, 0xaa, 0xe1, 0x62, 0x5b, 0x38, 0x35, 0xb2, 0x89, 0x8a, 0x6e, 0x2a, - 0x7d, 0xdb, 0xea, 0xda, 0xd8, 0x71, 0x4a, 0x85, 0xc0, 0x0e, 0xbc, 0x46, 0x49, 0xd9, 0xf9, 0x1c, - 0x0e, 0xfb, 0xb8, 0x61, 0xee, 0x73, 0x32, 0xf4, 0x63, 0x40, 0xce, 0xd0, 0x71, 0x71, 0x4f, 0x08, - 0x7a, 0xa6, 0x9b, 0x5a, 0xa9, 0x48, 0x75, 0xeb, 0xed, 0x29, 0xba, 0x75, 0x40, 0x19, 0x98, 0xb8, - 0xc7, 0xba, 0xa9, 0xf1, 0x51, 0x24, 0x67, 0x04, 0x8e, 0x96, 0x20, 0xf5, 0x42, 0xb7, 0xdd, 0x81, - 0x6a, 0x94, 0xa4, 0xc0, 0x74, 0x04, 0xd0, 0xb3, 0xc9, 0xb4, 0x94, 0xd9, 0x89, 0xa7, 0x33, 0x12, - 0xec, 0xc4, 0xd3, 0x29, 0x29, 0x5d, 0xfe, 0x8b, 0x28, 0xdc, 0x62, 0x62, 0xb6, 0xd4, 0x9e, 0x6e, - 0x0c, 0xaf, 0xab, 0x99, 0x4c, 0x0a, 0xd7, 0x4c, 0x7a, 0xa4, 0x74, 0xa9, 0x84, 0x8d, 0x85, 0x02, - 0x7a, 0xa4, 0x04, 0xd6, 0x24, 0xa0, 0x11, 0xd3, 0x8d, 0x5f, 0xc2, 0x74, 0x5b, 0x30, 0x2f, 0x94, - 0xd4, 0x93, 0x40, 0x35, 0x35, 0xbf, 0x79, 0x97, 0xcf, 0xa9, 0x58, 0x63, 0x04, 0x82, 0x3d, 0x1c, - 0xc1, 0xb4, 0x10, 0x52, 0xe3, 0x46, 0xfa, 0xcf, 0x51, 0x58, 0x68, 0x98, 0x2e, 0xb6, 0x0d, 0xac, - 0xbe, 0xc0, 0x81, 0xed, 0xf8, 0x02, 0x32, 0xaa, 0xd9, 0xc6, 0x8e, 0x6b, 0xd9, 0x4e, 0x29, 0xb2, - 0x12, 0x5b, 0xcd, 0x6e, 0x7c, 0x67, 0xca, 0xa9, 0x4d, 0xe2, 0x5f, 0xab, 0x70, 0x66, 0xbe, 0x93, - 0xbe, 0xb0, 0xc5, 0x7f, 0x89, 0x40, 0x5a, 0x60, 0xaf, 0xe0, 0xfd, 0xbe, 0x0b, 0x69, 0x9a, 0x51, - 0x2a, 0xde, 0x99, 0x2c, 0x0a, 0x0e, 0x9e, 0x72, 0x06, 0xb3, 0xcf, 0x14, 0xa5, 0x6d, 0x68, 0xa8, - 0x3a, 0x29, 0x31, 0x8c, 0x51, 0xfe, 0xdb, 0x62, 0xff, 0x0e, 0xc2, 0xa9, 0xe1, 0x58, 0xae, 0xc8, - 0xf6, 0x8c, 0xef, 0xdc, 0x3f, 0x45, 0x60, 0x9e, 0x30, 0x68, 0x58, 0x0b, 0x6c, 0xdb, 0x5d, 0x00, - 0xdd, 0x51, 0x1c, 0x06, 0xa7, 0x2b, 0x12, 0xba, 0x99, 0xd1, 0x1d, 0x4e, 0xee, 0xa9, 0x5a, 0x74, - 0x4c, 0xd5, 0x3e, 0x82, 0x3c, 0xe5, 0x55, 0x8e, 0x07, 0xed, 0x67, 0xd8, 0x75, 0xe8, 0x0c, 0x13, - 0x9b, 0x0b, 0x7c, 0x86, 0x39, 0x2a, 0x61, 0x93, 0xe1, 0xe4, 0x9c, 0x13, 0xf8, 0x1a, 0xd3, 0xbe, - 0xf8, 0x98, 0xf6, 0xf1, 0x89, 0xff, 0x43, 0x1c, 0x6e, 0xed, 0xab, 0xb6, 0xab, 0x93, 0xd8, 0xa8, - 0x9b, 0xdd, 0xc0, 0xec, 0xef, 0x41, 0xd6, 0x1c, 0x08, 0x83, 0x75, 0xf8, 0x81, 0xb0, 0xf9, 0x81, - 0x39, 0xe0, 0x06, 0xe8, 0xa0, 0x5d, 0x88, 0x1b, 0xba, 0xe3, 0xd2, 0xd0, 0x93, 0xdd, 0xd8, 0x98, - 0xa2, 0x16, 0x93, 0xc7, 0x58, 0xdb, 0xd5, 0x1d, 0x57, 0xac, 0x99, 0x48, 0x41, 0x2d, 0x48, 0xd8, - 0xaa, 0xd9, 0xc5, 0xd4, 0x5e, 0xb2, 0x1b, 0x1f, 0x5c, 0x4e, 0x9c, 0x4c, 0x58, 0x45, 0x40, 0xa6, - 0x72, 0xd0, 0x87, 0xb0, 0x40, 0x56, 0xa1, 0xf7, 0xfa, 0x86, 0xde, 0xd6, 0x5d, 0x6f, 0x39, 0xf1, - 0xc0, 0x72, 0x90, 0x39, 0xe8, 0x35, 0x38, 0x01, 0x5f, 0xd6, 0xe2, 0x2f, 0x22, 0x10, 0x27, 0xb3, - 0xbb, 0xc0, 0x15, 0xdc, 0x82, 0xe4, 0x0b, 0xd5, 0x18, 0x60, 0x16, 0x76, 0x73, 0x32, 0xff, 0x42, - 0x3f, 0x81, 0xa2, 0x33, 0x38, 0xee, 0x07, 0xa6, 0xc8, 0xe3, 0xd3, 0x7b, 0x97, 0x5a, 0x8d, 0x57, - 0xa3, 0x84, 0x65, 0xb1, 0x83, 0x5b, 0x7c, 0x0e, 0x09, 0xba, 0xda, 0x0b, 0xe6, 0x77, 0x07, 0x72, - 0xae, 0xa5, 0xe0, 0xd3, 0xb6, 0x31, 0x70, 0xf4, 0x17, 0x4c, 0xc3, 0x72, 0x72, 0xd6, 0xb5, 0xea, - 0x02, 0x84, 0xee, 0x41, 0xa1, 0x63, 0x5b, 0x3d, 0x45, 0x37, 0x05, 0x51, 0x8c, 0x12, 0xe5, 0x09, - 0xb4, 0x21, 0x80, 0x21, 0x55, 0xff, 0x9b, 0x1c, 0x14, 0xa9, 0x41, 0xcd, 0xe4, 0x2e, 0xef, 0x05, - 0xdc, 0xe5, 0xcd, 0x90, 0xbb, 0xf4, 0xac, 0x92, 0x78, 0xcb, 0xd7, 0x21, 0x39, 0xa0, 0x79, 0x11, - 0x1d, 0xdf, 0x0b, 0xa9, 0x0c, 0x36, 0x83, 0x36, 0xa3, 0x6f, 0x03, 0x22, 0x2e, 0x04, 0x2b, 0x21, - 0xc2, 0x04, 0x25, 0x94, 0x28, 0xa6, 0x3a, 0xd5, 0xf3, 0x26, 0x2f, 0xe1, 0x79, 0xb7, 0x41, 0xc2, - 0xa7, 0xae, 0xad, 0x06, 0xb3, 0xfc, 0x14, 0xe5, 0x5f, 0x22, 0xe1, 0xb4, 0x4e, 0x70, 0x93, 0x85, - 0x14, 0x70, 0x00, 0xa7, 0x11, 0x2d, 0x99, 0xe7, 0x32, 0x34, 0xdd, 0xc6, 0x34, 0x37, 0x75, 0x4a, - 0xe9, 0x95, 0xd8, 0x05, 0x39, 0xe8, 0xc8, 0xb6, 0xaf, 0xd5, 0x04, 0xa3, 0x2c, 0x31, 0x51, 0x1e, - 0xc0, 0x41, 0x07, 0x90, 0xed, 0xb0, 0x94, 0x55, 0x79, 0x86, 0x87, 0x34, 0xb9, 0xcd, 0x6e, 0xdc, - 0x9f, 0x3d, 0xb9, 0xdd, 0x4c, 0x92, 0x23, 0x28, 0x45, 0x64, 0xe8, 0x78, 0x48, 0xf4, 0x14, 0xf2, - 0x81, 0x7a, 0xe4, 0x78, 0x48, 0xf3, 0x9a, 0xab, 0x89, 0xcd, 0xf9, 0x82, 0x36, 0x87, 0xe8, 0x73, - 0x00, 0xdd, 0x0b, 0x1c, 0x34, 0xfd, 0xc9, 0x6e, 0xbc, 0x7b, 0x89, 0x08, 0x23, 0xfc, 0x92, 0x2f, - 0x04, 0x3d, 0x85, 0x82, 0xff, 0x45, 0x27, 0x9b, 0xbb, 0xf4, 0x64, 0x99, 0xd4, 0x7c, 0x40, 0xce, - 0x26, 0x29, 0x6e, 0x16, 0x48, 0x62, 0x66, 0x39, 0xba, 0x8b, 0x83, 0x6a, 0x90, 0xa7, 0x6a, 0x50, - 0x3e, 0x3f, 0x5b, 0x46, 0x55, 0x81, 0x9f, 0xac, 0x0a, 0xa8, 0x3d, 0x82, 0x67, 0x8a, 0x15, 0x52, - 0x60, 0x22, 0xb1, 0xe0, 0x2b, 0xd6, 0x81, 0xaf, 0xc2, 0x63, 0x8a, 0x15, 0x50, 0x6f, 0x56, 0x8d, - 0xe6, 0x42, 0xbe, 0xa7, 0x78, 0x75, 0xdf, 0x13, 0x12, 0x84, 0xea, 0x3c, 0xd9, 0x96, 0x68, 0xda, - 0xf6, 0xee, 0x8c, 0x4a, 0x4a, 0x32, 0x41, 0xe1, 0x12, 0x68, 0x0e, 0xfe, 0x01, 0xa0, 0xb6, 0x8d, - 0x55, 0x17, 0x6b, 0x24, 0xd9, 0xa5, 0x4e, 0xd7, 0x18, 0x96, 0xe6, 0x03, 0x76, 0x3f, 0xcf, 0xf1, - 0x75, 0x0f, 0x8d, 0x1e, 0x42, 0xea, 0x05, 0xb6, 0x1d, 0xdd, 0x32, 0x4b, 0x88, 0x3a, 0x93, 0x25, - 0xde, 0x5a, 0xba, 0x35, 0x32, 0xde, 0x13, 0x46, 0x25, 0x0b, 0x72, 0xb4, 0x0d, 0x79, 0x6c, 0xb6, - 0x2d, 0x4d, 0x37, 0xbb, 0x34, 0x7d, 0x2d, 0xdd, 0xf0, 0xf3, 0xa4, 0xaf, 0xcf, 0x96, 0xbf, 0x35, - 0xc2, 0x5f, 0xe7, 0xb4, 0x64, 0xda, 0x72, 0x0e, 0x07, 0xbe, 0xd0, 0x36, 0xa4, 0x44, 0x2c, 0x5f, - 0xa0, 0x7b, 0xba, 0x3a, 0x2d, 0x73, 0x1d, 0xcd, 0x04, 0x44, 0x46, 0xca, 0xd9, 0x49, 0x19, 0xa2, - 0xe9, 0x0e, 0xc9, 0x61, 0xb4, 0xd2, 0xcd, 0x60, 0x19, 0x22, 0xa0, 0xa8, 0x0a, 0xd0, 0xc5, 0x96, - 0xc2, 0x9a, 0x75, 0xa5, 0x5b, 0x74, 0xb8, 0xa5, 0xc0, 0x70, 0x5d, 0x6c, 0xad, 0x89, 0x96, 0x1e, - 0xa9, 0xc2, 0x3a, 0x7a, 0x57, 0xa4, 0x16, 0x5d, 0x6c, 0x31, 0x00, 0x2a, 0x43, 0xa6, 0x6f, 0x63, - 0x4d, 0x6f, 0x93, 0x82, 0xf9, 0x76, 0xc0, 0x37, 0xfb, 0xe0, 0xf2, 0x12, 0x64, 0x3c, 0xaf, 0x81, - 0x52, 0x10, 0xab, 0x1c, 0x54, 0x59, 0x7f, 0xa6, 0x56, 0x3f, 0xa8, 0x4a, 0x91, 0xf2, 0x1d, 0x88, - 0xd3, 0xc5, 0x67, 0x21, 0xb5, 0xd5, 0x92, 0x9f, 0x56, 0xe4, 0x1a, 0xeb, 0x09, 0x35, 0x9a, 0x4f, - 0xea, 0xf2, 0x61, 0xbd, 0x26, 0x89, 0xb8, 0x70, 0x16, 0x07, 0xe4, 0x97, 0x83, 0x87, 0x16, 0x2f, - 0xaf, 0xbb, 0x50, 0x6c, 0x7b, 0x50, 0x76, 0x00, 0x91, 0x95, 0xe8, 0x6a, 0x61, 0xe3, 0xe1, 0x2b, - 0x4b, 0x4a, 0x21, 0x23, 0x08, 0xf2, 0x95, 0xa9, 0xd0, 0x0e, 0x41, 0x03, 0x79, 0x54, 0x74, 0x24, - 0x06, 0xc9, 0x90, 0x68, 0x9f, 0xe0, 0xf6, 0x33, 0x1e, 0x85, 0x3f, 0x9c, 0x32, 0x30, 0x4d, 0x31, - 0x03, 0x8a, 0x5b, 0x25, 0x3c, 0xfe, 0xd0, 0x22, 0xad, 0xa0, 0xa2, 0x90, 0x1c, 0x76, 0xaf, 0xf1, - 0x0b, 0x3d, 0xd6, 0xa4, 0x36, 0x96, 0xf0, 0x58, 0x01, 0xef, 0xfa, 0x10, 0x8a, 0xa6, 0xe5, 0x2a, - 0xa4, 0x14, 0xe5, 0x5e, 0x80, 0x16, 0x98, 0xf9, 0x4d, 0x89, 0xeb, 0xaa, 0x6f, 0xf3, 0x79, 0xd3, - 0x72, 0x9b, 0x03, 0xc3, 0x60, 0x00, 0xf4, 0x67, 0x11, 0x58, 0x66, 0xb1, 0x52, 0x79, 0xc9, 0x1a, - 0x0b, 0x0a, 0x4b, 0x8b, 0xfd, 0x3d, 0xa2, 0x6d, 0x98, 0xe9, 0x09, 0xd5, 0x45, 0x5d, 0x09, 0x3e, - 0xd5, 0xd7, 0x07, 0x17, 0xd0, 0x94, 0x0f, 0xa1, 0x10, 0x3e, 0x26, 0x94, 0x81, 0x44, 0x75, 0xbb, - 0x5e, 0x7d, 0x2c, 0xcd, 0xa1, 0x22, 0x64, 0xb7, 0x5a, 0x72, 0xbd, 0xf1, 0xa8, 0xa9, 0x3c, 0xae, - 0xff, 0x90, 0xb5, 0x11, 0x9b, 0x2d, 0xaf, 0x8d, 0x58, 0x82, 0x85, 0xa3, 0x66, 0xe3, 0xf3, 0xa3, - 0xba, 0xf2, 0xb4, 0x71, 0xb8, 0xdd, 0x3a, 0x3a, 0x54, 0x1a, 0xcd, 0x5a, 0xfd, 0x0b, 0x29, 0xe6, - 0x95, 0x6e, 0x09, 0x29, 0x59, 0xfe, 0x4d, 0x14, 0x0a, 0xfb, 0xb6, 0xde, 0x53, 0xed, 0xe1, 0x63, - 0x3c, 0x3c, 0x78, 0xa9, 0xf6, 0xd1, 0x67, 0xb0, 0x60, 0xe2, 0x97, 0x4a, 0x9f, 0x41, 0x15, 0xaf, - 0x14, 0x88, 0x4c, 0xee, 0x3e, 0xcf, 0x9b, 0xf8, 0x25, 0x97, 0xd0, 0xe0, 0x95, 0xc0, 0xb7, 0x21, - 0x6b, 0x19, 0x1a, 0xe3, 0xc4, 0xa2, 0x7f, 0x92, 0x0d, 0x32, 0x81, 0x65, 0x68, 0x0d, 0x86, 0x26, - 0xd4, 0x64, 0x3c, 0x41, 0x1d, 0x9b, 0x40, 0x6d, 0xe2, 0x97, 0x82, 0xfa, 0x33, 0x58, 0x20, 0xb2, - 0xc7, 0x66, 0x17, 0x9f, 0x32, 0x3b, 0xcb, 0xd0, 0x46, 0x66, 0xf7, 0x11, 0xdc, 0x1a, 0x5f, 0xdf, - 0x58, 0x03, 0xef, 0xc6, 0xc8, 0xb2, 0x48, 0x8e, 0x23, 0xd2, 0xfb, 0x08, 0xd0, 0x60, 0x34, 0x70, - 0x45, 0x5b, 0x91, 0xee, 0xdb, 0x77, 0x20, 0x4f, 0xe4, 0xfa, 0xb5, 0x63, 0x64, 0x8a, 0x9e, 0x91, - 0xe5, 0x8a, 0xc8, 0x42, 0xb8, 0xc8, 0x7a, 0x7c, 0xae, 0xe8, 0x34, 0x2e, 0xcb, 0xf0, 0x9a, 0x98, - 0xe8, 0x6d, 0xc8, 0xe9, 0x26, 0x71, 0xc6, 0xbc, 0xb7, 0x11, 0x6c, 0x37, 0x65, 0x39, 0xa6, 0x7e, - 0xda, 0xb7, 0xf9, 0x8c, 0x7f, 0x13, 0x85, 0xdb, 0x7b, 0xaa, 0x8b, 0x6d, 0x5d, 0x35, 0xf4, 0x3f, - 0xc1, 0xda, 0x13, 0x1d, 0xbf, 0x94, 0x71, 0xc7, 0xc6, 0xce, 0x09, 0xfa, 0x02, 0xe6, 0xc7, 0xb6, - 0x83, 0x4e, 0x3d, 0xbb, 0xf1, 0xd6, 0x6c, 0xd1, 0x48, 0xe4, 0xd4, 0x23, 0x3b, 0x86, 0xf6, 0xc2, - 0x07, 0xcb, 0x6a, 0x99, 0xcb, 0xc9, 0x0c, 0x9e, 0xfc, 0x43, 0x48, 0xa8, 0x8e, 0x62, 0x75, 0xb8, - 0xc7, 0x79, 0x23, 0x20, 0x68, 0xe0, 0xea, 0xc6, 0xda, 0x89, 0xd1, 0x5e, 0x3b, 0x14, 0x17, 0x3c, - 0xc2, 0x57, 0xa9, 0x4e, 0xab, 0x83, 0xde, 0x83, 0xa2, 0x73, 0x62, 0x0d, 0x0c, 0x4d, 0x39, 0x56, - 0xdb, 0xcf, 0x3a, 0xba, 0x61, 0x84, 0xfa, 0x54, 0x05, 0x86, 0xdc, 0xe4, 0x38, 0xbe, 0x67, 0x7f, - 0x99, 0x02, 0xe4, 0xcf, 0x67, 0x6f, 0xe0, 0xaa, 0xd4, 0x9b, 0x57, 0x20, 0xc9, 0xdd, 0x08, 0xdb, - 0xa3, 0xb7, 0xa7, 0x7a, 0xdc, 0x70, 0x5f, 0x6e, 0x7b, 0x4e, 0xe6, 0x8c, 0xe8, 0x07, 0xc1, 0xfb, - 0x9c, 0x99, 0x77, 0x64, 0x7b, 0x4e, 0x5c, 0xf4, 0x3c, 0x86, 0x84, 0xe3, 0x92, 0xe8, 0x13, 0xa3, - 0x39, 0xc3, 0xfa, 0x14, 0xfe, 0xf1, 0xc9, 0xaf, 0x1d, 0x10, 0x36, 0xe1, 0x73, 0xa9, 0x0c, 0xf4, - 0x14, 0x32, 0x5e, 0xaa, 0xcc, 0xfb, 0x92, 0x1f, 0xcc, 0x2e, 0xd0, 0x8b, 0x72, 0x22, 0x06, 0x7a, - 0xb2, 0x50, 0x05, 0xb2, 0x3d, 0x4e, 0xe6, 0x37, 0x52, 0x56, 0x78, 0xb5, 0x02, 0x42, 0x02, 0xad, - 0x5a, 0x02, 0x5f, 0x32, 0x08, 0xa6, 0x06, 0x8d, 0xe8, 0xb6, 0x65, 0x18, 0xe4, 0xd0, 0xa8, 0xa7, - 0xf5, 0x22, 0xba, 0x80, 0xa2, 0xc7, 0xa4, 0xe6, 0xf0, 0xbc, 0x71, 0x9a, 0xee, 0xe7, 0x3b, 0x33, - 0xc7, 0xc0, 0xed, 0x39, 0x39, 0xc0, 0x8e, 0x5a, 0x50, 0xe8, 0x87, 0x5c, 0x21, 0x4f, 0xf0, 0xef, - 0x4d, 0xcb, 0xf2, 0x42, 0xc4, 0xdb, 0x73, 0xf2, 0x08, 0x3b, 0xfa, 0x31, 0xa0, 0xf6, 0x98, 0x9f, - 0x28, 0xc1, 0x2b, 0x66, 0x39, 0xca, 0xb0, 0x3d, 0x27, 0x4f, 0x10, 0x83, 0xbe, 0x84, 0xdb, 0xbd, - 0xc9, 0x26, 0xcd, 0x53, 0xfd, 0xb5, 0x29, 0x23, 0x4c, 0x71, 0x04, 0xdb, 0x73, 0xf2, 0x34, 0x81, - 0xe5, 0xcf, 0x20, 0x41, 0x55, 0x87, 0x24, 0x2c, 0x47, 0xcd, 0xc7, 0xcd, 0xd6, 0xd3, 0x26, 0x0b, - 0x40, 0xb5, 0xfa, 0x6e, 0xfd, 0xb0, 0xae, 0xb4, 0x9a, 0xbb, 0x24, 0x00, 0xbd, 0x06, 0x37, 0x39, - 0xa0, 0xd2, 0xac, 0x29, 0x4f, 0xe5, 0x86, 0x40, 0x45, 0xcb, 0xab, 0xc1, 0x8c, 0x28, 0x0d, 0xf1, - 0x66, 0xab, 0x59, 0x97, 0xe6, 0x68, 0x6e, 0x54, 0xab, 0x49, 0x11, 0x9a, 0x1b, 0xc9, 0xad, 0x7d, - 0x29, 0xca, 0xac, 0x6f, 0x33, 0x07, 0xa0, 0x79, 0xea, 0xb6, 0x13, 0x4f, 0x27, 0xa5, 0x54, 0xf9, - 0xef, 0x23, 0x90, 0x26, 0x6e, 0xb8, 0x61, 0x76, 0x2c, 0xf4, 0x01, 0x64, 0xfa, 0xaa, 0x8d, 0x4d, - 0xd7, 0xf7, 0xb4, 0xa2, 0x73, 0x98, 0xde, 0xa7, 0x08, 0xaf, 0xb1, 0x95, 0x66, 0x84, 0x8d, 0x8b, - 0xda, 0x42, 0x5b, 0x20, 0x71, 0x71, 0x4e, 0xfb, 0x04, 0xf7, 0x54, 0x22, 0x95, 0xf5, 0xae, 0x5e, - 0xf7, 0xba, 0xba, 0x14, 0x7f, 0x40, 0xd1, 0x9e, 0xec, 0x42, 0x3f, 0x08, 0x15, 0x3d, 0xbf, 0x7f, - 0x7c, 0x1b, 0x8a, 0x23, 0x99, 0xcf, 0x05, 0xe5, 0xfc, 0x0a, 0x2d, 0xe7, 0x63, 0xbe, 0xdf, 0xf7, - 0xca, 0xf9, 0x28, 0xaf, 0xe4, 0x43, 0x8b, 0x8d, 0xcf, 0xb8, 0xd8, 0x0f, 0xfc, 0xec, 0x9e, 0x19, - 0xdf, 0x6b, 0x3c, 0xa6, 0xcc, 0x5f, 0x90, 0xd8, 0xef, 0xc3, 0x7c, 0xcf, 0xd2, 0xf4, 0x0e, 0xc9, - 0x63, 0x89, 0xe5, 0xba, 0x7a, 0x0f, 0xf3, 0x2c, 0x67, 0x26, 0x87, 0x2b, 0x05, 0xb9, 0x09, 0x12, - 0x3d, 0x82, 0x94, 0x68, 0x0f, 0xa5, 0x69, 0x04, 0x98, 0xd5, 0x63, 0x8a, 0xfc, 0x9e, 0x73, 0xa3, - 0x2d, 0x28, 0x98, 0xf8, 0x34, 0xd8, 0x9c, 0xcd, 0x84, 0x7c, 0x4a, 0xae, 0x89, 0x4f, 0x27, 0x77, - 0x66, 0x73, 0xa6, 0x8f, 0xd1, 0xd0, 0xe7, 0x90, 0x0f, 0x07, 0x3b, 0xb8, 0x42, 0xb0, 0xcb, 0xf5, - 0x83, 0x91, 0x6e, 0x0b, 0x52, 0x22, 0xca, 0x65, 0xaf, 0x10, 0xe5, 0x04, 0x33, 0xda, 0x24, 0x29, - 0xc4, 0xa9, 0xeb, 0x67, 0x35, 0x39, 0xbf, 0x2c, 0x3b, 0x3f, 0x5b, 0xce, 0x92, 0x15, 0x4e, 0x68, - 0xc1, 0x66, 0x4d, 0x0f, 0xae, 0xa1, 0x1d, 0x00, 0xef, 0x09, 0x83, 0x43, 0x6f, 0x26, 0xa6, 0x97, - 0xe7, 0xfb, 0x82, 0xd0, 0x9f, 0x92, 0x1c, 0xe0, 0x46, 0x7b, 0x90, 0x11, 0xee, 0x98, 0x15, 0xce, - 0xd3, 0xfd, 0xd6, 0x78, 0x70, 0x10, 0x21, 0xc1, 0x93, 0x40, 0x6a, 0x06, 0x03, 0xab, 0x0e, 0xe6, - 0xd5, 0xf3, 0xc3, 0x19, 0x6b, 0x06, 0x66, 0x5c, 0xd5, 0x13, 0xd5, 0xec, 0xe2, 0x5d, 0xc2, 0xbf, - 0x19, 0x2d, 0x45, 0x64, 0x26, 0x0a, 0x35, 0x41, 0xa2, 0x5b, 0x16, 0x8c, 0x35, 0x12, 0xdd, 0xb5, - 0x37, 0x85, 0xe1, 0x92, 0x5d, 0x9b, 0x1a, 0x6f, 0xa8, 0x4e, 0xed, 0xf9, 0x31, 0xe7, 0xfb, 0x50, - 0xe8, 0x58, 0x76, 0x4f, 0x75, 0x15, 0x61, 0x3c, 0xf3, 0x7e, 0x9f, 0xed, 0xeb, 0xb3, 0xe5, 0xfc, - 0x16, 0xc5, 0x0a, 0xc3, 0xc9, 0x77, 0x82, 0x9f, 0x68, 0x53, 0x84, 0xe6, 0x1b, 0x34, 0x92, 0xbe, - 0xf5, 0xca, 0xcd, 0x9a, 0x10, 0x91, 0x9b, 0x90, 0xa4, 0xe5, 0x90, 0x53, 0x5a, 0xa0, 0x3b, 0x7e, - 0xc5, 0xd2, 0x4a, 0xe6, 0x52, 0xd0, 0x2e, 0x14, 0x34, 0x02, 0x21, 0xb5, 0x3a, 0xeb, 0xe0, 0xdd, - 0xa4, 0x72, 0x97, 0xa7, 0xc8, 0x15, 0x2e, 0x56, 0x34, 0x6a, 0x04, 0x33, 0xeb, 0xf2, 0xb5, 0x20, - 0xdd, 0x51, 0x7b, 0xba, 0xa1, 0x63, 0xa7, 0x74, 0x8b, 0xca, 0x79, 0xef, 0x42, 0x7b, 0x1e, 0xbd, - 0x05, 0x12, 0x21, 0x5c, 0x08, 0xf1, 0xcc, 0x9a, 0x02, 0x86, 0xe4, 0xf8, 0x6e, 0x8f, 0x9b, 0xb5, - 0xb8, 0x05, 0x0a, 0xdd, 0x08, 0x51, 0xb3, 0xe6, 0x5f, 0x1a, 0xba, 0x0b, 0xf0, 0x42, 0xc7, 0x2f, - 0x95, 0xe7, 0x03, 0x6c, 0x0f, 0x4b, 0xa5, 0x60, 0x61, 0x4e, 0xe0, 0x9f, 0x13, 0x30, 0x7a, 0x1f, - 0x32, 0x1a, 0xee, 0x63, 0x53, 0x73, 0x5a, 0x66, 0xe9, 0x35, 0x5a, 0x69, 0xdc, 0x38, 0x3f, 0x5b, - 0xce, 0xd4, 0x04, 0x90, 0x7b, 0x51, 0x9f, 0x0a, 0x7d, 0x09, 0x39, 0xf6, 0x81, 0xb5, 0x96, 0xb9, - 0x39, 0x2c, 0x2d, 0xd2, 0x45, 0x3f, 0x98, 0xf1, 0x50, 0xfc, 0xb6, 0x97, 0x77, 0xc3, 0x50, 0x0b, - 0x48, 0x93, 0x43, 0xb2, 0xd1, 0xff, 0x87, 0x9c, 0xd0, 0xe3, 0x1d, 0xeb, 0xd8, 0x29, 0x7d, 0xeb, - 0xc2, 0xf6, 0xff, 0xe8, 0x58, 0x7b, 0x3e, 0xab, 0xf0, 0x52, 0x41, 0x69, 0xe8, 0x0b, 0xc8, 0x7b, - 0x17, 0x9d, 0x56, 0xdf, 0x75, 0x4a, 0xaf, 0x5f, 0x58, 0xbd, 0x8e, 0x99, 0x21, 0xe7, 0x6d, 0xf5, - 0xe9, 0xcd, 0x48, 0xe0, 0x0b, 0xdd, 0x81, 0x8c, 0x66, 0x5b, 0x7d, 0x16, 0x2d, 0xde, 0x58, 0x89, - 0xac, 0xc6, 0xbc, 0xde, 0x8b, 0x6d, 0xf5, 0x69, 0x18, 0x50, 0xa0, 0x60, 0xe3, 0xbe, 0xa1, 0xb6, - 0x71, 0x8f, 0xc4, 0x31, 0xab, 0x53, 0x5a, 0xa2, 0xa3, 0x6f, 0xcc, 0xbc, 0x91, 0x1e, 0xb3, 0x50, - 0xcc, 0x80, 0xbc, 0x56, 0x07, 0x1d, 0x01, 0xa8, 0x03, 0x4d, 0x77, 0x95, 0x9e, 0xa5, 0xe1, 0xd2, - 0xf2, 0x85, 0xef, 0x0e, 0x46, 0x85, 0x57, 0x08, 0xe3, 0x9e, 0xa5, 0x61, 0xef, 0x2e, 0x4d, 0x00, - 0xd0, 0xfb, 0x90, 0xa5, 0x4b, 0xfb, 0xd2, 0x3a, 0x26, 0xba, 0xb9, 0x42, 0x17, 0x37, 0xcf, 0xcf, - 0x32, 0x53, 0xb3, 0xad, 0xfe, 0x8e, 0x75, 0x4c, 0x35, 0x86, 0xff, 0xa9, 0x21, 0x07, 0x72, 0xdd, - 0xb6, 0xe2, 0x3b, 0xce, 0x3b, 0xf4, 0x14, 0x3f, 0x99, 0x71, 0x2e, 0x8f, 0xaa, 0x13, 0x5c, 0xe9, - 0x0d, 0x11, 0x01, 0x1e, 0x55, 0x05, 0xcc, 0x91, 0xb3, 0xdd, 0xb6, 0xf7, 0x41, 0x2a, 0x42, 0xd6, - 0xe0, 0xe3, 0x06, 0x50, 0x0e, 0x56, 0x84, 0x0c, 0xc3, 0x4c, 0xa0, 0x09, 0xbc, 0x13, 0xa8, 0xd0, - 0x6a, 0x8a, 0x9d, 0xd9, 0xdd, 0xd9, 0x23, 0x7c, 0x81, 0x71, 0x57, 0x9c, 0x56, 0x87, 0x1e, 0x6c, - 0x1b, 0x72, 0xd6, 0xc0, 0x3d, 0xb6, 0x06, 0xa6, 0xa6, 0x74, 0x9e, 0x39, 0xa5, 0x37, 0xe9, 0x6a, - 0x2f, 0xd5, 0xb5, 0xf1, 0x56, 0xd7, 0xe2, 0x82, 0xb6, 0x1e, 0x3b, 0x72, 0x56, 0x48, 0xdd, 0x7a, - 0xe6, 0xa0, 0x9f, 0x41, 0x56, 0x37, 0xfd, 0x31, 0xee, 0x5d, 0x7e, 0x0c, 0x24, 0x2a, 0x8f, 0x86, - 0xe9, 0x0d, 0x01, 0x5c, 0x26, 0x19, 0xe1, 0x5d, 0x28, 0x58, 0x9d, 0x8e, 0xa1, 0x9b, 0x58, 0xb1, - 0xb1, 0xea, 0x58, 0x66, 0xe9, 0xad, 0xc0, 0x0e, 0xe6, 0x39, 0x4e, 0xa6, 0x28, 0x54, 0x86, 0x8c, - 0x8b, 0x7b, 0x7d, 0xcb, 0x56, 0xed, 0x61, 0xe9, 0xed, 0xe0, 0x15, 0xa4, 0x07, 0x46, 0xc7, 0xb0, - 0x38, 0x30, 0xf1, 0x69, 0xdf, 0x72, 0xb0, 0xa6, 0x8c, 0xe5, 0x96, 0xab, 0xd4, 0xc7, 0xdd, 0xe3, - 0x93, 0xba, 0x7d, 0x24, 0x28, 0x27, 0x26, 0x99, 0xb7, 0x07, 0x13, 0xd1, 0x1a, 0xfa, 0x10, 0x16, - 0x74, 0x47, 0x09, 0x66, 0xed, 0x0a, 0xf1, 0x75, 0xa5, 0x77, 0x02, 0x53, 0x42, 0xba, 0x33, 0x9a, - 0xf1, 0xa3, 0x9f, 0x42, 0xd1, 0xb0, 0xda, 0xaa, 0xa1, 0xbb, 0x43, 0xd1, 0x0d, 0xbd, 0x4f, 0x35, - 0xe0, 0xbb, 0x33, 0x2a, 0xe9, 0x2e, 0xe7, 0x66, 0x3d, 0x51, 0xb9, 0x60, 0x84, 0xbe, 0xd1, 0xcf, - 0x23, 0xb0, 0xf2, 0x8a, 0xd6, 0x99, 0x53, 0x7a, 0xf7, 0xc2, 0xcb, 0xc8, 0x19, 0x7a, 0x67, 0x6f, - 0x5c, 0xd4, 0x3b, 0x73, 0xd0, 0x1a, 0x4d, 0xe9, 0x59, 0xa7, 0x5d, 0x51, 0x0d, 0x43, 0x39, 0x1e, - 0x96, 0xbe, 0x1d, 0x2c, 0xfb, 0x3d, 0x6c, 0xc5, 0x30, 0x36, 0x87, 0x8b, 0xbf, 0x8e, 0xc0, 0xfc, - 0x58, 0xaa, 0x81, 0x7e, 0x0a, 0x29, 0xd3, 0xd2, 0x02, 0xb7, 0xe7, 0x75, 0x7e, 0x66, 0xc9, 0xa6, - 0xa5, 0xb1, 0xcb, 0xf3, 0x0f, 0xba, 0xba, 0x7b, 0x32, 0x38, 0x5e, 0x6b, 0x5b, 0xbd, 0x75, 0x6f, - 0x31, 0xda, 0xb1, 0xff, 0xf7, 0x7a, 0xff, 0x59, 0x77, 0x9d, 0xfe, 0xd5, 0x3f, 0x5e, 0x63, 0x6c, - 0x72, 0x92, 0x48, 0x6d, 0x68, 0xe8, 0x3d, 0x28, 0xe2, 0xd3, 0xbe, 0x6e, 0x07, 0xd2, 0xed, 0x68, - 0xc0, 0x81, 0x16, 0x7c, 0x24, 0xb1, 0x36, 0x7e, 0x4f, 0xf9, 0x9b, 0x28, 0x14, 0x47, 0xc2, 0x3d, - 0xa9, 0x2f, 0x68, 0x2b, 0x28, 0x54, 0x5f, 0x10, 0xc8, 0x05, 0x55, 0x4f, 0xf0, 0x4d, 0x52, 0xec, - 0xba, 0xef, 0xd3, 0xc2, 0xf7, 0x7f, 0x89, 0x4b, 0xdc, 0xff, 0x7d, 0x04, 0xb7, 0x74, 0x47, 0x31, - 0x2d, 0x53, 0xb4, 0x69, 0xbd, 0x8a, 0x3e, 0xf8, 0x16, 0xe8, 0x86, 0xee, 0x34, 0x2d, 0x93, 0x35, - 0x68, 0xbd, 0x55, 0xfb, 0xcf, 0x86, 0x52, 0xe3, 0xcf, 0x86, 0xbc, 0x4e, 0x67, 0x5c, 0x4a, 0x2c, - 0xfe, 0x2a, 0x02, 0x99, 0xe0, 0xab, 0xdb, 0x68, 0xb8, 0x43, 0x37, 0x56, 0x73, 0x5d, 0xf1, 0x15, - 0x44, 0x78, 0x17, 0x62, 0xb3, 0xef, 0x02, 0x3f, 0xda, 0x3f, 0x85, 0x6c, 0x20, 0x8e, 0x8f, 0x76, - 0x51, 0x22, 0x57, 0xe8, 0xa2, 0xbc, 0x09, 0x49, 0x1e, 0xbc, 0x98, 0x62, 0xe5, 0x39, 0x77, 0x82, - 0x05, 0xae, 0xc4, 0x97, 0x24, 0x68, 0xf1, 0xd1, 0xff, 0x35, 0x06, 0xb9, 0x60, 0x9c, 0x27, 0x9e, - 0x4e, 0x37, 0xdb, 0x36, 0x0d, 0xb2, 0x74, 0xf4, 0x98, 0xf7, 0xd8, 0x42, 0x80, 0x49, 0xf4, 0xef, - 0xe9, 0xa6, 0x42, 0x2f, 0xea, 0x43, 0xca, 0x9b, 0xee, 0xe9, 0xe6, 0x13, 0x02, 0xa5, 0x24, 0xea, - 0x29, 0x27, 0x89, 0x85, 0x48, 0xd4, 0x53, 0x46, 0xb2, 0x48, 0x53, 0x67, 0xdb, 0xa5, 0xf5, 0x6d, - 0x2c, 0x90, 0x12, 0xdb, 0x6e, 0xf0, 0x31, 0x52, 0x62, 0xc2, 0x63, 0x24, 0x64, 0x42, 0xc1, 0xcf, - 0x6c, 0x5e, 0x9a, 0xd8, 0xa6, 0x8a, 0x93, 0xdd, 0xa8, 0x5c, 0x21, 0xb5, 0xf1, 0x3f, 0x88, 0x20, - 0xe1, 0xff, 0x9d, 0x20, 0x70, 0xf1, 0xef, 0x22, 0x90, 0x0f, 0x91, 0xa1, 0x06, 0x14, 0xe9, 0xc0, - 0x63, 0xed, 0xdf, 0x3b, 0xde, 0xfb, 0x59, 0x82, 0x9e, 0x58, 0x9e, 0xe6, 0xad, 0x00, 0x4a, 0x43, - 0x9f, 0x41, 0x81, 0x89, 0xf2, 0x9e, 0xed, 0x84, 0xd5, 0x2f, 0x47, 0x25, 0x85, 0xdf, 0xee, 0xe4, - 0x2c, 0x1f, 0xa6, 0x05, 0x5f, 0x16, 0x2c, 0x9a, 0x90, 0x0d, 0xa4, 0x4e, 0x33, 0xe8, 0xfd, 0xf7, - 0x20, 0xee, 0x79, 0xa1, 0x59, 0xbb, 0xac, 0xae, 0xef, 0x9a, 0x7e, 0x19, 0x81, 0x85, 0x49, 0x29, - 0x4c, 0xc8, 0x9e, 0x98, 0x22, 0xcd, 0x64, 0x4f, 0x77, 0x83, 0xa9, 0x25, 0x53, 0x2e, 0x71, 0xdb, - 0xed, 0x27, 0x97, 0x6f, 0x79, 0x2a, 0xce, 0x74, 0xab, 0x18, 0x52, 0x71, 0x52, 0x2c, 0x06, 0x95, - 0xfc, 0xf7, 0x31, 0x28, 0x84, 0x03, 0x18, 0x7a, 0x02, 0xc9, 0xae, 0x61, 0x1d, 0xab, 0x06, 0xef, - 0xea, 0x7e, 0xff, 0x4a, 0x71, 0x70, 0xed, 0x11, 0x95, 0xb1, 0x3d, 0x27, 0x73, 0x69, 0xc8, 0x81, - 0x79, 0x1b, 0x77, 0x75, 0xcb, 0x54, 0x49, 0xf8, 0x61, 0x27, 0xca, 0x77, 0xb6, 0x7e, 0xb5, 0x21, - 0x64, 0x2e, 0x6e, 0x73, 0x48, 0x09, 0xb7, 0xe7, 0xe4, 0xa2, 0x1d, 0x06, 0xa1, 0x1e, 0x14, 0x83, - 0x83, 0xda, 0xd6, 0x4b, 0xde, 0x32, 0xaf, 0x5e, 0x77, 0x48, 0xd9, 0x7a, 0xb9, 0x4d, 0x13, 0xef, - 0x00, 0x60, 0xf1, 0xff, 0x41, 0x71, 0x64, 0x52, 0xe4, 0x3c, 0x18, 0x0d, 0x8f, 0x46, 0x05, 0xe2, - 0x9e, 0x18, 0x11, 0xa9, 0x22, 0x65, 0x8e, 0xe5, 0xe7, 0x71, 0x0f, 0xf2, 0xa1, 0x21, 0x50, 0x01, - 0xa2, 0x2a, 0x7b, 0x1b, 0x95, 0x91, 0xa3, 0xaa, 0xf0, 0x8c, 0x05, 0x48, 0xb2, 0xfd, 0x0d, 0xea, - 0xf7, 0x26, 0x40, 0x5a, 0x24, 0x1f, 0xe5, 0x55, 0xc8, 0x78, 0x99, 0x3c, 0xca, 0x41, 0xba, 0xd6, - 0x38, 0xa8, 0x6c, 0xee, 0xd6, 0x6b, 0xd2, 0x1c, 0xca, 0x43, 0x46, 0xae, 0x57, 0x6a, 0xb4, 0x27, - 0x29, 0x45, 0x3e, 0x4e, 0xff, 0xf9, 0x2f, 0x97, 0x23, 0x3c, 0x38, 0x24, 0xa5, 0xd4, 0x4e, 0x3c, - 0x8d, 0xa4, 0x1b, 0xe5, 0xff, 0xcc, 0x00, 0xaa, 0xa9, 0xae, 0x4a, 0x36, 0xe5, 0x12, 0x9d, 0xbb, - 0xe8, 0x05, 0xd6, 0x14, 0xee, 0xc6, 0xc4, 0xae, 0xd5, 0x8d, 0x99, 0xd8, 0x9b, 0x8b, 0x5f, 0xa7, - 0x37, 0x77, 0xa5, 0x16, 0xe1, 0x78, 0x3f, 0x21, 0x79, 0x8d, 0x7e, 0xc2, 0x13, 0x48, 0xb1, 0xac, - 0x98, 0x3d, 0xf9, 0x99, 0xde, 0xee, 0x18, 0x3f, 0x18, 0xde, 0x18, 0x72, 0xea, 0xa6, 0x6b, 0x0f, - 0xbd, 0xd7, 0x00, 0x0c, 0xe6, 0x77, 0x62, 0xd2, 0x57, 0xef, 0xc4, 0x8c, 0xd7, 0x04, 0x99, 0xe9, - 0x35, 0xc1, 0x8f, 0x81, 0xdb, 0x85, 0xc8, 0xa8, 0xe1, 0xc2, 0x8b, 0xf1, 0x09, 0xcb, 0x61, 0x46, - 0xc0, 0x53, 0xea, 0x9c, 0x1d, 0xf8, 0x5a, 0x3c, 0x04, 0xe0, 0x49, 0xbf, 0xd9, 0xb1, 0x66, 0x70, - 0xe2, 0x4b, 0x90, 0x22, 0xce, 0xb1, 0x8f, 0x99, 0x76, 0x7a, 0x01, 0x93, 0x03, 0xb9, 0x45, 0xf5, - 0x21, 0x17, 0xdc, 0x42, 0x24, 0x41, 0xec, 0x19, 0x1e, 0x72, 0xc3, 0x23, 0x7f, 0xa2, 0x1d, 0x48, - 0xf8, 0x61, 0x7d, 0xfa, 0xfb, 0xd4, 0xa9, 0x67, 0x43, 0xa6, 0x2b, 0x33, 0x11, 0x1f, 0x47, 0x1f, - 0x46, 0x16, 0xff, 0x27, 0x0a, 0xb9, 0xe0, 0x32, 0xd1, 0x4f, 0x20, 0xc5, 0x16, 0x2a, 0x9e, 0xc0, - 0x7e, 0x7a, 0xb5, 0xfd, 0xe2, 0x1f, 0x62, 0x9d, 0x5c, 0x26, 0x6a, 0x42, 0xde, 0x19, 0xd8, 0x2f, - 0xf4, 0x17, 0xaa, 0xa1, 0x74, 0x2d, 0xd5, 0xa0, 0xeb, 0x28, 0x6c, 0xdc, 0x9d, 0xf6, 0xc6, 0x84, - 0xd3, 0x3e, 0xb2, 0x54, 0x43, 0xb4, 0x50, 0x9c, 0x00, 0x0c, 0x7d, 0xe4, 0x5d, 0x11, 0x29, 0xdc, - 0xc1, 0xb1, 0x9b, 0x57, 0xc4, 0xed, 0x26, 0xe8, 0xe4, 0x44, 0x97, 0x99, 0x81, 0x48, 0x58, 0xe7, - 0xfa, 0x81, 0xe9, 0xdb, 0x49, 0xd1, 0xc8, 0xf7, 0xc2, 0x3a, 0xa3, 0xab, 0x9b, 0x83, 0x9e, 0x1f, - 0xd6, 0x6d, 0x1f, 0xa6, 0x2d, 0x7e, 0x08, 0x49, 0x2e, 0xeb, 0xad, 0x90, 0x47, 0x9a, 0x34, 0x38, - 0xc5, 0x07, 0x1d, 0xa5, 0xef, 0xf2, 0xca, 0xbf, 0xcf, 0x41, 0xe1, 0x70, 0xd8, 0x0f, 0xba, 0xb8, - 0x2b, 0xdd, 0xa6, 0x4c, 0xba, 0x33, 0x89, 0x5e, 0xfe, 0xce, 0xe4, 0x82, 0xdf, 0x4c, 0x30, 0x45, - 0x8f, 0x5f, 0xa0, 0xe8, 0x35, 0x88, 0xd3, 0x57, 0xef, 0x09, 0x7a, 0xae, 0xd3, 0x3c, 0x6b, 0x78, - 0xb5, 0x6b, 0x81, 0x87, 0xef, 0x94, 0x1b, 0xfd, 0x10, 0x72, 0xf4, 0x50, 0x7a, 0xb8, 0x77, 0x8c, - 0x6d, 0xe1, 0xd0, 0x1e, 0xcc, 0x26, 0x8d, 0x9c, 0xce, 0x1e, 0x65, 0x14, 0xed, 0x16, 0xec, 0x41, - 0x1c, 0xf4, 0x00, 0x12, 0xaa, 0xa1, 0x53, 0xef, 0xf6, 0xaa, 0x5f, 0x53, 0x30, 0x42, 0xf4, 0x29, - 0xe4, 0x55, 0xdb, 0x56, 0x87, 0xfc, 0x77, 0x01, 0x1a, 0xf5, 0x60, 0xdc, 0x35, 0x9f, 0x9f, 0x2d, - 0x67, 0x2b, 0x04, 0x49, 0x7f, 0x0a, 0x20, 0x36, 0x22, 0xab, 0x7a, 0xa0, 0xd0, 0xb5, 0x4f, 0xe6, - 0x7a, 0xd7, 0x3e, 0x70, 0x9d, 0xd0, 0x32, 0x1e, 0x25, 0xb2, 0xd7, 0x88, 0x12, 0x3f, 0x83, 0x45, - 0xf1, 0xb4, 0x91, 0x08, 0xf4, 0xaf, 0x06, 0x03, 0xbf, 0xd8, 0x28, 0x9f, 0x9f, 0x2d, 0x97, 0x64, - 0x9f, 0xca, 0x5f, 0x2e, 0x2b, 0xba, 0xc8, 0x4e, 0x95, 0xec, 0x89, 0x78, 0x2d, 0x10, 0x2f, 0xf2, - 0x57, 0x8f, 0x17, 0xe1, 0x60, 0x5f, 0xb8, 0x56, 0xb0, 0x1f, 0x8f, 0x3d, 0xc5, 0xe9, 0xb1, 0xe7, - 0xe9, 0x68, 0xec, 0x91, 0x2e, 0xee, 0xad, 0x86, 0x15, 0xf8, 0x82, 0xb8, 0xf3, 0x8b, 0x18, 0x80, - 0xaf, 0xdf, 0xe8, 0x7b, 0x70, 0xbb, 0x7f, 0x32, 0x74, 0xf4, 0xb6, 0x6a, 0x28, 0x36, 0xee, 0xdb, - 0xd8, 0xc1, 0x26, 0x4b, 0xef, 0xa9, 0xd3, 0xc8, 0xc9, 0xb7, 0x04, 0x5a, 0x0e, 0x61, 0xd1, 0x27, - 0x70, 0xcb, 0xb0, 0xba, 0x93, 0xf8, 0x82, 0x4d, 0x89, 0x9b, 0x9c, 0x66, 0x84, 0x59, 0x05, 0x68, - 0xab, 0x7d, 0xf5, 0x58, 0x37, 0xfc, 0x3e, 0xc5, 0x27, 0x97, 0xb5, 0xcd, 0xb5, 0xaa, 0x27, 0x42, - 0xbc, 0x2d, 0xf1, 0x85, 0xa2, 0x9f, 0x8e, 0xbf, 0x82, 0xf8, 0xf8, 0xd2, 0x23, 0x4c, 0x7f, 0x0c, - 0x51, 0x7e, 0x13, 0xc0, 0x1f, 0x9f, 0xde, 0x7a, 0xef, 0xee, 0xfa, 0x59, 0x29, 0xbf, 0x3f, 0x2f, - 0xdf, 0x7f, 0xc5, 0x25, 0x39, 0x40, 0x52, 0xae, 0xef, 0xb5, 0x9e, 0xd4, 0xc5, 0x35, 0xf9, 0x62, - 0x6b, 0x24, 0x9c, 0x8e, 0xc7, 0xa7, 0xc8, 0x8c, 0xf1, 0x89, 0xdf, 0x5c, 0xbf, 0x0f, 0x71, 0xfa, - 0xf3, 0x9f, 0x34, 0xc4, 0xeb, 0xcd, 0xa3, 0x3d, 0x69, 0x0e, 0x65, 0x20, 0x51, 0xd9, 0x6d, 0x54, - 0x0e, 0xa4, 0x08, 0x5a, 0x00, 0x69, 0xef, 0x68, 0xf7, 0xb0, 0x21, 0xd7, 0x1f, 0x35, 0x5a, 0x4d, - 0x85, 0x12, 0x44, 0x03, 0x81, 0xe5, 0x6f, 0xe3, 0x20, 0x31, 0xaf, 0x7e, 0xdd, 0xd0, 0x32, 0xbd, - 0x65, 0xf5, 0xea, 0xcb, 0xf2, 0xb0, 0x15, 0xc6, 0xbf, 0xf9, 0x94, 0x3b, 0xf1, 0x0d, 0xa5, 0xdc, - 0xc9, 0x6b, 0xa4, 0xdc, 0xa9, 0x6b, 0x38, 0xd3, 0x3f, 0x76, 0x6a, 0x1c, 0xd0, 0x90, 0x5f, 0x45, - 0x01, 0x02, 0xba, 0xf1, 0x83, 0xe0, 0x6f, 0xdf, 0xa7, 0xdf, 0x9a, 0x8f, 0xd4, 0xa7, 0xdb, 0x73, - 0xe2, 0x97, 0xf1, 0x8f, 0x20, 0xad, 0xf1, 0xbc, 0x90, 0x67, 0xa8, 0xef, 0xcc, 0x9c, 0x3e, 0x6e, - 0xcf, 0xc9, 0x1e, 0x33, 0xfa, 0x24, 0xf4, 0x93, 0xc7, 0x7b, 0x33, 0x99, 0xfe, 0xb6, 0x78, 0x7b, - 0x5d, 0x81, 0x24, 0x4b, 0x80, 0xb8, 0xb2, 0x4d, 0xfd, 0xed, 0xdd, 0x88, 0x69, 0x6c, 0xcf, 0xc9, - 0x9c, 0x91, 0xd7, 0xb2, 0x29, 0x48, 0x0c, 0x4c, 0xdd, 0x32, 0xef, 0xcb, 0xc1, 0x57, 0xbf, 0xa2, - 0xe1, 0x4a, 0xbc, 0x05, 0xfd, 0x5b, 0x75, 0xb1, 0xc6, 0x9e, 0xdf, 0x1c, 0x99, 0x2f, 0x3c, 0x40, - 0x04, 0x15, 0x00, 0x38, 0x5e, 0x37, 0xbb, 0x52, 0x94, 0x56, 0xc0, 0x24, 0xdf, 0x27, 0x5f, 0xb1, - 0xfb, 0x9f, 0x82, 0x34, 0xfa, 0xe3, 0xbf, 0x80, 0x8f, 0x99, 0x87, 0xfc, 0xde, 0x93, 0x6a, 0xf5, - 0xb0, 0xb1, 0x57, 0x3f, 0x38, 0xac, 0xec, 0xed, 0xb3, 0xe7, 0xa4, 0x87, 0xa4, 0x7c, 0x6e, 0x35, - 0x6a, 0x52, 0xf4, 0xfe, 0xa7, 0x50, 0x1c, 0x51, 0x08, 0xe2, 0x8e, 0xf6, 0x8f, 0x36, 0x77, 0x1b, - 0xd5, 0x89, 0x0f, 0x79, 0x50, 0x16, 0x52, 0xad, 0xad, 0xad, 0xdd, 0x46, 0xb3, 0x2e, 0xc5, 0xee, - 0x7f, 0x07, 0x72, 0xc1, 0xe4, 0x1a, 0x49, 0x90, 0xfb, 0x51, 0xab, 0x59, 0x57, 0xb6, 0x2a, 0x8d, - 0xdd, 0x23, 0x99, 0xcc, 0x00, 0x41, 0x81, 0xfb, 0x15, 0x01, 0x8b, 0x6c, 0xae, 0xfe, 0xf6, 0x3f, - 0x96, 0xe6, 0x7e, 0x7b, 0xbe, 0x14, 0xf9, 0xdd, 0xf9, 0x52, 0xe4, 0x0f, 0xe7, 0x4b, 0x91, 0x7f, - 0x3f, 0x5f, 0x8a, 0xfc, 0xd5, 0x57, 0x4b, 0x73, 0xbf, 0xfb, 0x6a, 0x69, 0xee, 0x0f, 0x5f, 0x2d, - 0xcd, 0xfd, 0x28, 0xc9, 0xfe, 0xd5, 0x86, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x6b, 0x85, 0x0c, - 0x9d, 0x20, 0x42, 0x00, 0x00, + proto.RegisterFile("sql/catalog/descpb/structured.proto", fileDescriptor_structured_a57fd22810a6582f) +} + +var fileDescriptor_structured_a57fd22810a6582f = []byte{ + // 5208 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3c, 0xcb, 0x73, 0x1b, 0xe7, + 0x7d, 0xc4, 0x1b, 0xf8, 0xe1, 0xb5, 0xfc, 0x44, 0x49, 0x30, 0x63, 0x93, 0x14, 0x64, 0xd9, 0xb4, + 0x1c, 0x93, 0x32, 0x9d, 0x38, 0xb2, 0x1d, 0xa7, 0x06, 0x01, 0x50, 0x04, 0x45, 0x02, 0xf4, 0x92, + 0x94, 0x9c, 0xa4, 0xc9, 0x66, 0x89, 0xfd, 0x00, 0xae, 0xb5, 0xd8, 0x85, 0x76, 0x17, 0x12, 0x91, + 0xe9, 0xa1, 0x93, 0x53, 0x4f, 0x7d, 0x1c, 0x7a, 0xcc, 0x34, 0xd3, 0xc9, 0x4c, 0x73, 0xeb, 0xe4, + 0xd2, 0xde, 0x7a, 0xce, 0x31, 0xbd, 0x64, 0xd2, 0x0b, 0xa7, 0x65, 0x7a, 0xe8, 0x1f, 0xd0, 0x99, + 0x76, 0x7c, 0xea, 0x7c, 0xaf, 0x7d, 0xe0, 0x41, 0x81, 0xa4, 0x9b, 0x83, 0x3d, 0xdc, 0xdf, 0xeb, + 0x7b, 0xfd, 0xde, 0xdf, 0x07, 0xc1, 0x5d, 0xe7, 0xb9, 0xb1, 0xde, 0x56, 0x5d, 0xd5, 0xb0, 0xba, + 0xeb, 0x1a, 0x76, 0xda, 0xfd, 0xe3, 0x75, 0xc7, 0xb5, 0x07, 0x6d, 0x77, 0x60, 0x63, 0x6d, 0xad, + 0x6f, 0x5b, 0xae, 0x85, 0x6e, 0xb6, 0xad, 0xf6, 0x33, 0xdb, 0x52, 0xdb, 0x27, 0x6b, 0xce, 0x73, + 0x83, 0xfc, 0x77, 0xac, 0x3a, 0x78, 0xb1, 0x34, 0x70, 0x75, 0x63, 0xfd, 0xc4, 0x68, 0xaf, 0xbb, + 0x7a, 0x0f, 0x3b, 0xae, 0xda, 0xeb, 0x33, 0x86, 0xc5, 0xf2, 0x04, 0xa9, 0x7d, 0x5b, 0x7f, 0xa1, + 0x1b, 0xb8, 0x8b, 0x39, 0xcd, 0x4d, 0x42, 0xe3, 0x0e, 0xfb, 0xd8, 0x61, 0xff, 0xe7, 0xe0, 0xd7, + 0xba, 0xd8, 0x5a, 0xef, 0x62, 0x4b, 0x37, 0x35, 0x7c, 0xba, 0xde, 0xb6, 0xcc, 0x8e, 0xde, 0xe5, + 0xa8, 0x85, 0xae, 0xd5, 0xb5, 0xe8, 0x9f, 0xeb, 0xe4, 0x2f, 0x06, 0x2d, 0xff, 0x2c, 0x01, 0x37, + 0xb6, 0x2c, 0x1b, 0xeb, 0x5d, 0xf3, 0x31, 0x1e, 0xca, 0xb8, 0x83, 0x6d, 0x6c, 0xb6, 0x31, 0x5a, + 0x81, 0x84, 0xab, 0x1e, 0x1b, 0xb8, 0x14, 0x59, 0x89, 0xac, 0xe6, 0x37, 0xe1, 0x37, 0x67, 0xcb, + 0x73, 0x5f, 0x9d, 0x2d, 0x47, 0x1b, 0x35, 0x99, 0x21, 0xd0, 0x3d, 0x48, 0xd0, 0x51, 0x4a, 0x51, + 0x4a, 0x51, 0xe4, 0x14, 0xa9, 0x06, 0x01, 0x12, 0x32, 0x8a, 0x45, 0x25, 0x88, 0x9b, 0x6a, 0x0f, + 0x97, 0x62, 0x2b, 0x91, 0xd5, 0xcc, 0x66, 0x9c, 0x50, 0xc9, 0x14, 0x82, 0x1e, 0x43, 0xfa, 0x85, + 0x6a, 0xe8, 0x9a, 0xee, 0x0e, 0x4b, 0xf1, 0x95, 0xc8, 0x6a, 0x61, 0xe3, 0x9d, 0xb5, 0x89, 0x5b, + 0xb5, 0x56, 0xb5, 0x4c, 0xc7, 0xb5, 0x55, 0xdd, 0x74, 0x9f, 0x70, 0x06, 0x2e, 0xc8, 0x13, 0x80, + 0x1e, 0xc0, 0xbc, 0x73, 0xa2, 0xda, 0x58, 0x53, 0xfa, 0x36, 0xee, 0xe8, 0xa7, 0x8a, 0x81, 0xcd, + 0x52, 0x62, 0x25, 0xb2, 0x9a, 0xe0, 0xa4, 0x45, 0x86, 0xde, 0xa7, 0xd8, 0x5d, 0x6c, 0xa2, 0x43, + 0xc8, 0x58, 0xa6, 0xa2, 0x61, 0x03, 0xbb, 0xb8, 0x94, 0xa4, 0xe3, 0xbf, 0x3f, 0x65, 0xfc, 0x09, + 0x1b, 0xb4, 0x56, 0x69, 0xbb, 0xba, 0x65, 0x8a, 0x79, 0x58, 0x66, 0x8d, 0x0a, 0xe2, 0x52, 0x07, + 0x7d, 0x4d, 0x75, 0x71, 0x29, 0x75, 0x6d, 0xa9, 0x47, 0x54, 0x10, 0xda, 0x85, 0x44, 0x4f, 0x75, + 0xdb, 0x27, 0xa5, 0x34, 0x95, 0xf8, 0xe0, 0x12, 0x12, 0xf7, 0x08, 0x1f, 0x17, 0xc8, 0x84, 0x94, + 0x9f, 0x42, 0x92, 0x8d, 0x83, 0xf2, 0x90, 0x69, 0xb6, 0x94, 0x4a, 0xf5, 0xb0, 0xd1, 0x6a, 0x4a, + 0x73, 0x28, 0x07, 0x69, 0xb9, 0x7e, 0x70, 0x28, 0x37, 0xaa, 0x87, 0x52, 0x84, 0x7c, 0x1d, 0xd4, + 0x0f, 0x95, 0xe6, 0xd1, 0xee, 0xae, 0x14, 0x45, 0x45, 0xc8, 0x92, 0xaf, 0x5a, 0x7d, 0xab, 0x72, + 0xb4, 0x7b, 0x28, 0xc5, 0x50, 0x16, 0x52, 0xd5, 0xca, 0x41, 0xb5, 0x52, 0xab, 0x4b, 0xf1, 0xc5, + 0xf8, 0xaf, 0x7e, 0xb9, 0x34, 0x57, 0x7e, 0x00, 0x09, 0x3a, 0x1c, 0x02, 0x48, 0x1e, 0x34, 0xf6, + 0xf6, 0x77, 0xeb, 0xd2, 0x1c, 0x4a, 0x43, 0x7c, 0x8b, 0x88, 0x88, 0x10, 0x8e, 0xfd, 0x8a, 0x7c, + 0xd8, 0xa8, 0xec, 0x4a, 0x51, 0xc6, 0xf1, 0x71, 0xfc, 0xbf, 0x7e, 0xb1, 0x1c, 0x29, 0xff, 0x6b, + 0x02, 0x16, 0xfc, 0xb9, 0xfb, 0xa7, 0x8d, 0xaa, 0x50, 0xb4, 0x6c, 0xbd, 0xab, 0x9b, 0x0a, 0xd5, + 0x39, 0x45, 0xd7, 0xb8, 0x3e, 0x7e, 0x83, 0xac, 0xe7, 0xfc, 0x6c, 0x39, 0xdf, 0xa2, 0xe8, 0x43, + 0x82, 0x6d, 0xd4, 0xb8, 0x82, 0xe6, 0xad, 0x00, 0x50, 0x43, 0x8f, 0x61, 0x9e, 0x0b, 0x69, 0x5b, + 0xc6, 0xa0, 0x67, 0x2a, 0xba, 0xe6, 0x94, 0xa2, 0x2b, 0xb1, 0xd5, 0xfc, 0xe6, 0xf2, 0xf9, 0xd9, + 0x72, 0x91, 0x89, 0xa8, 0x52, 0x5c, 0xa3, 0xe6, 0x7c, 0x75, 0xb6, 0x9c, 0x16, 0x1f, 0x32, 0x1f, + 0x9e, 0x7f, 0x6b, 0x0e, 0x7a, 0x0a, 0x37, 0x6d, 0xb1, 0xb7, 0x5a, 0x50, 0x60, 0x8c, 0x0a, 0xbc, + 0x7b, 0x7e, 0xb6, 0x7c, 0xc3, 0xdb, 0x7c, 0x6d, 0xb2, 0xd0, 0x1b, 0xf6, 0x28, 0x81, 0xe6, 0xa0, + 0x16, 0x04, 0xc0, 0xfe, 0x72, 0xe3, 0x74, 0xb9, 0xcb, 0x7c, 0xb9, 0xf3, 0xbe, 0xe8, 0xf0, 0x92, + 0xe7, 0xed, 0x11, 0x84, 0xe6, 0x19, 0x5e, 0xe2, 0x42, 0xc3, 0x4b, 0x5e, 0xd7, 0xf0, 0x42, 0x66, + 0x94, 0xfa, 0x7f, 0x31, 0xa3, 0xf4, 0xd7, 0x6e, 0x46, 0x99, 0xaf, 0xc1, 0x8c, 0x98, 0xee, 0xee, + 0xc4, 0xd3, 0x20, 0x65, 0x77, 0xe2, 0xe9, 0xac, 0x94, 0xdb, 0x89, 0xa7, 0x73, 0x52, 0x7e, 0x27, + 0x9e, 0xce, 0x4b, 0x85, 0xf2, 0xff, 0x44, 0xe0, 0xf5, 0x23, 0x53, 0x7f, 0x3e, 0xc0, 0x4f, 0x75, + 0xf7, 0xc4, 0x1a, 0xb8, 0xd4, 0x2f, 0x06, 0x74, 0xfb, 0x01, 0xa4, 0x47, 0x94, 0xfa, 0x26, 0x3f, + 0xe5, 0x54, 0xf8, 0x6c, 0x53, 0x2e, 0x3f, 0xd1, 0x87, 0x00, 0x63, 0x1a, 0xfc, 0xda, 0xf9, 0xd9, + 0x72, 0x66, 0xb2, 0x9a, 0x65, 0xda, 0x9e, 0x72, 0xfd, 0x71, 0x9c, 0x30, 0xb7, 0xe6, 0xbf, 0x49, + 0x80, 0xc4, 0x26, 0x51, 0xc3, 0x4e, 0xdb, 0xd6, 0xfb, 0xae, 0x65, 0x7b, 0x33, 0x88, 0x8c, 0xcd, + 0xe0, 0x2d, 0x88, 0xea, 0x1a, 0x0f, 0x22, 0xb7, 0xf8, 0x0e, 0x44, 0xe9, 0xe2, 0xfd, 0xa5, 0x44, + 0x75, 0x0d, 0xad, 0x41, 0x9c, 0x44, 0x3a, 0xba, 0x86, 0xec, 0xc6, 0xe2, 0xe8, 0x2c, 0x71, 0x6f, + 0x8d, 0x05, 0xc2, 0x43, 0x99, 0xd2, 0xa1, 0x15, 0x48, 0x9b, 0x03, 0xc3, 0xa0, 0x41, 0x8c, 0xac, + 0x2c, 0x2d, 0xa6, 0x2b, 0xa0, 0xe8, 0x0e, 0xe4, 0x34, 0xdc, 0x51, 0x07, 0x86, 0xab, 0xe0, 0xd3, + 0xbe, 0xcd, 0x2c, 0x45, 0xce, 0x72, 0x58, 0xfd, 0xb4, 0x6f, 0xa3, 0xd7, 0x21, 0x79, 0xa2, 0x6b, + 0x1a, 0x36, 0xa9, 0xa1, 0x08, 0x11, 0x1c, 0x86, 0x36, 0x60, 0x7e, 0xe0, 0x60, 0x47, 0x71, 0xf0, + 0xf3, 0x01, 0xd1, 0x12, 0x7a, 0x2e, 0x40, 0xcf, 0x25, 0xc9, 0x0f, 0xaf, 0x48, 0x08, 0x0e, 0x38, + 0x9e, 0x1c, 0xc5, 0x1d, 0xc8, 0xb5, 0xad, 0x5e, 0x7f, 0xe0, 0x62, 0x36, 0x68, 0x96, 0x0d, 0xca, + 0x61, 0x74, 0xd0, 0x0d, 0x98, 0xb7, 0x5e, 0x9a, 0x23, 0x62, 0x73, 0x61, 0xb1, 0x84, 0x20, 0x28, + 0xf6, 0x33, 0x90, 0xfa, 0x5d, 0x45, 0x75, 0x5d, 0x5b, 0x3f, 0x26, 0xb2, 0xcd, 0x41, 0xaf, 0x94, + 0x0f, 0xed, 0x69, 0x61, 0xff, 0x51, 0x45, 0xa0, 0x9b, 0x83, 0x9e, 0x5c, 0xe8, 0x77, 0x83, 0xdf, + 0x68, 0x0b, 0xde, 0x50, 0x0d, 0x17, 0xdb, 0xc2, 0xa9, 0x91, 0x4d, 0x54, 0x74, 0x53, 0xe9, 0xdb, + 0x56, 0xd7, 0xc6, 0x8e, 0x53, 0x2a, 0x04, 0x76, 0xe0, 0x35, 0x4a, 0xca, 0xce, 0xe7, 0x70, 0xd8, + 0xc7, 0x0d, 0x73, 0x9f, 0x93, 0xa1, 0x1f, 0x02, 0x72, 0x86, 0x8e, 0x8b, 0x7b, 0x42, 0xd0, 0x33, + 0xdd, 0xd4, 0x4a, 0x45, 0xaa, 0x5b, 0x6f, 0x4f, 0xd1, 0xad, 0x03, 0xca, 0xc0, 0xc4, 0x3d, 0xd6, + 0x4d, 0x8d, 0x8f, 0x22, 0x39, 0x23, 0x70, 0xb4, 0x04, 0xa9, 0x17, 0xba, 0xed, 0x0e, 0x54, 0xa3, + 0x24, 0x05, 0xa6, 0x23, 0x80, 0x9e, 0x4d, 0xa6, 0xa5, 0xcc, 0x4e, 0x3c, 0x9d, 0x91, 0x60, 0x27, + 0x9e, 0x4e, 0x49, 0xe9, 0xf2, 0x5f, 0x46, 0xe1, 0x16, 0x13, 0xb3, 0xa5, 0xf6, 0x74, 0x63, 0x78, + 0x5d, 0xcd, 0x64, 0x52, 0xb8, 0x66, 0xd2, 0x23, 0xa5, 0x4b, 0x25, 0x6c, 0x2c, 0x14, 0xd0, 0x23, + 0x25, 0xb0, 0x26, 0x01, 0x8d, 0x98, 0x6e, 0xfc, 0x12, 0xa6, 0xdb, 0x82, 0x79, 0xa1, 0xa4, 0x9e, + 0x04, 0xaa, 0xa9, 0xf9, 0xcd, 0xbb, 0x7c, 0x4e, 0xc5, 0x1a, 0x23, 0x10, 0xec, 0xe1, 0x08, 0xa6, + 0x85, 0x90, 0x1a, 0x37, 0xd2, 0x7f, 0x8e, 0xc2, 0x42, 0xc3, 0x74, 0xb1, 0x6d, 0x60, 0xf5, 0x05, + 0x0e, 0x6c, 0xc7, 0x17, 0x90, 0x51, 0xcd, 0x36, 0x76, 0x5c, 0xcb, 0x76, 0x4a, 0x91, 0x95, 0xd8, + 0x6a, 0x76, 0xe3, 0x5b, 0x53, 0x4e, 0x6d, 0x12, 0xff, 0x5a, 0x85, 0x33, 0xf3, 0x9d, 0xf4, 0x85, + 0x2d, 0xfe, 0x4b, 0x04, 0xd2, 0x02, 0x7b, 0x05, 0xef, 0xf7, 0x6d, 0x48, 0xd3, 0x8c, 0x52, 0xf1, + 0xce, 0x64, 0x51, 0x70, 0xf0, 0x94, 0x33, 0x98, 0x7d, 0xa6, 0x28, 0x6d, 0x43, 0x43, 0xd5, 0x49, + 0x89, 0x61, 0x8c, 0xf2, 0xdf, 0x16, 0xfb, 0x77, 0x10, 0x4e, 0x0d, 0xc7, 0x72, 0x45, 0xb6, 0x67, + 0x7c, 0xe7, 0xfe, 0x29, 0x02, 0xf3, 0x84, 0x41, 0xc3, 0x5a, 0x60, 0xdb, 0xee, 0x02, 0xe8, 0x8e, + 0xe2, 0x30, 0x38, 0x5d, 0x91, 0xd0, 0xcd, 0x8c, 0xee, 0x70, 0x72, 0x4f, 0xd5, 0xa2, 0x63, 0xaa, + 0xf6, 0x11, 0xe4, 0x29, 0xaf, 0x72, 0x3c, 0x68, 0x3f, 0xc3, 0xae, 0x43, 0x67, 0x98, 0xd8, 0x5c, + 0xe0, 0x33, 0xcc, 0x51, 0x09, 0x9b, 0x0c, 0x27, 0xe7, 0x9c, 0xc0, 0xd7, 0x98, 0xf6, 0xc5, 0xc7, + 0xb4, 0x8f, 0x4f, 0xfc, 0x1f, 0xe3, 0x70, 0x6b, 0x5f, 0xb5, 0x5d, 0x9d, 0xc4, 0x46, 0xdd, 0xec, + 0x06, 0x66, 0x7f, 0x0f, 0xb2, 0xe6, 0x40, 0x18, 0xac, 0xc3, 0x0f, 0x84, 0xcd, 0x0f, 0xcc, 0x01, + 0x37, 0x40, 0x07, 0xed, 0x42, 0xdc, 0xd0, 0x1d, 0x97, 0x86, 0x9e, 0xec, 0xc6, 0xc6, 0x14, 0xb5, + 0x98, 0x3c, 0xc6, 0xda, 0xae, 0xee, 0xb8, 0x62, 0xcd, 0x44, 0x0a, 0x6a, 0x41, 0xc2, 0x56, 0xcd, + 0x2e, 0xa6, 0xf6, 0x92, 0xdd, 0xf8, 0xe0, 0x72, 0xe2, 0x64, 0xc2, 0x2a, 0x02, 0x32, 0x95, 0x83, + 0x3e, 0x84, 0x05, 0xb2, 0x0a, 0xbd, 0xd7, 0x37, 0xf4, 0xb6, 0xee, 0x7a, 0xcb, 0x89, 0x07, 0x96, + 0x83, 0xcc, 0x41, 0xaf, 0xc1, 0x09, 0xf8, 0xb2, 0x16, 0x7f, 0x1e, 0x81, 0x38, 0x99, 0xdd, 0x05, + 0xae, 0xe0, 0x16, 0x24, 0x5f, 0xa8, 0xc6, 0x00, 0xb3, 0xb0, 0x9b, 0x93, 0xf9, 0x17, 0xfa, 0x11, + 0x14, 0x9d, 0xc1, 0x71, 0x3f, 0x30, 0x45, 0x1e, 0x9f, 0xde, 0xbb, 0xd4, 0x6a, 0xbc, 0x1a, 0x25, + 0x2c, 0x8b, 0x1d, 0xdc, 0xe2, 0x73, 0x48, 0xd0, 0xd5, 0x5e, 0x30, 0xbf, 0x3b, 0x90, 0x73, 0x2d, + 0x05, 0x9f, 0xb6, 0x8d, 0x81, 0xa3, 0xbf, 0x60, 0x1a, 0x96, 0x93, 0xb3, 0xae, 0x55, 0x17, 0x20, + 0x74, 0x0f, 0x0a, 0x1d, 0xdb, 0xea, 0x29, 0xba, 0x29, 0x88, 0x62, 0x94, 0x28, 0x4f, 0xa0, 0x0d, + 0x01, 0x0c, 0xa9, 0xfa, 0xdf, 0xe6, 0xa0, 0x48, 0x0d, 0x6a, 0x26, 0x77, 0x79, 0x2f, 0xe0, 0x2e, + 0x6f, 0x86, 0xdc, 0xa5, 0x67, 0x95, 0xc4, 0x5b, 0xbe, 0x0e, 0xc9, 0x01, 0xcd, 0x8b, 0xe8, 0xf8, + 0x5e, 0x48, 0x65, 0xb0, 0x19, 0xb4, 0x19, 0x7d, 0x13, 0x10, 0x71, 0x21, 0x58, 0x09, 0x11, 0x26, + 0x28, 0xa1, 0x44, 0x31, 0xd5, 0xa9, 0x9e, 0x37, 0x79, 0x09, 0xcf, 0xbb, 0x0d, 0x12, 0x3e, 0x75, + 0x6d, 0x35, 0x98, 0xe5, 0xa7, 0x28, 0xff, 0x12, 0x09, 0xa7, 0x75, 0x82, 0x9b, 0x2c, 0xa4, 0x80, + 0x03, 0x38, 0x8d, 0x68, 0xc9, 0x3c, 0x97, 0xa1, 0xe9, 0x36, 0xa6, 0xb9, 0xa9, 0x53, 0x4a, 0xaf, + 0xc4, 0x2e, 0xc8, 0x41, 0x47, 0xb6, 0x7d, 0xad, 0x26, 0x18, 0x65, 0x89, 0x89, 0xf2, 0x00, 0x0e, + 0x3a, 0x80, 0x6c, 0x87, 0xa5, 0xac, 0xca, 0x33, 0x3c, 0xa4, 0xc9, 0x6d, 0x76, 0xe3, 0xfe, 0xec, + 0xc9, 0xed, 0x66, 0x92, 0x1c, 0x41, 0x29, 0x22, 0x43, 0xc7, 0x43, 0xa2, 0xa7, 0x90, 0x0f, 0xd4, + 0x23, 0xc7, 0x43, 0x9a, 0xd7, 0x5c, 0x4d, 0x6c, 0xce, 0x17, 0xb4, 0x39, 0x44, 0x9f, 0x03, 0xe8, + 0x5e, 0xe0, 0xa0, 0xe9, 0x4f, 0x76, 0xe3, 0xdd, 0x4b, 0x44, 0x18, 0xe1, 0x97, 0x7c, 0x21, 0xe8, + 0x29, 0x14, 0xfc, 0x2f, 0x3a, 0xd9, 0xdc, 0xa5, 0x27, 0xcb, 0xa4, 0xe6, 0x03, 0x72, 0x36, 0x49, + 0x71, 0xb3, 0x40, 0x12, 0x33, 0xcb, 0xd1, 0x5d, 0x1c, 0x54, 0x83, 0x3c, 0x55, 0x83, 0xf2, 0xf9, + 0xd9, 0x32, 0xaa, 0x0a, 0xfc, 0x64, 0x55, 0x40, 0xed, 0x11, 0x3c, 0x53, 0xac, 0x90, 0x02, 0x13, + 0x89, 0x05, 0x5f, 0xb1, 0x0e, 0x7c, 0x15, 0x1e, 0x53, 0xac, 0x80, 0x7a, 0xb3, 0x6a, 0x34, 0x17, + 0xf2, 0x3d, 0xc5, 0xab, 0xfb, 0x9e, 0x90, 0x20, 0x54, 0xe7, 0xc9, 0xb6, 0x44, 0xd3, 0xb6, 0x77, + 0x67, 0x54, 0x52, 0x92, 0x09, 0x0a, 0x97, 0x40, 0x73, 0xf0, 0x0f, 0x00, 0xb5, 0x6d, 0xac, 0xba, + 0x58, 0x23, 0xc9, 0x2e, 0x75, 0xba, 0xc6, 0xb0, 0x34, 0x1f, 0xb0, 0xfb, 0x79, 0x8e, 0xaf, 0x7b, + 0x68, 0xf4, 0x10, 0x52, 0x2f, 0xb0, 0xed, 0xe8, 0x96, 0x59, 0x42, 0xd4, 0x99, 0x2c, 0xf1, 0xd6, + 0xd2, 0xad, 0x91, 0xf1, 0x9e, 0x30, 0x2a, 0x59, 0x90, 0xa3, 0x6d, 0xc8, 0x63, 0xb3, 0x6d, 0x69, + 0xba, 0xd9, 0xa5, 0xe9, 0x6b, 0xe9, 0x86, 0x9f, 0x27, 0x7d, 0x75, 0xb6, 0xfc, 0x8d, 0x11, 0xfe, + 0x3a, 0xa7, 0x25, 0xd3, 0x96, 0x73, 0x38, 0xf0, 0x85, 0xb6, 0x21, 0x25, 0x62, 0xf9, 0x02, 0xdd, + 0xd3, 0xd5, 0x69, 0x99, 0xeb, 0x68, 0x26, 0x20, 0x32, 0x52, 0xce, 0x4e, 0xca, 0x10, 0x4d, 0x77, + 0x48, 0x0e, 0xa3, 0x95, 0x6e, 0x06, 0xcb, 0x10, 0x01, 0x45, 0x55, 0x80, 0x2e, 0xb6, 0x14, 0xd6, + 0xac, 0x2b, 0xdd, 0xa2, 0xc3, 0x2d, 0x05, 0x86, 0xeb, 0x62, 0x6b, 0x4d, 0xb4, 0xf4, 0x48, 0x15, + 0xd6, 0xd1, 0xbb, 0x22, 0xb5, 0xe8, 0x62, 0x8b, 0x01, 0x50, 0x19, 0x32, 0x7d, 0x1b, 0x6b, 0x7a, + 0x9b, 0x14, 0xcc, 0xb7, 0x03, 0xbe, 0xd9, 0x07, 0x97, 0x97, 0x20, 0xe3, 0x79, 0x0d, 0x94, 0x82, + 0x58, 0xe5, 0xa0, 0xca, 0xfa, 0x33, 0xb5, 0xfa, 0x41, 0x55, 0x8a, 0x94, 0xef, 0x40, 0x9c, 0x2e, + 0x3e, 0x0b, 0xa9, 0xad, 0x96, 0xfc, 0xb4, 0x22, 0xd7, 0x58, 0x4f, 0xa8, 0xd1, 0x7c, 0x52, 0x97, + 0x0f, 0xeb, 0x35, 0x49, 0xc4, 0x85, 0xb3, 0x38, 0x20, 0xbf, 0x1c, 0x3c, 0xb4, 0x78, 0x79, 0xdd, + 0x85, 0x62, 0xdb, 0x83, 0xb2, 0x03, 0x88, 0xac, 0x44, 0x57, 0x0b, 0x1b, 0x0f, 0x5f, 0x59, 0x52, + 0x0a, 0x19, 0x41, 0x90, 0xaf, 0x4c, 0x85, 0x76, 0x08, 0x1a, 0xc8, 0xa3, 0xa2, 0x23, 0x31, 0x48, + 0x86, 0x44, 0xfb, 0x04, 0xb7, 0x9f, 0xf1, 0x28, 0xfc, 0xe1, 0x94, 0x81, 0x69, 0x8a, 0x19, 0x50, + 0xdc, 0x2a, 0xe1, 0xf1, 0x87, 0x16, 0x69, 0x05, 0x15, 0x85, 0xe4, 0xb0, 0x7b, 0x8d, 0x5f, 0xe8, + 0xb1, 0x26, 0xb5, 0xb1, 0x84, 0xc7, 0x0a, 0x78, 0xd7, 0x87, 0x50, 0x34, 0x2d, 0x57, 0x21, 0xa5, + 0x28, 0xf7, 0x02, 0xb4, 0xc0, 0xcc, 0x6f, 0x4a, 0x5c, 0x57, 0x7d, 0x9b, 0xcf, 0x9b, 0x96, 0xdb, + 0x1c, 0x18, 0x06, 0x03, 0xa0, 0x3f, 0x8f, 0xc0, 0x32, 0x8b, 0x95, 0xca, 0x4b, 0xd6, 0x58, 0x50, + 0x58, 0x5a, 0xec, 0xef, 0x11, 0x6d, 0xc3, 0x4c, 0x4f, 0xa8, 0x2e, 0xea, 0x4a, 0xf0, 0xa9, 0xbe, + 0x3e, 0xb8, 0x80, 0xa6, 0x7c, 0x08, 0x85, 0xf0, 0x31, 0xa1, 0x0c, 0x24, 0xaa, 0xdb, 0xf5, 0xea, + 0x63, 0x69, 0x0e, 0x15, 0x21, 0xbb, 0xd5, 0x92, 0xeb, 0x8d, 0x47, 0x4d, 0xe5, 0x71, 0xfd, 0xfb, + 0xac, 0x8d, 0xd8, 0x6c, 0x79, 0x6d, 0xc4, 0x12, 0x2c, 0x1c, 0x35, 0x1b, 0x9f, 0x1f, 0xd5, 0x95, + 0xa7, 0x8d, 0xc3, 0xed, 0xd6, 0xd1, 0xa1, 0xd2, 0x68, 0xd6, 0xea, 0x5f, 0x48, 0x31, 0xaf, 0x74, + 0x4b, 0x48, 0xc9, 0xf2, 0xaf, 0xa3, 0x50, 0xd8, 0xb7, 0xf5, 0x9e, 0x6a, 0x0f, 0x1f, 0xe3, 0xe1, + 0xc1, 0x4b, 0xb5, 0x8f, 0x3e, 0x83, 0x05, 0x13, 0xbf, 0x54, 0xfa, 0x0c, 0xaa, 0x78, 0xa5, 0x40, + 0x64, 0x72, 0xf7, 0x79, 0xde, 0xc4, 0x2f, 0xb9, 0x84, 0x06, 0xaf, 0x04, 0xbe, 0x09, 0x59, 0xcb, + 0xd0, 0x18, 0x27, 0x16, 0xfd, 0x93, 0x6c, 0x90, 0x09, 0x2c, 0x43, 0x6b, 0x30, 0x34, 0xa1, 0x26, + 0xe3, 0x09, 0xea, 0xd8, 0x04, 0x6a, 0x13, 0xbf, 0x14, 0xd4, 0x9f, 0xc1, 0x02, 0x91, 0x3d, 0x36, + 0xbb, 0xf8, 0x94, 0xd9, 0x59, 0x86, 0x36, 0x32, 0xbb, 0x8f, 0xe0, 0xd6, 0xf8, 0xfa, 0xc6, 0x1a, + 0x78, 0x37, 0x46, 0x96, 0x45, 0x72, 0x1c, 0x91, 0xde, 0x47, 0x80, 0x06, 0xa3, 0x81, 0x2b, 0xda, + 0x8a, 0x74, 0xdf, 0xbe, 0x05, 0x79, 0x22, 0xd7, 0xaf, 0x1d, 0x23, 0x53, 0xf4, 0x8c, 0x2c, 0x57, + 0x44, 0x16, 0xc2, 0x45, 0xd6, 0xe3, 0x73, 0x45, 0xa7, 0x71, 0x59, 0x86, 0xd7, 0xc4, 0x44, 0x6f, + 0x43, 0x4e, 0x37, 0x89, 0x33, 0xe6, 0xbd, 0x8d, 0x60, 0xbb, 0x29, 0xcb, 0x31, 0xf5, 0xd3, 0xbe, + 0xcd, 0x67, 0xfc, 0xeb, 0x28, 0xdc, 0xde, 0x53, 0x5d, 0x6c, 0xeb, 0xaa, 0xa1, 0xff, 0x14, 0x6b, + 0x4f, 0x74, 0xfc, 0x52, 0xc6, 0x1d, 0x1b, 0x3b, 0x27, 0xe8, 0x0b, 0x98, 0x1f, 0xdb, 0x0e, 0x3a, + 0xf5, 0xec, 0xc6, 0x5b, 0xb3, 0x45, 0x23, 0x91, 0x53, 0x8f, 0xec, 0x18, 0xda, 0x0b, 0x1f, 0x2c, + 0xab, 0x65, 0x2e, 0x27, 0x33, 0x78, 0xf2, 0x0f, 0x21, 0xa1, 0x3a, 0x8a, 0xd5, 0xe1, 0x1e, 0xe7, + 0x8d, 0x80, 0xa0, 0x81, 0xab, 0x1b, 0x6b, 0x27, 0x46, 0x7b, 0xed, 0x50, 0x5c, 0xf0, 0x08, 0x5f, + 0xa5, 0x3a, 0xad, 0x0e, 0x7a, 0x0f, 0x8a, 0xce, 0x89, 0x35, 0x30, 0x34, 0xe5, 0x58, 0x6d, 0x3f, + 0xeb, 0xe8, 0x86, 0x11, 0xea, 0x53, 0x15, 0x18, 0x72, 0x93, 0xe3, 0xf8, 0x9e, 0xfd, 0x55, 0x0a, + 0x90, 0x3f, 0x9f, 0xbd, 0x81, 0xab, 0x52, 0x6f, 0x5e, 0x81, 0x24, 0x77, 0x23, 0x6c, 0x8f, 0xde, + 0x9e, 0xea, 0x71, 0xc3, 0x7d, 0xb9, 0xed, 0x39, 0x99, 0x33, 0xa2, 0xef, 0x05, 0xef, 0x73, 0x66, + 0xde, 0x91, 0xed, 0x39, 0x71, 0xd1, 0xf3, 0x18, 0x12, 0x8e, 0x4b, 0xa2, 0x4f, 0x8c, 0xe6, 0x0c, + 0xeb, 0x53, 0xf8, 0xc7, 0x27, 0xbf, 0x76, 0x40, 0xd8, 0x84, 0xcf, 0xa5, 0x32, 0xd0, 0x53, 0xc8, + 0x78, 0xa9, 0x32, 0xef, 0x4b, 0x7e, 0x30, 0xbb, 0x40, 0x2f, 0xca, 0x89, 0x18, 0xe8, 0xc9, 0x42, + 0x15, 0xc8, 0xf6, 0x38, 0x99, 0xdf, 0x48, 0x59, 0xe1, 0xd5, 0x0a, 0x08, 0x09, 0xb4, 0x6a, 0x09, + 0x7c, 0xc9, 0x20, 0x98, 0x1a, 0x34, 0xa2, 0xdb, 0x96, 0x61, 0x90, 0x43, 0xa3, 0x9e, 0xd6, 0x8b, + 0xe8, 0x02, 0x8a, 0x1e, 0x93, 0x9a, 0xc3, 0xf3, 0xc6, 0x69, 0xba, 0x9f, 0xef, 0xcc, 0x1c, 0x03, + 0xb7, 0xe7, 0xe4, 0x00, 0x3b, 0x6a, 0x41, 0xa1, 0x1f, 0x72, 0x85, 0x3c, 0xc1, 0xbf, 0x37, 0x2d, + 0xcb, 0x0b, 0x11, 0x6f, 0xcf, 0xc9, 0x23, 0xec, 0xe8, 0x87, 0x80, 0xda, 0x63, 0x7e, 0xa2, 0x04, + 0xaf, 0x98, 0xe5, 0x28, 0xc3, 0xf6, 0x9c, 0x3c, 0x41, 0x0c, 0xfa, 0x12, 0x6e, 0xf7, 0x26, 0x9b, + 0x34, 0x4f, 0xf5, 0xd7, 0xa6, 0x8c, 0x30, 0xc5, 0x11, 0x6c, 0xcf, 0xc9, 0xd3, 0x04, 0x96, 0x3f, + 0x83, 0x04, 0x55, 0x1d, 0x92, 0xb0, 0x1c, 0x35, 0x1f, 0x37, 0x5b, 0x4f, 0x9b, 0x2c, 0x00, 0xd5, + 0xea, 0xbb, 0xf5, 0xc3, 0xba, 0xd2, 0x6a, 0xee, 0x92, 0x00, 0xf4, 0x1a, 0xdc, 0xe4, 0x80, 0x4a, + 0xb3, 0xa6, 0x3c, 0x95, 0x1b, 0x02, 0x15, 0x2d, 0xaf, 0x06, 0x33, 0xa2, 0x34, 0xc4, 0x9b, 0xad, + 0x66, 0x5d, 0x9a, 0xa3, 0xb9, 0x51, 0xad, 0x26, 0x45, 0x68, 0x6e, 0x24, 0xb7, 0xf6, 0xa5, 0x28, + 0xb3, 0xbe, 0xcd, 0x1c, 0x80, 0xe6, 0xa9, 0xdb, 0x4e, 0x3c, 0x9d, 0x94, 0x52, 0xe5, 0x7f, 0x88, + 0x40, 0x9a, 0xb8, 0xe1, 0x86, 0xd9, 0xb1, 0xd0, 0x07, 0x90, 0xe9, 0xab, 0x36, 0x36, 0x5d, 0xdf, + 0xd3, 0x8a, 0xce, 0x61, 0x7a, 0x9f, 0x22, 0xbc, 0xc6, 0x56, 0x9a, 0x11, 0x36, 0x2e, 0x6a, 0x0b, + 0x6d, 0x81, 0xc4, 0xc5, 0x39, 0xed, 0x13, 0xdc, 0x53, 0x89, 0x54, 0xd6, 0xbb, 0x7a, 0xdd, 0xeb, + 0xea, 0x52, 0xfc, 0x01, 0x45, 0x7b, 0xb2, 0x0b, 0xfd, 0x20, 0x54, 0xf4, 0xfc, 0xfe, 0xed, 0x6d, + 0x28, 0x8e, 0x64, 0x3e, 0x17, 0x94, 0xf3, 0x2b, 0xb4, 0x9c, 0x8f, 0xf9, 0x7e, 0xdf, 0x2b, 0xe7, + 0xa3, 0xbc, 0x92, 0x0f, 0x2d, 0x36, 0x3e, 0xe3, 0x62, 0x3f, 0xf0, 0xb3, 0x7b, 0x66, 0x7c, 0xaf, + 0xf1, 0x98, 0x32, 0x7f, 0x41, 0x62, 0xbf, 0x0f, 0xf3, 0x3d, 0x4b, 0xd3, 0x3b, 0x24, 0x8f, 0x25, + 0x96, 0xeb, 0xea, 0x3d, 0xcc, 0xb3, 0x9c, 0x99, 0x1c, 0xae, 0x14, 0xe4, 0x26, 0x48, 0xf4, 0x08, + 0x52, 0xa2, 0x3d, 0x94, 0xa6, 0x11, 0x60, 0x56, 0x8f, 0x29, 0xf2, 0x7b, 0xce, 0x8d, 0xb6, 0xa0, + 0x60, 0xe2, 0xd3, 0x60, 0x73, 0x36, 0x13, 0xf2, 0x29, 0xb9, 0x26, 0x3e, 0x9d, 0xdc, 0x99, 0xcd, + 0x99, 0x3e, 0x46, 0x43, 0x9f, 0x43, 0x3e, 0x1c, 0xec, 0xe0, 0x0a, 0xc1, 0x2e, 0xd7, 0x0f, 0x46, + 0xba, 0x2d, 0x48, 0x89, 0x28, 0x97, 0xbd, 0x42, 0x94, 0x13, 0xcc, 0x68, 0x93, 0xa4, 0x10, 0xa7, + 0xae, 0x9f, 0xd5, 0xe4, 0xfc, 0xb2, 0xec, 0xfc, 0x6c, 0x39, 0x4b, 0x56, 0x38, 0xa1, 0x05, 0x9b, + 0x35, 0x3d, 0xb8, 0x86, 0x76, 0x00, 0xbc, 0x27, 0x0c, 0x0e, 0xbd, 0x99, 0x98, 0x5e, 0x9e, 0xef, + 0x0b, 0x42, 0x7f, 0x4a, 0x72, 0x80, 0x1b, 0xed, 0x41, 0x46, 0xb8, 0x63, 0x56, 0x38, 0x4f, 0xf7, + 0x5b, 0xe3, 0xc1, 0x41, 0x84, 0x04, 0x4f, 0x02, 0xa9, 0x19, 0x0c, 0xac, 0x3a, 0x98, 0x57, 0xcf, + 0x0f, 0x67, 0xac, 0x19, 0x98, 0x71, 0x55, 0x4f, 0x54, 0xb3, 0x8b, 0x77, 0x09, 0xff, 0x66, 0xb4, + 0x14, 0x91, 0x99, 0x28, 0xd4, 0x04, 0x89, 0x6e, 0x59, 0x30, 0xd6, 0x48, 0x74, 0xd7, 0xde, 0x14, + 0x86, 0x4b, 0x76, 0x6d, 0x6a, 0xbc, 0xa1, 0x3a, 0xb5, 0xe7, 0xc7, 0x9c, 0xef, 0x42, 0xa1, 0x63, + 0xd9, 0x3d, 0xd5, 0x55, 0x84, 0xf1, 0xcc, 0xfb, 0x7d, 0xb6, 0xaf, 0xce, 0x96, 0xf3, 0x5b, 0x14, + 0x2b, 0x0c, 0x27, 0xdf, 0x09, 0x7e, 0xa2, 0x4d, 0x11, 0x9a, 0x6f, 0xd0, 0x48, 0xfa, 0xd6, 0x2b, + 0x37, 0x6b, 0x42, 0x44, 0x6e, 0x42, 0x92, 0x96, 0x43, 0x4e, 0x69, 0x81, 0xee, 0xf8, 0x15, 0x4b, + 0x2b, 0x99, 0x4b, 0x41, 0xbb, 0x50, 0xd0, 0x08, 0x84, 0xd4, 0xea, 0xac, 0x83, 0x77, 0x93, 0xca, + 0x5d, 0x9e, 0x22, 0x57, 0xb8, 0x58, 0xd1, 0xa8, 0x11, 0xcc, 0xac, 0xcb, 0xd7, 0x82, 0x74, 0x47, + 0xed, 0xe9, 0x86, 0x8e, 0x9d, 0xd2, 0x2d, 0x2a, 0xe7, 0xbd, 0x0b, 0xed, 0x79, 0xf4, 0x16, 0x48, + 0x84, 0x70, 0x21, 0xc4, 0x33, 0x6b, 0x0a, 0x18, 0x92, 0xe3, 0xbb, 0x3d, 0x6e, 0xd6, 0xe2, 0x16, + 0x28, 0x74, 0x23, 0x44, 0xcd, 0x9a, 0x7f, 0x69, 0xe8, 0x2e, 0xc0, 0x0b, 0x1d, 0xbf, 0x54, 0x9e, + 0x0f, 0xb0, 0x3d, 0x2c, 0x95, 0x82, 0x85, 0x39, 0x81, 0x7f, 0x4e, 0xc0, 0xe8, 0x7d, 0xc8, 0x68, + 0xb8, 0x8f, 0x4d, 0xcd, 0x69, 0x99, 0xa5, 0xd7, 0x68, 0xa5, 0x71, 0xe3, 0xfc, 0x6c, 0x39, 0x53, + 0x13, 0x40, 0xee, 0x45, 0x7d, 0x2a, 0xf4, 0x25, 0xe4, 0xd8, 0x07, 0xd6, 0x5a, 0xe6, 0xe6, 0xb0, + 0xb4, 0x48, 0x17, 0xfd, 0x60, 0xc6, 0x43, 0xf1, 0xdb, 0x5e, 0xde, 0x0d, 0x43, 0x2d, 0x20, 0x4d, + 0x0e, 0xc9, 0x46, 0x7f, 0x0a, 0x39, 0xa1, 0xc7, 0x3b, 0xd6, 0xb1, 0x53, 0xfa, 0xc6, 0x85, 0xed, + 0xff, 0xd1, 0xb1, 0xf6, 0x7c, 0x56, 0xe1, 0xa5, 0x82, 0xd2, 0xd0, 0x17, 0x90, 0xf7, 0x2e, 0x3a, + 0xad, 0xbe, 0xeb, 0x94, 0x5e, 0xbf, 0xb0, 0x7a, 0x1d, 0x33, 0x43, 0xce, 0xdb, 0xea, 0xd3, 0x9b, + 0x91, 0xc0, 0x17, 0xba, 0x03, 0x19, 0xcd, 0xb6, 0xfa, 0x2c, 0x5a, 0xbc, 0xb1, 0x12, 0x59, 0x8d, + 0x79, 0xbd, 0x17, 0xdb, 0xea, 0xd3, 0x30, 0xa0, 0x40, 0xc1, 0xc6, 0x7d, 0x43, 0x6d, 0xe3, 0x1e, + 0x89, 0x63, 0x56, 0xa7, 0xb4, 0x44, 0x47, 0xdf, 0x98, 0x79, 0x23, 0x3d, 0x66, 0xa1, 0x98, 0x01, + 0x79, 0xad, 0x0e, 0x3a, 0x02, 0x50, 0x07, 0x9a, 0xee, 0x2a, 0x3d, 0x4b, 0xc3, 0xa5, 0xe5, 0x0b, + 0xdf, 0x1d, 0x8c, 0x0a, 0xaf, 0x10, 0xc6, 0x3d, 0x4b, 0xc3, 0xde, 0x5d, 0x9a, 0x00, 0xa0, 0xf7, + 0x21, 0x4b, 0x97, 0xf6, 0xa5, 0x75, 0x4c, 0x74, 0x73, 0x85, 0x2e, 0x6e, 0x9e, 0x9f, 0x65, 0xa6, + 0x66, 0x5b, 0xfd, 0x1d, 0xeb, 0x98, 0x6a, 0x0c, 0xff, 0x53, 0x43, 0x0e, 0xe4, 0xba, 0x6d, 0xc5, + 0x77, 0x9c, 0x77, 0xe8, 0x29, 0x7e, 0x32, 0xe3, 0x5c, 0x1e, 0x55, 0x27, 0xb8, 0xd2, 0x1b, 0x22, + 0x02, 0x3c, 0xaa, 0x0a, 0x98, 0x23, 0x67, 0xbb, 0x6d, 0xef, 0x83, 0x54, 0x84, 0xac, 0xc1, 0xc7, + 0x0d, 0xa0, 0x1c, 0xac, 0x08, 0x19, 0x86, 0x99, 0x40, 0x13, 0x78, 0x27, 0x50, 0xa1, 0xd5, 0x14, + 0x3b, 0xb3, 0xbb, 0xb3, 0x47, 0xf8, 0x02, 0xe3, 0xae, 0x38, 0xad, 0x0e, 0x3d, 0xd8, 0x36, 0xe4, + 0xac, 0x81, 0x7b, 0x6c, 0x0d, 0x4c, 0x4d, 0xe9, 0x3c, 0x73, 0x4a, 0x6f, 0xd2, 0xd5, 0x5e, 0xaa, + 0x6b, 0xe3, 0xad, 0xae, 0xc5, 0x05, 0x6d, 0x3d, 0x76, 0xe4, 0xac, 0x90, 0xba, 0xf5, 0xcc, 0x41, + 0x3f, 0x81, 0xac, 0x6e, 0xfa, 0x63, 0xdc, 0xbb, 0xfc, 0x18, 0x48, 0x54, 0x1e, 0x0d, 0xd3, 0x1b, + 0x02, 0xb8, 0x4c, 0x32, 0xc2, 0xbb, 0x50, 0xb0, 0x3a, 0x1d, 0x43, 0x37, 0xb1, 0x62, 0x63, 0xd5, + 0xb1, 0xcc, 0xd2, 0x5b, 0x81, 0x1d, 0xcc, 0x73, 0x9c, 0x4c, 0x51, 0xa8, 0x0c, 0x19, 0x17, 0xf7, + 0xfa, 0x96, 0xad, 0xda, 0xc3, 0xd2, 0xdb, 0xc1, 0x2b, 0x48, 0x0f, 0x8c, 0x8e, 0x61, 0x71, 0x60, + 0xe2, 0xd3, 0xbe, 0xe5, 0x60, 0x4d, 0x19, 0xcb, 0x2d, 0x57, 0xa9, 0x8f, 0xbb, 0xc7, 0x27, 0x75, + 0xfb, 0x48, 0x50, 0x4e, 0x4c, 0x32, 0x6f, 0x0f, 0x26, 0xa2, 0x35, 0xf4, 0x21, 0x2c, 0xe8, 0x8e, + 0x12, 0xcc, 0xda, 0x15, 0xe2, 0xeb, 0x4a, 0xef, 0x04, 0xa6, 0x84, 0x74, 0x67, 0x34, 0xe3, 0x47, + 0x3f, 0x86, 0xa2, 0x61, 0xb5, 0x55, 0x43, 0x77, 0x87, 0xa2, 0x1b, 0x7a, 0x9f, 0x6a, 0xc0, 0xb7, + 0x67, 0x54, 0xd2, 0x5d, 0xce, 0xcd, 0x7a, 0xa2, 0x72, 0xc1, 0x08, 0x7d, 0xa3, 0x9f, 0x45, 0x60, + 0xe5, 0x15, 0xad, 0x33, 0xa7, 0xf4, 0xee, 0x85, 0x97, 0x91, 0x33, 0xf4, 0xce, 0xde, 0xb8, 0xa8, + 0x77, 0xe6, 0xa0, 0x35, 0x9a, 0xd2, 0xb3, 0x4e, 0xbb, 0xa2, 0x1a, 0x86, 0x72, 0x3c, 0x2c, 0x7d, + 0x33, 0x58, 0xf6, 0x7b, 0xd8, 0x8a, 0x61, 0x6c, 0x0e, 0x17, 0x7f, 0x15, 0x81, 0xf9, 0xb1, 0x54, + 0x03, 0xfd, 0x18, 0x52, 0xa6, 0xa5, 0x05, 0x6e, 0xcf, 0xeb, 0xfc, 0xcc, 0x92, 0x4d, 0x4b, 0x63, + 0x97, 0xe7, 0x1f, 0x74, 0x75, 0xf7, 0x64, 0x70, 0xbc, 0xd6, 0xb6, 0x7a, 0xeb, 0xde, 0x62, 0xb4, + 0x63, 0xff, 0xef, 0xf5, 0xfe, 0xb3, 0xee, 0x3a, 0xfd, 0xab, 0x7f, 0xbc, 0xc6, 0xd8, 0xe4, 0x24, + 0x91, 0xda, 0xd0, 0xd0, 0x7b, 0x50, 0xc4, 0xa7, 0x7d, 0xdd, 0x0e, 0xa4, 0xdb, 0xd1, 0x80, 0x03, + 0x2d, 0xf8, 0x48, 0x62, 0x6d, 0xfc, 0x9e, 0xf2, 0xd7, 0x51, 0x28, 0x8e, 0x84, 0x7b, 0x52, 0x5f, + 0xd0, 0x56, 0x50, 0xa8, 0xbe, 0x20, 0x90, 0x0b, 0xaa, 0x9e, 0xe0, 0x9b, 0xa4, 0xd8, 0x75, 0xdf, + 0xa7, 0x85, 0xef, 0xff, 0x12, 0x97, 0xb8, 0xff, 0xfb, 0x08, 0x6e, 0xe9, 0x8e, 0x62, 0x5a, 0xa6, + 0x68, 0xd3, 0x7a, 0x15, 0x7d, 0xf0, 0x2d, 0xd0, 0x0d, 0xdd, 0x69, 0x5a, 0x26, 0x6b, 0xd0, 0x7a, + 0xab, 0xf6, 0x9f, 0x0d, 0xa5, 0xc6, 0x9f, 0x0d, 0x79, 0x9d, 0xce, 0xb8, 0x94, 0x58, 0xfc, 0x65, + 0x04, 0x32, 0xc1, 0x57, 0xb7, 0xd1, 0x70, 0x87, 0x6e, 0xac, 0xe6, 0xba, 0xe2, 0x2b, 0x88, 0xf0, + 0x2e, 0xc4, 0x66, 0xdf, 0x05, 0x7e, 0xb4, 0x7f, 0x06, 0xd9, 0x40, 0x1c, 0x1f, 0xed, 0xa2, 0x44, + 0xae, 0xd0, 0x45, 0x79, 0x13, 0x92, 0x3c, 0x78, 0x31, 0xc5, 0xca, 0x73, 0xee, 0x04, 0x0b, 0x5c, + 0x89, 0x2f, 0x49, 0xd0, 0xe2, 0xa3, 0xff, 0x77, 0x0c, 0x72, 0xc1, 0x38, 0x4f, 0x3c, 0x9d, 0x6e, + 0xb6, 0x6d, 0x1a, 0x64, 0xe9, 0xe8, 0x31, 0xef, 0xb1, 0x85, 0x00, 0x93, 0xe8, 0xdf, 0xd3, 0x4d, + 0x85, 0x5e, 0xd4, 0x87, 0x94, 0x37, 0xdd, 0xd3, 0xcd, 0x27, 0x04, 0x4a, 0x49, 0xd4, 0x53, 0x4e, + 0x12, 0x0b, 0x91, 0xa8, 0xa7, 0x8c, 0x64, 0x91, 0xa6, 0xce, 0xb6, 0x4b, 0xeb, 0xdb, 0x58, 0x20, + 0x25, 0xb6, 0xdd, 0xe0, 0x63, 0xa4, 0xc4, 0x84, 0xc7, 0x48, 0xc8, 0x84, 0x82, 0x9f, 0xd9, 0xbc, + 0x34, 0xb1, 0x4d, 0x15, 0x27, 0xbb, 0x51, 0xb9, 0x42, 0x6a, 0xe3, 0x7f, 0x10, 0x41, 0xc2, 0xff, + 0x3b, 0x41, 0x20, 0xc9, 0x35, 0xdb, 0x6a, 0xfb, 0x04, 0x2b, 0x8e, 0xfe, 0x53, 0x56, 0x1e, 0x7b, + 0xdb, 0x42, 0xe1, 0x07, 0xfa, 0x4f, 0xf1, 0xe2, 0xdf, 0x47, 0x20, 0x1f, 0x92, 0x85, 0x1a, 0x50, + 0xa4, 0xb3, 0x1b, 0xeb, 0x11, 0xdf, 0xf1, 0x1e, 0xd9, 0x12, 0xf4, 0xc4, 0x1a, 0x36, 0x6f, 0x05, + 0x50, 0x1a, 0xfa, 0x0c, 0x0a, 0x4c, 0x94, 0xf7, 0xb6, 0x27, 0xac, 0xa3, 0x39, 0x2a, 0x29, 0xfc, + 0xc0, 0x27, 0x67, 0xf9, 0x30, 0x2d, 0xf8, 0xfc, 0x60, 0xd1, 0x84, 0x6c, 0x20, 0xbf, 0x9a, 0xc1, + 0x38, 0xbe, 0x03, 0x71, 0xcf, 0x55, 0xcd, 0xda, 0x8a, 0x75, 0x7d, 0xff, 0xf5, 0x8b, 0x08, 0x2c, + 0x4c, 0xca, 0x73, 0x42, 0x46, 0xc7, 0xb4, 0x6d, 0x26, 0xa3, 0xbb, 0x1b, 0xcc, 0x3f, 0x99, 0x06, + 0x8a, 0x2b, 0x71, 0x3f, 0x03, 0x7d, 0xcb, 0xb3, 0x03, 0xa6, 0x80, 0xc5, 0x90, 0x1d, 0x90, 0x8a, + 0x32, 0x68, 0x09, 0xbf, 0x8b, 0x41, 0x21, 0x1c, 0xe5, 0xd0, 0x13, 0x48, 0x76, 0x0d, 0xeb, 0x58, + 0x35, 0x78, 0xeb, 0xf7, 0xbb, 0x57, 0x0a, 0x96, 0x6b, 0x8f, 0xa8, 0x8c, 0xed, 0x39, 0x99, 0x4b, + 0x43, 0x0e, 0xcc, 0xdb, 0xb8, 0xab, 0x5b, 0xa6, 0x4a, 0x62, 0x14, 0x3b, 0x51, 0xbe, 0xb3, 0xf5, + 0xab, 0x0d, 0x21, 0x73, 0x71, 0x9b, 0x43, 0x4a, 0xb8, 0x3d, 0x27, 0x17, 0xed, 0x30, 0x08, 0xf5, + 0xa0, 0x18, 0x1c, 0xd4, 0xb6, 0x5e, 0xf2, 0xbe, 0x7a, 0xf5, 0xba, 0x43, 0xca, 0xd6, 0xcb, 0x6d, + 0x9a, 0x9d, 0x07, 0x00, 0x8b, 0x7f, 0x02, 0xc5, 0x91, 0x49, 0x91, 0xf3, 0x60, 0x34, 0x3c, 0x64, + 0x15, 0x88, 0x0f, 0x63, 0x44, 0xa4, 0xd4, 0x94, 0x39, 0x96, 0x9f, 0xc7, 0x3d, 0xc8, 0x87, 0x86, + 0x40, 0x05, 0x88, 0xaa, 0xec, 0x01, 0x55, 0x46, 0x8e, 0xaa, 0xc2, 0x7d, 0x16, 0x20, 0xc9, 0xf6, + 0x37, 0xa8, 0xdf, 0x9b, 0x00, 0x69, 0x91, 0xa1, 0x94, 0x57, 0x21, 0xe3, 0xa5, 0xfb, 0x28, 0x07, + 0xe9, 0x5a, 0xe3, 0xa0, 0xb2, 0xb9, 0x5b, 0xaf, 0x49, 0x73, 0x28, 0x0f, 0x19, 0xb9, 0x5e, 0xa9, + 0xd1, 0xc6, 0xa5, 0x14, 0xf9, 0x38, 0xfd, 0x17, 0xbf, 0x58, 0x8e, 0xf0, 0x08, 0x92, 0x94, 0x52, + 0x3b, 0xf1, 0x34, 0x92, 0x6e, 0x94, 0xff, 0x33, 0x03, 0xa8, 0xa6, 0xba, 0x2a, 0xd9, 0x94, 0x4b, + 0xb4, 0xf7, 0xa2, 0x17, 0x58, 0x53, 0xb8, 0x65, 0x13, 0xbb, 0x56, 0xcb, 0x66, 0x62, 0x03, 0x2f, + 0x7e, 0x9d, 0x06, 0xde, 0x95, 0xfa, 0x88, 0xe3, 0x4d, 0x87, 0xe4, 0x35, 0x9a, 0x0e, 0x4f, 0x20, + 0xc5, 0x52, 0x67, 0xf6, 0x2e, 0x68, 0x7a, 0x4f, 0x64, 0xfc, 0x60, 0x78, 0xf7, 0xc8, 0xa9, 0x9b, + 0xae, 0x3d, 0xf4, 0x9e, 0x0c, 0x30, 0x98, 0xdf, 0xae, 0x49, 0x5f, 0xbd, 0x5d, 0x33, 0x5e, 0x38, + 0x64, 0xa6, 0x17, 0x0e, 0x3f, 0x04, 0x6e, 0x17, 0x22, 0xed, 0x86, 0x0b, 0x6f, 0xcf, 0x27, 0x2c, + 0x87, 0x19, 0x01, 0xcf, 0xbb, 0x73, 0x76, 0xe0, 0x6b, 0xf1, 0x10, 0x80, 0x57, 0x06, 0x66, 0xc7, + 0x9a, 0xc1, 0x89, 0x2f, 0x41, 0x8a, 0x38, 0xc7, 0x3e, 0x66, 0xda, 0xe9, 0x45, 0x55, 0x0e, 0xe4, + 0x16, 0xd5, 0x87, 0x5c, 0x70, 0x0b, 0x91, 0x04, 0xb1, 0x67, 0x78, 0xc8, 0x0d, 0x8f, 0xfc, 0x89, + 0x76, 0x20, 0xe1, 0xc7, 0xfe, 0xe9, 0x8f, 0x58, 0xa7, 0x9e, 0x0d, 0x99, 0xae, 0xcc, 0x44, 0x7c, + 0x1c, 0x7d, 0x18, 0x59, 0xfc, 0xdf, 0x28, 0xe4, 0x82, 0xcb, 0x44, 0x3f, 0x82, 0x14, 0x5b, 0xa8, + 0x78, 0x27, 0xfb, 0xe9, 0xd5, 0xf6, 0x8b, 0x7f, 0x88, 0x75, 0x72, 0x99, 0xa8, 0x09, 0x79, 0x67, + 0x60, 0xbf, 0xd0, 0x5f, 0xa8, 0x86, 0xd2, 0xb5, 0x54, 0x83, 0xae, 0xa3, 0xb0, 0x71, 0x77, 0xda, + 0x43, 0x14, 0x4e, 0xfb, 0xc8, 0x52, 0x0d, 0xd1, 0x67, 0x71, 0x02, 0x30, 0xf4, 0x91, 0x77, 0x8f, + 0xa4, 0x70, 0x07, 0xc7, 0xae, 0x67, 0x11, 0xb7, 0x9b, 0xa0, 0x93, 0x13, 0xad, 0x68, 0x06, 0x22, + 0x61, 0x9d, 0xeb, 0x07, 0xa6, 0x0f, 0x2c, 0x45, 0xb7, 0xdf, 0x0b, 0xeb, 0x8c, 0xae, 0x6e, 0x0e, + 0x7a, 0x7e, 0x58, 0xb7, 0x7d, 0x98, 0xb6, 0xf8, 0x21, 0x24, 0xb9, 0xac, 0xb7, 0x42, 0x1e, 0x69, + 0xd2, 0xe0, 0x14, 0x1f, 0x74, 0x94, 0xbe, 0xcb, 0x2b, 0xff, 0x2e, 0x07, 0x85, 0xc3, 0x61, 0x3f, + 0xe8, 0xe2, 0xae, 0x74, 0xe5, 0x32, 0xe9, 0x62, 0x25, 0x7a, 0xf9, 0x8b, 0x95, 0x0b, 0x7e, 0x58, + 0xc1, 0x14, 0x3d, 0x7e, 0x81, 0xa2, 0xd7, 0x20, 0x4e, 0x9f, 0xc6, 0x27, 0xe8, 0xb9, 0x4e, 0xf3, + 0xac, 0xe1, 0xd5, 0xae, 0x05, 0x5e, 0xc7, 0x53, 0x6e, 0xf4, 0x7d, 0xc8, 0xd1, 0x43, 0xe9, 0xe1, + 0xde, 0x31, 0xb6, 0x85, 0x43, 0x7b, 0x30, 0x9b, 0x34, 0x72, 0x3a, 0x7b, 0x94, 0x51, 0xf4, 0x64, + 0xb0, 0x07, 0x71, 0xd0, 0x03, 0x48, 0xa8, 0x86, 0x4e, 0xbd, 0xdb, 0xab, 0x7e, 0x72, 0xc1, 0x08, + 0xd1, 0xa7, 0x90, 0x57, 0x6d, 0x5b, 0x1d, 0xf2, 0x1f, 0x0f, 0x68, 0xd4, 0x83, 0x71, 0xd7, 0x7c, + 0x7e, 0xb6, 0x9c, 0xad, 0x10, 0x24, 0xfd, 0xbd, 0x80, 0xd8, 0x88, 0xac, 0xea, 0x81, 0x42, 0x77, + 0x43, 0x99, 0xeb, 0xdd, 0x0d, 0xc1, 0x75, 0x42, 0xcb, 0x78, 0x94, 0xc8, 0x5e, 0x23, 0x4a, 0xfc, + 0x04, 0x16, 0xc5, 0xfb, 0x47, 0x22, 0xd0, 0xbf, 0x3f, 0x0c, 0xfc, 0xac, 0xa3, 0x7c, 0x7e, 0xb6, + 0x5c, 0x92, 0x7d, 0x2a, 0x7f, 0xb9, 0xac, 0x32, 0x23, 0x3b, 0x55, 0xb2, 0x27, 0xe2, 0xb5, 0x40, + 0xbc, 0xc8, 0x5f, 0x3d, 0x5e, 0x84, 0x83, 0x7d, 0xe1, 0x5a, 0xc1, 0x7e, 0x3c, 0xf6, 0x14, 0xa7, + 0xc7, 0x9e, 0xa7, 0xa3, 0xb1, 0x47, 0xba, 0xb8, 0x01, 0x1b, 0x56, 0xe0, 0x0b, 0xe2, 0xce, 0xcf, + 0x63, 0x00, 0xbe, 0x7e, 0xa3, 0xef, 0xc0, 0xed, 0xfe, 0xc9, 0xd0, 0xd1, 0xdb, 0xaa, 0xa1, 0xd8, + 0xb8, 0x6f, 0x63, 0x07, 0x9b, 0x2c, 0xbd, 0xa7, 0x4e, 0x23, 0x27, 0xdf, 0x12, 0x68, 0x39, 0x84, + 0x45, 0x9f, 0xc0, 0x2d, 0xc3, 0xea, 0x4e, 0xe2, 0x0b, 0x76, 0x2e, 0x6e, 0x72, 0x9a, 0x11, 0x66, + 0x95, 0x94, 0x64, 0x7d, 0xf5, 0x58, 0x37, 0xfc, 0x66, 0xc6, 0x27, 0x97, 0xb5, 0xcd, 0xb5, 0xaa, + 0x27, 0x42, 0x3c, 0x40, 0xf1, 0x85, 0xa2, 0x1f, 0x8f, 0x3f, 0x95, 0xf8, 0xf8, 0xd2, 0x23, 0x4c, + 0x7f, 0x31, 0x51, 0x7e, 0x13, 0xc0, 0x1f, 0x9f, 0x5e, 0x8d, 0xef, 0xee, 0xfa, 0x59, 0x29, 0xbf, + 0x64, 0x2f, 0xdf, 0x7f, 0xc5, 0x4d, 0x3a, 0x40, 0x52, 0xae, 0xef, 0xb5, 0x9e, 0xd4, 0xc5, 0x5d, + 0xfa, 0x62, 0x6b, 0x24, 0x9c, 0x8e, 0xc7, 0xa7, 0xc8, 0x8c, 0xf1, 0x89, 0x5f, 0x6f, 0xbf, 0x0f, + 0x71, 0xfa, 0x1b, 0xa1, 0x34, 0xc4, 0xeb, 0xcd, 0xa3, 0x3d, 0x69, 0x0e, 0x65, 0x20, 0x51, 0xd9, + 0x6d, 0x54, 0x0e, 0xa4, 0x08, 0x5a, 0x00, 0x69, 0xef, 0x68, 0xf7, 0xb0, 0x21, 0xd7, 0x1f, 0x35, + 0x5a, 0x4d, 0x85, 0x12, 0x44, 0x03, 0x81, 0xe5, 0xef, 0xe2, 0x20, 0x31, 0xaf, 0x7e, 0xdd, 0xd0, + 0x32, 0xbd, 0xaf, 0xf5, 0xea, 0x1b, 0xf5, 0xb0, 0x15, 0xc6, 0xbf, 0xfe, 0x94, 0x3b, 0xf1, 0x35, + 0xa5, 0xdc, 0xc9, 0x6b, 0xa4, 0xdc, 0xa9, 0x6b, 0x38, 0xd3, 0x3f, 0x76, 0x6a, 0x1c, 0xd0, 0x90, + 0x5f, 0x46, 0x01, 0x02, 0xba, 0xf1, 0xbd, 0xe0, 0x0f, 0xe4, 0xa7, 0x5f, 0xad, 0x8f, 0xd4, 0xa7, + 0xdb, 0x73, 0xe2, 0xe7, 0xf3, 0x8f, 0x20, 0xad, 0xf1, 0xbc, 0x90, 0x67, 0xa8, 0xef, 0xcc, 0x9c, + 0x3e, 0x6e, 0xcf, 0xc9, 0x1e, 0x33, 0xfa, 0x24, 0xf4, 0xbb, 0xc8, 0x7b, 0x33, 0x99, 0xfe, 0xb6, + 0x78, 0xa0, 0x5d, 0x81, 0x24, 0x4b, 0x80, 0xb8, 0xb2, 0x4d, 0xfd, 0x81, 0xde, 0x88, 0x69, 0x6c, + 0xcf, 0xc9, 0x9c, 0x91, 0xd7, 0xb2, 0x29, 0x48, 0x0c, 0x4c, 0xdd, 0x32, 0xef, 0xcb, 0xc1, 0xa7, + 0xc1, 0xa2, 0x2b, 0x4b, 0xbc, 0x05, 0xfd, 0x5b, 0x75, 0xb1, 0xc6, 0xde, 0xe8, 0x1c, 0x99, 0x2f, + 0x3c, 0x40, 0x04, 0x15, 0x00, 0x38, 0x5e, 0x37, 0xbb, 0x52, 0x94, 0x56, 0xc0, 0x24, 0xdf, 0x27, + 0x5f, 0xb1, 0xfb, 0x9f, 0x82, 0x34, 0xfa, 0x0b, 0xc1, 0x80, 0x8f, 0x99, 0x87, 0xfc, 0xde, 0x93, + 0x6a, 0xf5, 0xb0, 0xb1, 0x57, 0x3f, 0x38, 0xac, 0xec, 0xed, 0xb3, 0x37, 0xa7, 0x87, 0xa4, 0x7c, + 0x6e, 0x35, 0x6a, 0x52, 0xf4, 0xfe, 0xa7, 0x50, 0x1c, 0x51, 0x08, 0xe2, 0x8e, 0xf6, 0x8f, 0x36, + 0x77, 0x1b, 0xd5, 0x89, 0xaf, 0x7d, 0x50, 0x16, 0x52, 0xad, 0xad, 0xad, 0xdd, 0x46, 0xb3, 0x2e, + 0xc5, 0xee, 0x7f, 0x0b, 0x72, 0xc1, 0xe4, 0x1a, 0x49, 0x90, 0xfb, 0x41, 0xab, 0x59, 0x57, 0xb6, + 0x2a, 0x8d, 0xdd, 0x23, 0x99, 0xcc, 0x00, 0x41, 0x81, 0xfb, 0x15, 0x01, 0x8b, 0x6c, 0xae, 0xfe, + 0xe6, 0x3f, 0x96, 0xe6, 0x7e, 0x73, 0xbe, 0x14, 0xf9, 0xed, 0xf9, 0x52, 0xe4, 0xf7, 0xe7, 0x4b, + 0x91, 0x7f, 0x3f, 0x5f, 0x8a, 0xfc, 0xf5, 0x1f, 0x96, 0xe6, 0x7e, 0xfb, 0x87, 0xa5, 0xb9, 0xdf, + 0xff, 0x61, 0x69, 0xee, 0x07, 0x49, 0xf6, 0x4f, 0x3b, 0xfc, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x16, 0xb2, 0xdf, 0x23, 0x45, 0x42, 0x00, 0x00, } diff --git a/pkg/sql/catalog/descpb/structured.proto b/pkg/sql/catalog/descpb/structured.proto index b2294902ab4b..c30d30a57bc9 100644 --- a/pkg/sql/catalog/descpb/structured.proto +++ b/pkg/sql/catalog/descpb/structured.proto @@ -989,6 +989,10 @@ message TableDescriptor { } optional SequenceOwner sequence_owner = 6 [(gogoproto.nullable) = false]; + + // The number of values (which have already been created in KV) + // that a node can cache locally. + optional int64 cache_size = 7 [(gogoproto.nullable) = false]; } // The presence of sequence_opts indicates that this descriptor is for a sequence. diff --git a/pkg/sql/catalog/systemschema/system.go b/pkg/sql/catalog/systemschema/system.go index 5adbb79e2b60..352222be10de 100644 --- a/pkg/sql/catalog/systemschema/system.go +++ b/pkg/sql/catalog/systemschema/system.go @@ -631,6 +631,7 @@ var ( MinValue: 1, MaxValue: math.MaxInt64, Start: 1, + CacheSize: 1, }, Privileges: descpb.NewCustomSuperuserPrivilegeDescriptor( descpb.SystemAllowedPrivileges[keys.DescIDSequenceID], security.NodeUserName()), diff --git a/pkg/sql/exec_util.go b/pkg/sql/exec_util.go index 562bf8678dc1..f047bd7fb4f1 100644 --- a/pkg/sql/exec_util.go +++ b/pkg/sql/exec_util.go @@ -2272,6 +2272,11 @@ func (m *sessionDataMutator) SetNoticeDisplaySeverity(severity pgnotice.DisplayS m.data.NoticeDisplaySeverity = severity } +// initSequenceCache creates an empty sequence cache instance for the session. +func (m *sessionDataMutator) initSequenceCache() { + m.data.SequenceCache = sessiondata.SequenceCache{} +} + type sqlStatsCollector struct { // sqlStats tracks per-application statistics for all applications on each // node. diff --git a/pkg/sql/logictest/testdata/logic_test/sequences b/pkg/sql/logictest/testdata/logic_test/sequences index ac45217471ff..04c3680ddbb8 100644 --- a/pkg/sql/logictest/testdata/logic_test/sequences +++ b/pkg/sql/logictest/testdata/logic_test/sequences @@ -96,20 +96,11 @@ CREATE SEQUENCE limit_test MAXVALUE 10 START WITH 11 statement error pgcode 22023 START value \(5\) cannot be less than MINVALUE \(10\) CREATE SEQUENCE limit_test MINVALUE 10 START WITH 5 -statement error pgcode 22023 CACHE \(-1\) must be greater than zero -CREATE SEQUENCE cache_test CACHE -1 - -statement error pgcode 22023 CACHE \(0\) must be greater than zero -CREATE SEQUENCE cache_test CACHE 0 - -statement error pgcode 0A000 CACHE values larger than 1 are not supported, found 5 -CREATE SEQUENCE cache_test CACHE 5 - statement error pgcode 0A000 CYCLE option is not supported CREATE SEQUENCE cycle_test CYCLE statement ok -CREATE SEQUENCE ignored_options_test CACHE 1 NO CYCLE +CREATE SEQUENCE ignored_options_test NO CYCLE # Verify presence in crdb_internal.create_statements. @@ -120,7 +111,7 @@ query ITTITTTTTTTB colnames SELECT * FROM crdb_internal.create_statements WHERE descriptor_name = 'show_create_test' ---- database_id database_name schema_name descriptor_id descriptor_type descriptor_name create_statement state create_nofks alter_statements validate_statements has_partitions -52 test public 66 sequence show_create_test CREATE SEQUENCE public.show_create_test MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1 PUBLIC CREATE SEQUENCE public.show_create_test MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1 {} {} false +52 test public 63 sequence show_create_test CREATE SEQUENCE public.show_create_test MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1 PUBLIC CREATE SEQUENCE public.show_create_test MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1 {} {} false query TT colnames SHOW CREATE SEQUENCE show_create_test @@ -1278,3 +1269,63 @@ ALTER SEQUENCE db2.seq OWNED BY db1.t.a statement ok CREATE SEQUENCE db2.seq2 OWNED BY db1.t.a + +subtest cached_sequences + +statement error pgcode 22023 CACHE \(-1\) must be greater than zero +CREATE SEQUENCE cache_test CACHE -1 + +statement error pgcode 22023 CACHE \(0\) must be greater than zero +CREATE SEQUENCE cache_test CACHE 0 + +statement ok +CREATE SEQUENCE cache_test CACHE 10 INCREMENT 1 + +# Verify cache invalidation with schema changes. + +# 10 values (1,2,...,10) are cached, and the underlying sequence is increment to 10. +query I +SELECT nextval('cache_test') +---- +1 + +query I +SELECT last_value FROM cache_test +---- +10 + +statement ok +BEGIN + +statement ok +ALTER SEQUENCE cache_test INCREMENT 5 + +# The cache is invalidated due to the above schema change, and 10 new values (15,20,...,60) are cached. +query I +SELECT nextval('cache_test') +---- +15 + +# Rollback the schema change to use the old INCREMENT amount. +statement ok +ABORT + +# The underlying sequence was still incremented despite the txn being aborted. +query I +SELECT last_value FROM cache_test +---- +60 + +# 10 new values (61,62,...,70) are cached. +query I +SELECT nextval('cache_test') +---- +61 + +query I +SELECT last_value FROM cache_test +---- +70 + +statement ok +DROP SEQUENCE cache_test diff --git a/pkg/sql/planner.go b/pkg/sql/planner.go index ab3c9a840f67..3ad920c9b3d5 100644 --- a/pkg/sql/planner.go +++ b/pkg/sql/planner.go @@ -452,6 +452,16 @@ func (p *planner) ExecCfg() *ExecutorConfig { return p.extendedEvalCtx.ExecCfg } +// GetOrInitSequenceCache returns the sequence cache for the session. +// If the sequence cache has not been used yet, it initializes the cache +// inside the session data. +func (p *planner) GetOrInitSequenceCache() sessiondata.SequenceCache { + if p.SessionData().SequenceCache == nil { + p.sessionDataMutator.initSequenceCache() + } + return p.SessionData().SequenceCache +} + func (p *planner) LeaseMgr() *lease.Manager { return p.Descriptors().LeaseManager() } diff --git a/pkg/sql/sequence.go b/pkg/sql/sequence.go index 15c036ef7e51..892eef6fab57 100644 --- a/pkg/sql/sequence.go +++ b/pkg/sql/sequence.go @@ -87,27 +87,72 @@ func (p *planner) IncrementSequence(ctx context.Context, seqName *tree.TableName } seqOpts := descriptor.GetSequenceOpts() + var val int64 if seqOpts.Virtual { rowid := builtins.GenerateUniqueInt(p.EvalContext().NodeID.SQLInstanceID()) val = int64(rowid) } else { + val, err = p.incrementSequenceUsingCache(ctx, descriptor) + } + if err != nil { + return 0, err + } + + p.ExtendedEvalContext().SessionMutator.RecordLatestSequenceVal(uint32(descriptor.GetID()), val) + + return val, nil +} + +// incrementSequenceUsingCache fetches the next value of the sequence represented by the passed catalog.TableDescriptor. +// If the sequence has a cache size of greater than 1, then this function will read cached values from the session data +// and repopulate these values whenever the cache is empty. +func (p *planner) incrementSequenceUsingCache( + ctx context.Context, descriptor catalog.TableDescriptor, +) (int64, error) { + seqOpts := descriptor.GetSequenceOpts() + + // A cache size of 1 means that there is no cache. Prior to #51259, sequence + // caching was unimplemented and cache sizes were left uninitialized (ie. to have a value of 0). + // If a sequence has a cache size of 0, it should be treated in the same was as sequences + // with cache sizes of 1. + cacheSize := seqOpts.CacheSize + if cacheSize == 0 { + cacheSize = 1 + } + + fetchNextValues := func() (int64, int64, int64, error) { seqValueKey := p.ExecCfg().Codec.SequenceKey(uint32(descriptor.GetID())) - val, err = kv.IncrementValRetryable( - ctx, p.txn.DB(), seqValueKey, seqOpts.Increment) + + endValue, err := kv.IncrementValRetryable( + ctx, p.txn.DB(), seqValueKey, seqOpts.Increment*cacheSize) + if err != nil { if errors.HasType(err, (*roachpb.IntegerOverflowError)(nil)) { - return 0, boundsExceededError(descriptor) + return 0, 0, 0, boundsExceededError(descriptor) } - return 0, err + return 0, 0, 0, err } - if val > seqOpts.MaxValue || val < seqOpts.MinValue { - return 0, boundsExceededError(descriptor) + if endValue > seqOpts.MaxValue || endValue < seqOpts.MinValue { + return 0, 0, 0, boundsExceededError(descriptor) } - } - p.ExtendedEvalContext().SessionMutator.RecordLatestSequenceVal(uint32(descriptor.GetID()), val) + return endValue - seqOpts.Increment*(cacheSize-1), seqOpts.Increment, cacheSize, nil + } + var val int64 + var err error + if cacheSize == 1 { + val, _, _, err = fetchNextValues() + if err != nil { + return 0, err + } + } else { + val, err = p.GetOrInitSequenceCache().NextValue(uint32(descriptor.GetID()), uint32(descriptor.GetVersion()), fetchNextValues) + if err != nil { + return 0, err + } + } return val, nil } @@ -263,6 +308,8 @@ func assignSequenceOptions( opts.MaxValue = -1 opts.Start = opts.MaxValue } + // No Caching + opts.CacheSize = 1 } // Fill in all other options. @@ -290,8 +337,7 @@ func assignSequenceOptions( case v == 1: // Do nothing; this is the default. case v > 1: - return unimplemented.NewWithIssuef(32567, - "CACHE values larger than 1 are not supported, found %d", v) + opts.CacheSize = *option.IntVal } case tree.SeqOptIncrement: // Do nothing; this has already been set. diff --git a/pkg/sql/sequence_test.go b/pkg/sql/sequence_test.go index 25f84ebe329e..8c677e4b535b 100644 --- a/pkg/sql/sequence_test.go +++ b/pkg/sql/sequence_test.go @@ -8,11 +8,14 @@ // by the Apache License, Version 2.0, included in the file // licenses/APL.txt. -package sql +package sql_test import ( "context" + "fmt" "math" + "math/rand" + "sync" "testing" "github.com/cockroachdb/cockroach/pkg/base" @@ -23,6 +26,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/sql/catalog/catalogkv" "github.com/cockroachdb/cockroach/pkg/testutils/serverutils" "github.com/cockroachdb/cockroach/pkg/testutils/sqlutils" + "github.com/cockroachdb/cockroach/pkg/testutils/testcluster" "github.com/cockroachdb/cockroach/pkg/util/leaktest" "github.com/stretchr/testify/require" ) @@ -353,6 +357,288 @@ CREATE SEQUENCE t.valid_seq OWNED BY t.test.a`) } } +// TestCachedSequences tests the behavior of cached sequences. +func TestCachedSequences(t *testing.T) { + defer leaktest.AfterTest(t)() + + // Start test cluster. + ctx := context.Background() + tc := testcluster.StartTestCluster(t, 3, base.TestClusterArgs{}) + defer tc.Stopper().Stop(ctx) + + sqlSessions := []*sqlutils.SQLRunner{} + for i := 0; i < 3; i++ { + newConn, err := tc.ServerConn(0).Conn(ctx) + if err != nil { + t.Fatal(err) + } + sqlSessions = append(sqlSessions, sqlutils.MakeSQLRunner(newConn)) + } + + anySession := func() int { + return rand.Intn(3) + } + + execStmt := func(statement string) { + sqlSessions[anySession()].Exec(t, statement) + } + + checkIntValue := func(session int, statement string, value int) { + sqlSessions[session].CheckQueryResults(t, statement, [][]string{ + {fmt.Sprintf("%d", value)}, + }) + } + + testCases := []struct { + name string + test func(*testing.T) + }{ + // Test a cached sequences in a single session. + { + name: "Single Session Cache Test", + test: func(t *testing.T) { + execStmt(` + CREATE SEQUENCE s + CACHE 5 + INCREMENT BY 2 + START WITH 2 + `) + + // The cache starts out empty. When the cache is empty, the underlying sequence in the database + // should be incremented by the cache size * increment amount, so it should increase by 10 each time. + + // Session 0 caches 5 values (2,4,6,8,10) and uses the first value (2). + // + // caches: + // session 0: 4,6,8,10 + // db: + // s: 10 + checkIntValue(0, "SELECT nextval('s')", 2) + checkIntValue(anySession(), "SELECT last_value FROM s", 10) + + // caches: + // session 0: - + // db: + // s: 10 + for sequenceNumber := 4; sequenceNumber <= 10; sequenceNumber += 2 { + checkIntValue(0, "SELECT nextval('s')", sequenceNumber) + } + checkIntValue(anySession(), "SELECT last_value FROM s", 10) + + // Session 0 caches 5 values (12,14,16,18,20) and uses the first value (12). + // caches: + // session 0: 14,16,18,20 + // db: + // s: 20 + checkIntValue(0, "SELECT nextval('s')", 12) + checkIntValue(anySession(), "SELECT last_value FROM s", 20) + + // caches: + // node 0: - + // db: + // s: 20 + for sequenceNumber := 14; sequenceNumber <= 20; sequenceNumber += 2 { + checkIntValue(0, "SELECT nextval('s')", sequenceNumber) + } + checkIntValue(anySession(), "SELECT last_value FROM s", 20) + + execStmt("DROP SEQUENCE s") + }, + }, + // Test multiple cached sequences using multiple sessions. + { + name: "Multi-Session, Multi-Sequence Cache Test", + test: func(t *testing.T) { + execStmt(` + CREATE SEQUENCE s1 + CACHE 5 + INCREMENT BY 2 + START WITH 2 + `) + + execStmt(` + CREATE SEQUENCE s2 + CACHE 4 + INCREMENT BY 3 + START WITH 3 + `) + + // The caches all start out empty. When a cache is empty, the underlying sequence in the database + // should be incremented by the cache size * increment amount. + // + // s1 increases by 10 each time, and s2 increases by 12 each time. + + // caches: + // session 0: + // s1: 4,6,8,10 + // session 1: - + // session 2: - + // db: + // s1: 10 + checkIntValue(0, "SELECT nextval('s1')", 2) + checkIntValue(anySession(), "SELECT last_value FROM s1", 10) + + // caches: + // session 0: + // s1: 4,6,8,10 + // s2: 6,9,12 + // session 1: - + // session 2: - + // db: + // s1: 10 + // s2: 12 + checkIntValue(0, "SELECT nextval('s2')", 3) + checkIntValue(anySession(), "SELECT last_value FROM s2", 12) + + // caches: + // session 0: + // s1: 4,6,8,10 + // s2: 6,9,12 + // session 1: + // s1: 14,16,18,20 + // session 2: - + // db: + // s1: 20 + // s2: 12 + checkIntValue(1, "SELECT nextval('s1')", 12) + checkIntValue(anySession(), "SELECT last_value FROM s1", 20) + + // caches: + // session 0: + // s1: 4,6,8,10 + // s2: 6,9,12 + // session 1: + // s1: 14,16,18,20 + // s2: 18,21,24 + // session 2: - + // db: + // s1: 20 + // s2: 24 + checkIntValue(1, "SELECT nextval('s2')", 15) + checkIntValue(anySession(), "SELECT last_value FROM s2", 24) + + // caches: + // session 0: + // s1: 4,6,8,10 + // s2: 6,9,12 + // session 1: + // s1: 14,16,18,20 + // s2: 18,21,24 + // session 2: + // s1: 24,26,28,30 + // db: + // s1: 30 + // s2: 24 + checkIntValue(2, "SELECT nextval('s1')", 22) + checkIntValue(anySession(), "SELECT last_value FROM s1", 30) + + // caches: + // session 0: + // s1: 4,6,8,10 + // s2: 6,9,12 + // session 1: + // s1: 14,16,18,20 + // s2: 18,21,24 + // session 2: + // s1: 24,26,28,30 + // s2: 30,33,36 + // db: + // s1: 30 + // s2: 36 + checkIntValue(2, "SELECT nextval('s2')", 27) + checkIntValue(anySession(), "SELECT last_value FROM s2", 36) + + // caches: + // session 0: + // s1: 4,6,8,10 + // s2: 6,9,12 + // session 1: + // s1: 14,16,18,20 + // s2: 18,21,24 + // session 2: + // s1: 24,26,28,30 + // s2: 30,33,36 + // db: + // s1: 30 + // s2: 36 + wg := sync.WaitGroup{} + emptyCache := func(session, start, finish, inc int, seq string) { + for sequenceNumber := start; sequenceNumber <= finish; sequenceNumber += inc { + checkIntValue(session, fmt.Sprintf("SELECT nextval('%s')", seq), sequenceNumber) + } + wg.Done() + } + wg.Add(3) + go emptyCache(0, 4, 10, 2, "s1") + go emptyCache(1, 14, 20, 2, "s1") + go emptyCache(2, 24, 30, 2, "s1") + wg.Wait() + + wg.Add(3) + go emptyCache(0, 6, 12, 3, "s2") + go emptyCache(1, 18, 24, 3, "s2") + go emptyCache(2, 30, 36, 3, "s2") + wg.Wait() + + // caches: + // session 0: - + // session 1: - + // session 2: - + // db: + // s1: 30 + // s2: 36 + checkIntValue(anySession(), "SELECT last_value FROM s1", 30) + checkIntValue(anySession(), "SELECT last_value FROM s2", 36) + + execStmt("DROP SEQUENCE s1") + execStmt("DROP SEQUENCE s2") + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tc.test(t) + }) + } +} + +// TestSequencesZeroCacheSize is a regression test for #51259, sequence caching. +// Prior sequences will have cache sizes of 0, and sequences made after will have +// a cache size of at least 1 where 1 means no caching. This test verifies that sequences +// cache sizes of 0 function in the same way as sequences with a cache size of 1. +func TestSequencesZeroCacheSize(t *testing.T) { + defer leaktest.AfterTest(t)() + + ctx := context.Background() + params := base.TestServerArgs{} + s, sqlConn, kvDB := serverutils.StartServer(t, params) + defer s.Stopper().Stop(ctx) + + sqlDB := sqlutils.MakeSQLRunner(sqlConn) + + sqlDB.Exec(t, ` + CREATE DATABASE test; + CREATE SEQUENCE test.seq INCREMENT BY 1 START WITH 1; + `) + + // Alter the descriptor to have a cache size of 0. + seqDesc := catalogkv.TestingGetMutableExistingTableDescriptor(kvDB, keys.SystemSQLCodec, "test", "seq") + seqDesc.SequenceOpts.CacheSize = 0 + err := kvDB.Put( + context.Background(), + catalogkeys.MakeDescMetadataKey(keys.SystemSQLCodec, seqDesc.GetID()), + seqDesc.DescriptorProto(), + ) + require.NoError(t, err) + + // Verify the sequences increases by 1. + sqlDB.CheckQueryResults(t, `SELECT nextval('test.seq')`, [][]string{{"1"}}) + sqlDB.CheckQueryResults(t, `SELECT last_value from test.seq`, [][]string{{"1"}}) + sqlDB.CheckQueryResults(t, `SELECT nextval('test.seq')`, [][]string{{"2"}}) + sqlDB.CheckQueryResults(t, `SELECT last_value from test.seq`, [][]string{{"2"}}) +} + // addOwnedSequence adds the sequence referenced by seqName to the // ownsSequenceIDs of the column referenced by (dbName, tableName, colIdx). func addOwnedSequence( diff --git a/pkg/sql/sessiondata/BUILD.bazel b/pkg/sql/sessiondata/BUILD.bazel index b5706b3c479c..98a157ce4cf9 100644 --- a/pkg/sql/sessiondata/BUILD.bazel +++ b/pkg/sql/sessiondata/BUILD.bazel @@ -5,6 +5,7 @@ go_library( srcs = [ "internal.go", "search_path.go", + "sequence_cache.go", "sequence_state.go", "session_data.go", ], diff --git a/pkg/sql/sessiondata/sequence_cache.go b/pkg/sql/sessiondata/sequence_cache.go new file mode 100644 index 000000000000..d3503b937b60 --- /dev/null +++ b/pkg/sql/sessiondata/sequence_cache.go @@ -0,0 +1,69 @@ +// Copyright 2020 The Cockroach Authors. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0, included in the file +// licenses/APL.txt. + +package sessiondata + +// SequenceCache stores sequence values that have already been created in KV +// and are available to be given out as sequence numbers. Values for sequences +// are keyed by the descpb.ID of each sequence. These IDs are represented as +// uint32 to prevent an import cycle with the descpb package. The cache should +// only be accessed using the provided API. +// +// The cache ensures that values are invalidated when new descriptor versions are seen. Note that +// new descriptor versions may not monotonically increase. For example, the sequence schema +// may be altered in a txn, so the cache sees a new version V and invalidates/repopulates itself. Then, +// the txn may get rolled back, so the cache will see version V-1 and invalidate/repopulate itself again. +type SequenceCache map[uint32]*sequenceCacheEntry + +type sequenceCacheEntry struct { + // cachedVersion stores the descpb.DescriptorVersion that cached values are associated with. + // The version is checked to determine if cache needs to be invalidated. The version is stored as + // a uint32 to prevent an import cycle with the descpb package. + cachedVersion uint32 + // currentValue stores the present value of the sequence to be given out. + currentValue int64 + // increment stores the amount to increment the currentVal by each time the + // currentVal is used. This value corresponds to descpb.TableDescriptor_SequenceOpts.Increment. + increment int64 + // numValues represents the number of values to cache. The cache is considered + // to be empty when numValues is 0. + numValues int64 +} + +// NextValue fetches the next value in the sequence cache. If the values in the cache have all been +// given out or if the descriptor version has changed, then fetchNextValues() is used to repopulate the cache. +func (sc SequenceCache) NextValue( + seqID uint32, clientVersion uint32, fetchNextValues func() (int64, int64, int64, error), +) (int64, error) { + // Create entry for this sequence ID if there are no existing entries. + if _, found := sc[seqID]; !found { + sc[seqID] = &sequenceCacheEntry{} + } + cacheEntry := sc[seqID] + + if cacheEntry.numValues > 0 && cacheEntry.cachedVersion == clientVersion { + cacheEntry.currentValue += cacheEntry.increment + cacheEntry.numValues-- + return cacheEntry.currentValue - cacheEntry.increment, nil + } + + currentValue, increment, numValues, err := fetchNextValues() + if err != nil { + return 0, err + } + + // One value must be returned, and the rest of the values are stored. + val := currentValue + cacheEntry.currentValue = currentValue + increment + cacheEntry.increment = increment + cacheEntry.numValues = numValues - 1 + cacheEntry.cachedVersion = clientVersion + return val, nil +} diff --git a/pkg/sql/sessiondata/session_data.go b/pkg/sql/sessiondata/session_data.go index d2589f1fb992..8d0257a00168 100644 --- a/pkg/sql/sessiondata/session_data.go +++ b/pkg/sql/sessiondata/session_data.go @@ -236,6 +236,10 @@ type LocalOnlySessionData struct { // NewSchemaChangerMode indicates whether to use the new schema changer. NewSchemaChangerMode NewSchemaChangerMode + + // SequenceCache stores sequence values which have been cached using the + // CACHE sequence option. + SequenceCache SequenceCache /////////////////////////////////////////////////////////////////////////// // WARNING: consider whether a session parameter you're adding needs to // // be propagated to the remote nodes. If so, that parameter should live //