Merge pull request #75993 from caesarxuchao/add-count

Adding RemainingItemCount to ListMeta
This commit is contained in:
Kubernetes Prow Robot 2019-05-06 22:53:40 -07:00 committed by GitHub
commit 1fb8ed12a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 321 additions and 223 deletions

View File

@ -17442,6 +17442,11 @@
"description": "continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a consistent list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response, unless you have received this token from an error message.", "description": "continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a consistent list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response, unless you have received this token from an error message.",
"type": "string" "type": "string"
}, },
"remainingItemCount": {
"description": "RemainingItemCount is the number of subsequent items in the list which are not included in this list response. If the list request contained label or field selectors, then the number of remaining items is unknown and this field will be unset. If the list is complete (either because it is unpaginated or because this is the last page), then there are no more remaining items and this field will also be unset. Servers older than v1.15 do not set this field.",
"format": "int64",
"type": "integer"
},
"resourceVersion": { "resourceVersion": {
"description": "String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency", "description": "String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency",
"type": "string" "type": "string"

View File

@ -1851,6 +1851,13 @@ func schema_pkg_apis_meta_v1_ListMeta(ref common.ReferenceCallback) common.OpenA
Format: "", Format: "",
}, },
}, },
"remainingItemCount": {
SchemaProps: spec.SchemaProps{
Description: "RemainingItemCount is the number of subsequent items in the list which are not included in this list response. If the list request contained label or field selectors, then the number of remaining items is unknown and this field will be unset. If the list is complete (either because it is unpaginated or because this is the last page), then there are no more remaining items and this field will also be unset. Servers older than v1.15 do not set this field.",
Type: []string{"integer"},
Format: "int64",
},
},
}, },
}, },
}, },

View File

@ -1199,6 +1199,9 @@ func (m *ListMeta) MarshalTo(dAtA []byte) (int, error) {
i++ i++
i = encodeVarintGenerated(dAtA, i, uint64(len(m.Continue))) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Continue)))
i += copy(dAtA[i:], m.Continue) i += copy(dAtA[i:], m.Continue)
dAtA[i] = 0x20
i++
i = encodeVarintGenerated(dAtA, i, uint64(m.RemainingItemCount))
return i, nil return i, nil
} }
@ -2388,6 +2391,7 @@ func (m *ListMeta) Size() (n int) {
n += 1 + l + sovGenerated(uint64(l)) n += 1 + l + sovGenerated(uint64(l))
l = len(m.Continue) l = len(m.Continue)
n += 1 + l + sovGenerated(uint64(l)) n += 1 + l + sovGenerated(uint64(l))
n += 1 + sovGenerated(uint64(m.RemainingItemCount))
return n return n
} }
@ -2940,6 +2944,7 @@ func (this *ListMeta) String() string {
`SelfLink:` + fmt.Sprintf("%v", this.SelfLink) + `,`, `SelfLink:` + fmt.Sprintf("%v", this.SelfLink) + `,`,
`ResourceVersion:` + fmt.Sprintf("%v", this.ResourceVersion) + `,`, `ResourceVersion:` + fmt.Sprintf("%v", this.ResourceVersion) + `,`,
`Continue:` + fmt.Sprintf("%v", this.Continue) + `,`, `Continue:` + fmt.Sprintf("%v", this.Continue) + `,`,
`RemainingItemCount:` + fmt.Sprintf("%v", this.RemainingItemCount) + `,`,
`}`, `}`,
}, "") }, "")
return s return s
@ -6185,6 +6190,25 @@ func (m *ListMeta) Unmarshal(dAtA []byte) error {
} }
m.Continue = string(dAtA[iNdEx:postIndex]) m.Continue = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex iNdEx = postIndex
case 4:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field RemainingItemCount", wireType)
}
m.RemainingItemCount = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.RemainingItemCount |= (int64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:]) skippy, err := skipGenerated(dAtA[iNdEx:])
@ -9497,180 +9521,182 @@ func init() {
} }
var fileDescriptorGenerated = []byte{ var fileDescriptorGenerated = []byte{
// 2796 bytes of a gzipped FileDescriptorProto // 2825 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x1a, 0x4d, 0x6c, 0x23, 0x57, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x1a, 0xcf, 0x6f, 0x23, 0x57,
0x39, 0x63, 0xc7, 0x8e, 0xfd, 0x39, 0xde, 0x4d, 0xde, 0xee, 0x82, 0x1b, 0x44, 0x9c, 0x4e, 0x51, 0x39, 0x63, 0xc7, 0x8e, 0xfd, 0x39, 0xde, 0x4d, 0xde, 0xee, 0x82, 0x1b, 0x44, 0x9c, 0x4e, 0x51,
0xb5, 0x85, 0xad, 0xd3, 0xdd, 0xd2, 0x6a, 0xd9, 0xd2, 0x42, 0x9c, 0x9f, 0x6d, 0xe8, 0xa6, 0x89, 0xb5, 0x85, 0xad, 0xd3, 0xdd, 0xd2, 0x6a, 0xd9, 0xd2, 0x42, 0x9c, 0x1f, 0xdb, 0xd0, 0x4d, 0x13,
0x5e, 0x76, 0x17, 0xb1, 0xac, 0x50, 0x27, 0x9e, 0x17, 0x67, 0xc8, 0x78, 0xc6, 0x7d, 0x6f, 0x9c, 0xbd, 0xec, 0x2e, 0x62, 0x59, 0xa1, 0x4e, 0x3c, 0x2f, 0xce, 0x90, 0xf1, 0x8c, 0xfb, 0xde, 0x38,
0x5d, 0xc3, 0x81, 0x1e, 0x40, 0x80, 0x04, 0x55, 0x8f, 0x9c, 0x50, 0x2b, 0xb8, 0x70, 0xe5, 0xc4, 0xbb, 0x86, 0x03, 0x3d, 0x80, 0x00, 0x09, 0xaa, 0x1e, 0x39, 0xa1, 0x56, 0xf0, 0x17, 0x70, 0xe2,
0x89, 0x53, 0x25, 0x7a, 0x41, 0xaa, 0xc4, 0x81, 0x1e, 0x90, 0xd5, 0x06, 0x24, 0xb8, 0x71, 0xcf, 0xc4, 0xa9, 0x12, 0xbd, 0x20, 0x55, 0xe2, 0x40, 0x0f, 0xc8, 0x6a, 0x03, 0x12, 0xdc, 0x38, 0x71,
0x09, 0xbd, 0xbf, 0x99, 0x37, 0x76, 0xbc, 0x19, 0xb3, 0xa5, 0xe2, 0xe4, 0x99, 0xef, 0xff, 0xbd, 0xc9, 0x09, 0xbd, 0x5f, 0x33, 0x6f, 0xec, 0x78, 0x33, 0x66, 0x4b, 0xc5, 0xc9, 0x33, 0xdf, 0xcf,
0xf7, 0xbd, 0xef, 0x6f, 0x0c, 0x5b, 0x87, 0xd7, 0x59, 0xc3, 0x0b, 0x97, 0x0f, 0x7b, 0x7b, 0x84, 0xf7, 0xbe, 0xf7, 0xbd, 0xef, 0xd7, 0x18, 0xb6, 0x0e, 0xaf, 0xb3, 0x86, 0x17, 0x2e, 0x1f, 0xf6,
0x06, 0x24, 0x22, 0x6c, 0xf9, 0x88, 0x04, 0x6e, 0x48, 0x97, 0x15, 0xc2, 0xe9, 0x7a, 0x1d, 0xa7, 0xf6, 0x08, 0x0d, 0x48, 0x44, 0xd8, 0xf2, 0x11, 0x09, 0xdc, 0x90, 0x2e, 0x2b, 0x84, 0xd3, 0xf5,
0x75, 0xe0, 0x05, 0x84, 0xf6, 0x97, 0xbb, 0x87, 0x6d, 0x0e, 0x60, 0xcb, 0x1d, 0x12, 0x39, 0xcb, 0x3a, 0x4e, 0xeb, 0xc0, 0x0b, 0x08, 0xed, 0x2f, 0x77, 0x0f, 0xdb, 0x1c, 0xc0, 0x96, 0x3b, 0x24,
0x47, 0x57, 0x97, 0xdb, 0x24, 0x20, 0xd4, 0x89, 0x88, 0xdb, 0xe8, 0xd2, 0x30, 0x0a, 0xd1, 0x97, 0x72, 0x96, 0x8f, 0xae, 0x2e, 0xb7, 0x49, 0x40, 0xa8, 0x13, 0x11, 0xb7, 0xd1, 0xa5, 0x61, 0x14,
0x24, 0x57, 0xc3, 0xe4, 0x6a, 0x74, 0x0f, 0xdb, 0x1c, 0xc0, 0x1a, 0x9c, 0xab, 0x71, 0x74, 0x75, 0xa2, 0x2f, 0x49, 0xae, 0x86, 0xc9, 0xd5, 0xe8, 0x1e, 0xb6, 0x39, 0x80, 0x35, 0x38, 0x57, 0xe3,
0xe1, 0xd9, 0xb6, 0x17, 0x1d, 0xf4, 0xf6, 0x1a, 0xad, 0xb0, 0xb3, 0xdc, 0x0e, 0xdb, 0xe1, 0xb2, 0xe8, 0xea, 0xc2, 0xb3, 0x6d, 0x2f, 0x3a, 0xe8, 0xed, 0x35, 0x5a, 0x61, 0x67, 0xb9, 0x1d, 0xb6,
0x60, 0xde, 0xeb, 0xed, 0x8b, 0x37, 0xf1, 0x22, 0x9e, 0xa4, 0xd0, 0x85, 0xb1, 0xa6, 0xd0, 0x5e, 0xc3, 0x65, 0xc1, 0xbc, 0xd7, 0xdb, 0x17, 0x6f, 0xe2, 0x45, 0x3c, 0x49, 0xa1, 0x0b, 0x63, 0x97,
0x10, 0x79, 0x1d, 0x32, 0x6c, 0xc5, 0xc2, 0x8b, 0x67, 0x31, 0xb0, 0xd6, 0x01, 0xe9, 0x38, 0xc3, 0x42, 0x7b, 0x41, 0xe4, 0x75, 0xc8, 0xf0, 0x2a, 0x16, 0x5e, 0x3c, 0x8b, 0x81, 0xb5, 0x0e, 0x48,
0x7c, 0xf6, 0x9f, 0xf2, 0x50, 0x5a, 0xd9, 0xd9, 0xbc, 0x49, 0xc3, 0x5e, 0x17, 0x2d, 0xc1, 0x74, 0xc7, 0x19, 0xe6, 0xb3, 0xff, 0x98, 0x87, 0xd2, 0xca, 0xce, 0xe6, 0x4d, 0x1a, 0xf6, 0xba, 0x68,
0xe0, 0x74, 0x48, 0xcd, 0x5a, 0xb2, 0x2e, 0x97, 0x9b, 0xb3, 0x1f, 0x0c, 0xea, 0x53, 0xc7, 0x83, 0x09, 0xa6, 0x03, 0xa7, 0x43, 0x6a, 0xd6, 0x92, 0x75, 0xb9, 0xdc, 0x9c, 0xfd, 0x60, 0x50, 0x9f,
0xfa, 0xf4, 0xeb, 0x4e, 0x87, 0x60, 0x81, 0x41, 0x3e, 0x94, 0x8e, 0x08, 0x65, 0x5e, 0x18, 0xb0, 0x3a, 0x1e, 0xd4, 0xa7, 0x5f, 0x77, 0x3a, 0x04, 0x0b, 0x0c, 0xf2, 0xa1, 0x74, 0x44, 0x28, 0xf3,
0x5a, 0x6e, 0x29, 0x7f, 0xb9, 0x72, 0xed, 0x95, 0x46, 0x96, 0xf5, 0x37, 0x84, 0x82, 0xbb, 0x92, 0xc2, 0x80, 0xd5, 0x72, 0x4b, 0xf9, 0xcb, 0x95, 0x6b, 0xaf, 0x34, 0xb2, 0xec, 0xbf, 0x21, 0x14,
0x75, 0x23, 0xa4, 0x6b, 0x1e, 0x6b, 0x85, 0x47, 0x84, 0xf6, 0x9b, 0x73, 0x4a, 0x4b, 0x49, 0x21, 0xdc, 0x95, 0xac, 0x1b, 0x21, 0x5d, 0xf3, 0x58, 0x2b, 0x3c, 0x22, 0xb4, 0xdf, 0x9c, 0x53, 0x5a,
0x19, 0x8e, 0x35, 0xa0, 0x1f, 0x5b, 0x30, 0xd7, 0xa5, 0x64, 0x9f, 0x50, 0x4a, 0x5c, 0x85, 0xaf, 0x4a, 0x0a, 0xc9, 0x70, 0xac, 0x01, 0xfd, 0xd8, 0x82, 0xb9, 0x2e, 0x25, 0xfb, 0x84, 0x52, 0xe2,
0xe5, 0x97, 0xac, 0x4f, 0x41, 0x6d, 0x4d, 0xa9, 0x9d, 0xdb, 0x19, 0x92, 0x8f, 0x47, 0x34, 0xa2, 0x2a, 0x7c, 0x2d, 0xbf, 0x64, 0x7d, 0x0a, 0x6a, 0x6b, 0x4a, 0xed, 0xdc, 0xce, 0x90, 0x7c, 0x3c,
0xdf, 0x58, 0xb0, 0xc0, 0x08, 0x3d, 0x22, 0x74, 0xc5, 0x75, 0x29, 0x61, 0xac, 0xd9, 0x5f, 0xf5, 0xa2, 0x11, 0xfd, 0xc6, 0x82, 0x05, 0x46, 0xe8, 0x11, 0xa1, 0x2b, 0xae, 0x4b, 0x09, 0x63, 0xcd,
0x3d, 0x12, 0x44, 0xab, 0x9b, 0x6b, 0x98, 0xd5, 0xa6, 0xc5, 0x3e, 0x7c, 0x23, 0x9b, 0x41, 0xbb, 0xfe, 0xaa, 0xef, 0x91, 0x20, 0x5a, 0xdd, 0x5c, 0xc3, 0xac, 0x36, 0x2d, 0xec, 0xf0, 0x8d, 0x6c,
0xe3, 0xe4, 0x34, 0x6d, 0x65, 0xd1, 0xc2, 0x58, 0x12, 0x86, 0x1f, 0x61, 0x86, 0xbd, 0x0f, 0xb3, 0x0b, 0xda, 0x1d, 0x27, 0xa7, 0x69, 0xab, 0x15, 0x2d, 0x8c, 0x25, 0x61, 0xf8, 0x11, 0xcb, 0xb0,
0xfa, 0x20, 0x6f, 0x79, 0x2c, 0x42, 0x77, 0xa1, 0xd8, 0xe6, 0x2f, 0xac, 0x66, 0x09, 0x03, 0x1b, 0xf7, 0x61, 0x56, 0x1f, 0xe4, 0x2d, 0x8f, 0x45, 0xe8, 0x2e, 0x14, 0xdb, 0xfc, 0x85, 0xd5, 0x2c,
0xd9, 0x0c, 0xd4, 0x32, 0x9a, 0xe7, 0x94, 0x3d, 0x45, 0xf1, 0xca, 0xb0, 0x92, 0x66, 0xff, 0x7c, 0xb1, 0xc0, 0x46, 0xb6, 0x05, 0x6a, 0x19, 0xcd, 0x73, 0x6a, 0x3d, 0x45, 0xf1, 0xca, 0xb0, 0x92,
0x1a, 0x2a, 0x2b, 0x3b, 0x9b, 0x98, 0xb0, 0xb0, 0x47, 0x5b, 0x24, 0x83, 0xd3, 0x5c, 0x03, 0xe0, 0x66, 0xff, 0x7c, 0x1a, 0x2a, 0x2b, 0x3b, 0x9b, 0x98, 0xb0, 0xb0, 0x47, 0x5b, 0x24, 0x83, 0xd3,
0xbf, 0xac, 0xeb, 0xb4, 0x88, 0x5b, 0xcb, 0x2d, 0x59, 0x97, 0x4b, 0x4d, 0xa4, 0xe8, 0xe0, 0xf5, 0x5c, 0x03, 0xe0, 0xbf, 0xac, 0xeb, 0xb4, 0x88, 0x5b, 0xcb, 0x2d, 0x59, 0x97, 0x4b, 0x4d, 0xa4,
0x18, 0x83, 0x0d, 0x2a, 0x2e, 0xf5, 0xd0, 0x0b, 0x5c, 0x71, 0xda, 0x86, 0xd4, 0xd7, 0xbc, 0xc0, 0xe8, 0xe0, 0xf5, 0x18, 0x83, 0x0d, 0x2a, 0x2e, 0xf5, 0xd0, 0x0b, 0x5c, 0x71, 0xda, 0x86, 0xd4,
0xc5, 0x02, 0x83, 0x6e, 0x41, 0xe1, 0x88, 0xd0, 0x3d, 0xbe, 0xff, 0xdc, 0x21, 0xbe, 0x92, 0x6d, 0xd7, 0xbc, 0xc0, 0xc5, 0x02, 0x83, 0x6e, 0x41, 0xe1, 0x88, 0xd0, 0x3d, 0x6e, 0x7f, 0xee, 0x10,
0x79, 0x77, 0x39, 0x4b, 0xb3, 0x7c, 0x3c, 0xa8, 0x17, 0xc4, 0x23, 0x96, 0x42, 0x50, 0x03, 0x80, 0x5f, 0xc9, 0xb6, 0xbd, 0xbb, 0x9c, 0xa5, 0x59, 0x3e, 0x1e, 0xd4, 0x0b, 0xe2, 0x11, 0x4b, 0x21,
0x1d, 0x84, 0x34, 0x12, 0xe6, 0xd4, 0x0a, 0x4b, 0xf9, 0xcb, 0xe5, 0xe6, 0x39, 0x6e, 0xdf, 0x6e, 0xa8, 0x01, 0xc0, 0x0e, 0x42, 0x1a, 0x89, 0xe5, 0xd4, 0x0a, 0x4b, 0xf9, 0xcb, 0xe5, 0xe6, 0x39,
0x0c, 0xc5, 0x06, 0x05, 0xba, 0x0e, 0xb3, 0xcc, 0x0b, 0xda, 0x3d, 0xdf, 0xa1, 0x1c, 0x50, 0x2b, 0xbe, 0xbe, 0xdd, 0x18, 0x8a, 0x0d, 0x0a, 0x74, 0x1d, 0x66, 0x99, 0x17, 0xb4, 0x7b, 0xbe, 0x43,
0x0a, 0x3b, 0x2f, 0x2a, 0x3b, 0x67, 0x77, 0x0d, 0x1c, 0x4e, 0x51, 0x72, 0x4d, 0x2d, 0x27, 0x22, 0x39, 0xa0, 0x56, 0x14, 0xeb, 0xbc, 0xa8, 0xd6, 0x39, 0xbb, 0x6b, 0xe0, 0x70, 0x8a, 0x92, 0x6b,
0xed, 0x90, 0x7a, 0x84, 0xd5, 0x66, 0x12, 0x4d, 0xab, 0x31, 0x14, 0x1b, 0x14, 0xe8, 0x29, 0x28, 0x6a, 0x39, 0x11, 0x69, 0x87, 0xd4, 0x23, 0xac, 0x36, 0x93, 0x68, 0x5a, 0x8d, 0xa1, 0xd8, 0xa0,
0x88, 0x9d, 0xaf, 0x95, 0x84, 0x8a, 0xaa, 0x52, 0x51, 0x10, 0xc7, 0x82, 0x25, 0x0e, 0x3d, 0x03, 0x40, 0x4f, 0x41, 0x41, 0x58, 0xbe, 0x56, 0x12, 0x2a, 0xaa, 0x4a, 0x45, 0x41, 0x1c, 0x0b, 0x96,
0x33, 0xea, 0xd6, 0xd4, 0xca, 0x82, 0xec, 0xbc, 0x22, 0x9b, 0xd1, 0x6e, 0xad, 0xf1, 0xe8, 0x5b, 0x38, 0xf4, 0x0c, 0xcc, 0xa8, 0x5b, 0x53, 0x2b, 0x0b, 0xb2, 0xf3, 0x8a, 0x6c, 0x46, 0xbb, 0xb5,
0x80, 0x58, 0x14, 0x52, 0xa7, 0x4d, 0x14, 0xea, 0x55, 0x87, 0x1d, 0xd4, 0x40, 0x70, 0x2d, 0x28, 0xc6, 0xa3, 0x6f, 0x01, 0x62, 0x51, 0x48, 0x9d, 0x36, 0x51, 0xa8, 0x57, 0x1d, 0x76, 0x50, 0x03,
0x2e, 0xb4, 0x3b, 0x42, 0x81, 0x4f, 0xe1, 0xb2, 0x7f, 0x6f, 0xc1, 0x79, 0xc3, 0x17, 0x84, 0xdf, 0xc1, 0xb5, 0xa0, 0xb8, 0xd0, 0xee, 0x08, 0x05, 0x3e, 0x85, 0xcb, 0xfe, 0x9d, 0x05, 0xe7, 0x0d,
0x5d, 0x87, 0xd9, 0xb6, 0x71, 0xeb, 0x94, 0x5f, 0xc4, 0x3b, 0x63, 0xde, 0x48, 0x9c, 0xa2, 0x44, 0x5f, 0x10, 0x7e, 0x77, 0x1d, 0x66, 0xdb, 0xc6, 0xad, 0x53, 0x7e, 0x11, 0x5b, 0xc6, 0xbc, 0x91,
0x04, 0xca, 0x54, 0x49, 0xd2, 0xd1, 0xe5, 0x6a, 0x66, 0xa7, 0xd5, 0x36, 0x24, 0x9a, 0x0c, 0x20, 0x38, 0x45, 0x89, 0x08, 0x94, 0xa9, 0x92, 0xa4, 0xa3, 0xcb, 0xd5, 0xcc, 0x4e, 0xab, 0xd7, 0x90,
0xc3, 0x89, 0x64, 0xfb, 0x9f, 0x96, 0x70, 0x60, 0x1d, 0x6f, 0xd0, 0x65, 0x23, 0xa6, 0x59, 0xe2, 0x68, 0x32, 0x80, 0x0c, 0x27, 0x92, 0xed, 0x7f, 0x58, 0xc2, 0x81, 0x75, 0xbc, 0x41, 0x97, 0x8d,
0x38, 0x66, 0xc7, 0xc4, 0xa3, 0x33, 0x02, 0x41, 0xee, 0xff, 0x22, 0x10, 0xdc, 0x28, 0xfd, 0xea, 0x98, 0x66, 0x89, 0xe3, 0x98, 0x1d, 0x13, 0x8f, 0xce, 0x08, 0x04, 0xb9, 0xff, 0x8b, 0x40, 0x70,
0xdd, 0xfa, 0xd4, 0x5b, 0x7f, 0x5b, 0x9a, 0xb2, 0x3b, 0x50, 0x5d, 0xa5, 0xc4, 0x89, 0xc8, 0x76, 0xa3, 0xf4, 0xab, 0x77, 0xeb, 0x53, 0x6f, 0xfd, 0x75, 0x69, 0xca, 0xee, 0x40, 0x75, 0x95, 0x12,
0x37, 0x12, 0x0b, 0xb0, 0xa1, 0xe8, 0xd2, 0x3e, 0xee, 0x05, 0x6a, 0xa1, 0xc0, 0xef, 0xf7, 0x9a, 0x27, 0x22, 0xdb, 0xdd, 0x48, 0x6c, 0xc0, 0x86, 0xa2, 0x4b, 0xfb, 0xb8, 0x17, 0xa8, 0x8d, 0x02,
0x80, 0x60, 0x85, 0xe1, 0xe7, 0xb7, 0xef, 0x11, 0xdf, 0xdd, 0x72, 0x02, 0xa7, 0x4d, 0xa8, 0xba, 0xbf, 0xdf, 0x6b, 0x02, 0x82, 0x15, 0x86, 0x9f, 0xdf, 0xbe, 0x47, 0x7c, 0x77, 0xcb, 0x09, 0x9c,
0x81, 0xf1, 0xae, 0x6e, 0x18, 0x38, 0x9c, 0xa2, 0xb4, 0x7f, 0x9a, 0x87, 0xea, 0x1a, 0xf1, 0x49, 0x36, 0xa1, 0xea, 0x06, 0xc6, 0x56, 0xdd, 0x30, 0x70, 0x38, 0x45, 0x69, 0xff, 0x34, 0x0f, 0xd5,
0xa2, 0x6f, 0x03, 0x50, 0x9b, 0x3a, 0x2d, 0xb2, 0x43, 0xa8, 0x17, 0xba, 0xbb, 0xa4, 0x15, 0x06, 0x35, 0xe2, 0x93, 0x44, 0xdf, 0x06, 0xa0, 0x36, 0x75, 0x5a, 0x64, 0x87, 0x50, 0x2f, 0x74, 0x77,
0x2e, 0x13, 0x1e, 0x91, 0x6f, 0x7e, 0x8e, 0xfb, 0xd9, 0xcd, 0x11, 0x2c, 0x3e, 0x85, 0x03, 0xf9, 0x49, 0x2b, 0x0c, 0x5c, 0x26, 0x3c, 0x22, 0xdf, 0xfc, 0x1c, 0xf7, 0xb3, 0x9b, 0x23, 0x58, 0x7c,
0x50, 0xed, 0x52, 0xf1, 0xec, 0x45, 0x2a, 0xf7, 0xf0, 0x3b, 0xff, 0x7c, 0xb6, 0xad, 0xde, 0x31, 0x0a, 0x07, 0xf2, 0xa1, 0xda, 0xa5, 0xe2, 0xd9, 0x8b, 0x54, 0xee, 0xe1, 0x77, 0xfe, 0xf9, 0x6c,
0x59, 0x9b, 0xf3, 0xc7, 0x83, 0x7a, 0x35, 0x05, 0xc2, 0x69, 0xe1, 0xe8, 0x9b, 0x30, 0x17, 0xd2, 0xa6, 0xde, 0x31, 0x59, 0x9b, 0xf3, 0xc7, 0x83, 0x7a, 0x35, 0x05, 0xc2, 0x69, 0xe1, 0xe8, 0x9b,
0xee, 0x81, 0x13, 0xac, 0x91, 0x2e, 0x09, 0x5c, 0x12, 0x44, 0x4c, 0xec, 0x42, 0xa9, 0x79, 0x91, 0x30, 0x17, 0xd2, 0xee, 0x81, 0x13, 0xac, 0x91, 0x2e, 0x09, 0x5c, 0x12, 0x44, 0x4c, 0x58, 0xa1,
0x67, 0x8c, 0xed, 0x21, 0x1c, 0x1e, 0xa1, 0x46, 0xf7, 0x60, 0xbe, 0x4b, 0xc3, 0xae, 0xd3, 0x76, 0xd4, 0xbc, 0xc8, 0x33, 0xc6, 0xf6, 0x10, 0x0e, 0x8f, 0x50, 0xa3, 0x7b, 0x30, 0xdf, 0xa5, 0x61,
0xb8, 0xc4, 0x9d, 0xd0, 0xf7, 0x5a, 0x7d, 0x11, 0xa7, 0xca, 0xcd, 0x2b, 0xc7, 0x83, 0xfa, 0xfc, 0xd7, 0x69, 0x3b, 0x5c, 0xe2, 0x4e, 0xe8, 0x7b, 0xad, 0xbe, 0x88, 0x53, 0xe5, 0xe6, 0x95, 0xe3,
0xce, 0x30, 0xf2, 0x64, 0x50, 0xbf, 0x20, 0xb6, 0x8e, 0x43, 0x12, 0x24, 0x1e, 0x15, 0x63, 0x9c, 0x41, 0x7d, 0x7e, 0x67, 0x18, 0x79, 0x32, 0xa8, 0x5f, 0x10, 0xa6, 0xe3, 0x90, 0x04, 0x89, 0x47,
0x61, 0x61, 0xdc, 0x19, 0xda, 0x9b, 0x50, 0x5a, 0xeb, 0x51, 0xc1, 0x85, 0x5e, 0x86, 0x92, 0xab, 0xc5, 0x18, 0x67, 0x58, 0x18, 0x77, 0x86, 0xf6, 0x26, 0x94, 0xd6, 0x7a, 0x54, 0x70, 0xa1, 0x97,
0x9e, 0xd5, 0xce, 0x3f, 0xa9, 0x53, 0xae, 0xa6, 0x39, 0x19, 0xd4, 0xab, 0xbc, 0x48, 0x68, 0x68, 0xa1, 0xe4, 0xaa, 0x67, 0x65, 0xf9, 0x27, 0x75, 0xca, 0xd5, 0x34, 0x27, 0x83, 0x7a, 0x95, 0x17,
0x00, 0x8e, 0x59, 0xec, 0xfb, 0x50, 0x5d, 0x7f, 0xd8, 0x0d, 0x69, 0xa4, 0xcf, 0xf4, 0x69, 0x28, 0x09, 0x0d, 0x0d, 0xc0, 0x31, 0x8b, 0x7d, 0x1f, 0xaa, 0xeb, 0x0f, 0xbb, 0x21, 0x8d, 0xf4, 0x99,
0x12, 0x01, 0x10, 0xd2, 0x4a, 0x49, 0x9e, 0x90, 0x64, 0x58, 0x61, 0x79, 0xdc, 0x22, 0x0f, 0x9d, 0x3e, 0x0d, 0x45, 0x22, 0x00, 0x42, 0x5a, 0x29, 0xc9, 0x13, 0x92, 0x0c, 0x2b, 0x2c, 0x8f, 0x5b,
0x56, 0xa4, 0x02, 0x7e, 0x1c, 0xb7, 0xd6, 0x39, 0x10, 0x4b, 0x9c, 0xfd, 0xbe, 0x05, 0x45, 0xe1, 0xe4, 0xa1, 0xd3, 0x8a, 0x54, 0xc0, 0x8f, 0xe3, 0xd6, 0x3a, 0x07, 0x62, 0x89, 0xb3, 0xdf, 0xb7,
0x51, 0x0c, 0xdd, 0x86, 0x7c, 0xc7, 0xe9, 0xaa, 0x64, 0xf5, 0x42, 0xb6, 0x93, 0x95, 0xac, 0x8d, 0xa0, 0x28, 0x3c, 0x8a, 0xa1, 0xdb, 0x90, 0xef, 0x38, 0x5d, 0x95, 0xac, 0x5e, 0xc8, 0x76, 0xb2,
0x2d, 0xa7, 0xbb, 0x1e, 0x44, 0xb4, 0xdf, 0xac, 0x28, 0x25, 0xf9, 0x2d, 0xa7, 0x8b, 0xb9, 0xb8, 0x92, 0xb5, 0xb1, 0xe5, 0x74, 0xd7, 0x83, 0x88, 0xf6, 0x9b, 0x15, 0xa5, 0x24, 0xbf, 0xe5, 0x74,
0x05, 0x17, 0x4a, 0x1a, 0x8b, 0xe6, 0x20, 0x7f, 0x48, 0xfa, 0x32, 0x20, 0x61, 0xfe, 0x88, 0x9a, 0x31, 0x17, 0xb7, 0xe0, 0x42, 0x49, 0x63, 0xd1, 0x1c, 0xe4, 0x0f, 0x49, 0x5f, 0x06, 0x24, 0xcc,
0x50, 0x38, 0x72, 0xfc, 0x1e, 0x51, 0xfe, 0x74, 0x65, 0x12, 0xad, 0x58, 0xb2, 0xde, 0xc8, 0x5d, 0x1f, 0x51, 0x13, 0x0a, 0x47, 0x8e, 0xdf, 0x23, 0xca, 0x9f, 0xae, 0x4c, 0xa2, 0x15, 0x4b, 0xd6,
0xb7, 0xec, 0x6d, 0x80, 0x9b, 0x24, 0xde, 0xa1, 0x15, 0x38, 0xaf, 0xa3, 0x4d, 0x3a, 0x08, 0x7e, 0x1b, 0xb9, 0xeb, 0x96, 0xbd, 0x0d, 0x70, 0x93, 0xc4, 0x16, 0x5a, 0x81, 0xf3, 0x3a, 0xda, 0xa4,
0x5e, 0x99, 0x77, 0x1e, 0xa7, 0xd1, 0x78, 0x98, 0xde, 0xbe, 0x0f, 0x65, 0x11, 0x28, 0x79, 0xbe, 0x83, 0xe0, 0xe7, 0xd5, 0xf2, 0xce, 0xe3, 0x34, 0x1a, 0x0f, 0xd3, 0xdb, 0xf7, 0xa1, 0x2c, 0x02,
0x4b, 0x32, 0x80, 0xf5, 0x88, 0x0c, 0xa0, 0x13, 0x66, 0x6e, 0x5c, 0xc2, 0x34, 0xe2, 0x82, 0x0f, 0x25, 0xcf, 0x77, 0x49, 0x06, 0xb0, 0x1e, 0x91, 0x01, 0x74, 0xc2, 0xcc, 0x8d, 0x4b, 0x98, 0x46,
0x55, 0xc9, 0xab, 0x73, 0x78, 0x26, 0x0d, 0x57, 0xa0, 0xa4, 0xcd, 0x54, 0x5a, 0xe2, 0xda, 0x4d, 0x5c, 0xf0, 0xa1, 0x2a, 0x79, 0x75, 0x0e, 0xcf, 0xa4, 0xe1, 0x0a, 0x94, 0xf4, 0x32, 0x95, 0x96,
0x0b, 0xc2, 0x31, 0x85, 0xa1, 0xed, 0x00, 0x52, 0x41, 0x3f, 0x9b, 0x32, 0x23, 0xa1, 0xe5, 0x1e, 0xb8, 0x76, 0xd3, 0x82, 0x70, 0x4c, 0x61, 0x68, 0x3b, 0x80, 0x54, 0xd0, 0xcf, 0xa6, 0xcc, 0x48,
0x9d, 0xd0, 0x0c, 0x4d, 0x3f, 0x82, 0xda, 0xb8, 0x82, 0xef, 0x31, 0xd2, 0x52, 0x76, 0x53, 0xec, 0x68, 0xb9, 0x47, 0x27, 0x34, 0x43, 0xd3, 0x8f, 0xa0, 0x36, 0xae, 0xe0, 0x7b, 0x8c, 0xb4, 0x94,
0xb7, 0x2d, 0x98, 0x33, 0x25, 0x65, 0x3f, 0xbe, 0xec, 0x4a, 0xce, 0x2e, 0x8d, 0x8c, 0x1d, 0xf9, 0x7d, 0x29, 0xf6, 0xdb, 0x16, 0xcc, 0x99, 0x92, 0xb2, 0x1f, 0x5f, 0x76, 0x25, 0x67, 0x97, 0x46,
0xb5, 0x05, 0x17, 0x53, 0x4b, 0x9b, 0xe8, 0xc4, 0x27, 0x30, 0xca, 0x74, 0x8e, 0xfc, 0x04, 0xce, 0x86, 0x45, 0x7e, 0x6d, 0xc1, 0xc5, 0xd4, 0xd6, 0x26, 0x3a, 0xf1, 0x09, 0x16, 0x65, 0x3a, 0x47,
0xb1, 0x0c, 0x95, 0xcd, 0xc0, 0x8b, 0x3c, 0xc7, 0xf7, 0x7e, 0x40, 0xe8, 0xd9, 0xc5, 0xa4, 0xfd, 0x7e, 0x02, 0xe7, 0x58, 0x86, 0xca, 0x66, 0xe0, 0x45, 0x9e, 0xe3, 0x7b, 0x3f, 0x20, 0xf4, 0xec,
0x47, 0x0b, 0x66, 0x0d, 0x0e, 0x86, 0xee, 0xc3, 0x0c, 0x8f, 0xbb, 0x5e, 0xd0, 0x56, 0xb1, 0x23, 0x62, 0xd2, 0xfe, 0x83, 0x05, 0xb3, 0x06, 0x07, 0x43, 0xf7, 0x61, 0x86, 0xc7, 0x5d, 0x2f, 0x68,
0x63, 0xcd, 0x60, 0x08, 0x49, 0xd6, 0xb5, 0x23, 0x25, 0x61, 0x2d, 0x12, 0xed, 0x40, 0x91, 0x12, 0xab, 0xd8, 0x91, 0xb1, 0x66, 0x30, 0x84, 0x24, 0xfb, 0xda, 0x91, 0x92, 0xb0, 0x16, 0x89, 0x76,
0xd6, 0xf3, 0xa3, 0xc9, 0x42, 0xc4, 0x6e, 0xe4, 0x44, 0x3d, 0x26, 0x63, 0x33, 0x16, 0xfc, 0x58, 0xa0, 0x48, 0x09, 0xeb, 0xf9, 0xd1, 0x64, 0x21, 0x62, 0x37, 0x72, 0xa2, 0x1e, 0x93, 0xb1, 0x19,
0xc9, 0xb1, 0xff, 0x92, 0x83, 0xea, 0x2d, 0x67, 0x8f, 0xf8, 0xbb, 0xc4, 0x27, 0xad, 0x28, 0xa4, 0x0b, 0x7e, 0xac, 0xe4, 0xd8, 0x7f, 0xce, 0x41, 0xf5, 0x96, 0xb3, 0x47, 0xfc, 0x5d, 0xe2, 0x93,
0xe8, 0x87, 0x50, 0xe9, 0x38, 0x51, 0xeb, 0x40, 0x40, 0x75, 0xb9, 0xbe, 0x96, 0x4d, 0x51, 0x4a, 0x56, 0x14, 0x52, 0xf4, 0x43, 0xa8, 0x74, 0x9c, 0xa8, 0x75, 0x20, 0xa0, 0xba, 0x5c, 0x5f, 0xcb,
0x52, 0x63, 0x2b, 0x11, 0x23, 0x03, 0xe2, 0x05, 0xb5, 0xb0, 0x8a, 0x81, 0xc1, 0xa6, 0x36, 0xd1, 0xa6, 0x28, 0x25, 0xa9, 0xb1, 0x95, 0x88, 0x91, 0x01, 0xf1, 0x82, 0xda, 0x58, 0xc5, 0xc0, 0x60,
0x63, 0x89, 0xf7, 0xf5, 0x87, 0x5d, 0x5e, 0x4b, 0x4c, 0xde, 0xda, 0xa5, 0x4c, 0xc0, 0xe4, 0xcd, 0x53, 0x9b, 0xe8, 0xb1, 0xc4, 0xfb, 0xfa, 0xc3, 0x2e, 0xaf, 0x25, 0x26, 0x6f, 0xed, 0x52, 0x4b,
0x9e, 0x47, 0x49, 0x87, 0x04, 0x51, 0xd2, 0x63, 0x6d, 0x0d, 0xc9, 0xc7, 0x23, 0x1a, 0x17, 0x5e, 0xc0, 0xe4, 0xcd, 0x9e, 0x47, 0x49, 0x87, 0x04, 0x51, 0xd2, 0x63, 0x6d, 0x0d, 0xc9, 0xc7, 0x23,
0x81, 0xb9, 0x61, 0xe3, 0x4f, 0x89, 0xd7, 0x17, 0xcd, 0x78, 0x5d, 0x36, 0x23, 0xf0, 0x6f, 0x2d, 0x1a, 0x17, 0x5e, 0x81, 0xb9, 0xe1, 0xc5, 0x9f, 0x12, 0xaf, 0x2f, 0x9a, 0xf1, 0xba, 0x6c, 0x46,
0xa8, 0x8d, 0x33, 0x04, 0x7d, 0xd1, 0x10, 0x94, 0xe4, 0x88, 0xd7, 0x48, 0x5f, 0x4a, 0x5d, 0x87, 0xe0, 0xdf, 0x5a, 0x50, 0x1b, 0xb7, 0x10, 0xf4, 0x45, 0x43, 0x50, 0x92, 0x23, 0x5e, 0x23, 0x7d,
0x52, 0xd8, 0xe5, 0x5d, 0x71, 0x48, 0x95, 0x9f, 0x3f, 0xa3, 0x7d, 0x77, 0x5b, 0xc1, 0x4f, 0x06, 0x29, 0x75, 0x1d, 0x4a, 0x61, 0x97, 0x77, 0xc5, 0x21, 0x55, 0x7e, 0xfe, 0x8c, 0xf6, 0xdd, 0x6d,
0xf5, 0x4b, 0x29, 0xf1, 0x1a, 0x81, 0x63, 0x56, 0x9e, 0x98, 0x85, 0x3d, 0xbc, 0x58, 0x88, 0x13, 0x05, 0x3f, 0x19, 0xd4, 0x2f, 0xa5, 0xc4, 0x6b, 0x04, 0x8e, 0x59, 0x79, 0x62, 0x16, 0xeb, 0xe1,
0xf3, 0x5d, 0x01, 0xc1, 0x0a, 0x63, 0xff, 0xc1, 0x82, 0x69, 0x51, 0x25, 0xdf, 0x87, 0x12, 0xdf, 0xc5, 0x42, 0x9c, 0x98, 0xef, 0x0a, 0x08, 0x56, 0x18, 0xfb, 0xf7, 0x16, 0x4c, 0x8b, 0x2a, 0xf9,
0x3f, 0xd7, 0x89, 0x1c, 0x61, 0x57, 0xe6, 0xfe, 0x8c, 0x73, 0x6f, 0x91, 0xc8, 0x49, 0xee, 0x97, 0x3e, 0x94, 0xb8, 0xfd, 0x5c, 0x27, 0x72, 0xc4, 0xba, 0x32, 0xf7, 0x67, 0x9c, 0x7b, 0x8b, 0x44,
0x86, 0xe0, 0x58, 0x22, 0xc2, 0x50, 0xf0, 0x22, 0xd2, 0xd1, 0x07, 0xf9, 0xec, 0x58, 0xd1, 0x6a, 0x4e, 0x72, 0xbf, 0x34, 0x04, 0xc7, 0x12, 0x11, 0x86, 0x82, 0x17, 0x91, 0x8e, 0x3e, 0xc8, 0x67,
0x3a, 0xd0, 0xc0, 0xce, 0x83, 0xf5, 0x87, 0x11, 0x09, 0xf8, 0x61, 0x24, 0xc1, 0x60, 0x93, 0xcb, 0xc7, 0x8a, 0x56, 0xd3, 0x81, 0x06, 0x76, 0x1e, 0xac, 0x3f, 0x8c, 0x48, 0xc0, 0x0f, 0x23, 0x09,
0xc0, 0x52, 0x94, 0xfd, 0x3b, 0x0b, 0x62, 0x55, 0xfc, 0xba, 0x33, 0xe2, 0xef, 0xdf, 0xf2, 0x82, 0x06, 0x9b, 0x5c, 0x06, 0x96, 0xa2, 0xec, 0x7f, 0x5b, 0x10, 0xab, 0xe2, 0xd7, 0x9d, 0x11, 0x7f,
0x43, 0xb5, 0xad, 0xb1, 0x39, 0xbb, 0x0a, 0x8e, 0x63, 0x8a, 0xd3, 0x12, 0x62, 0x6e, 0xb2, 0x84, 0xff, 0x96, 0x17, 0x1c, 0x2a, 0xb3, 0xc6, 0xcb, 0xd9, 0x55, 0x70, 0x1c, 0x53, 0x9c, 0x96, 0x10,
0xc8, 0x15, 0xb6, 0xc2, 0x20, 0xf2, 0x82, 0xde, 0x48, 0x7c, 0x59, 0x55, 0x70, 0x1c, 0x53, 0xd8, 0x73, 0x93, 0x25, 0x44, 0xae, 0xb0, 0x15, 0x06, 0x91, 0x17, 0xf4, 0x46, 0xe2, 0xcb, 0xaa, 0x82,
0x7f, 0xce, 0x43, 0x85, 0xdb, 0xaa, 0x33, 0xf2, 0x4b, 0x50, 0xf5, 0xcd, 0xd3, 0x53, 0x36, 0x5f, 0xe3, 0x98, 0x82, 0xf7, 0x38, 0x94, 0x74, 0x1c, 0x2f, 0xf0, 0x82, 0x36, 0xdf, 0xc4, 0x6a, 0xd8,
0x52, 0x22, 0xd2, 0xf7, 0x11, 0xa7, 0x69, 0x39, 0xb3, 0x28, 0x73, 0x63, 0xe6, 0x5c, 0x9a, 0x79, 0x0b, 0x22, 0x51, 0x80, 0xe5, 0x93, 0x1e, 0x07, 0x8f, 0x50, 0xe0, 0x53, 0xb8, 0xec, 0x3f, 0xe5,
0xc3, 0x44, 0xe2, 0x34, 0x2d, 0x8f, 0xb3, 0x0f, 0xb8, 0x5f, 0xab, 0x02, 0x32, 0xde, 0xda, 0x6f, 0xa1, 0xc2, 0xf7, 0xad, 0xb3, 0xfb, 0x4b, 0x50, 0xf5, 0x4d, 0x4f, 0x50, 0xfb, 0xbf, 0xa4, 0xc4,
0x73, 0x20, 0x96, 0xb8, 0xd3, 0xf6, 0x67, 0x7a, 0xc2, 0xfd, 0xb9, 0x01, 0xe7, 0xf8, 0x41, 0x86, 0xa6, 0xef, 0x36, 0x4e, 0xd3, 0x72, 0x66, 0x51, 0x32, 0xc7, 0xcc, 0xb9, 0x34, 0xf3, 0x86, 0x89,
0xbd, 0x48, 0x57, 0xd9, 0x05, 0x51, 0xeb, 0xa1, 0xe3, 0x41, 0xfd, 0xdc, 0xed, 0x14, 0x06, 0x0f, 0xc4, 0x69, 0x5a, 0x1e, 0xb3, 0x1f, 0xf0, 0x3b, 0xa2, 0x8a, 0xd1, 0xf8, 0x98, 0xbe, 0xcd, 0x81,
0x51, 0x72, 0x1b, 0x7d, 0xaf, 0xe3, 0x45, 0xb5, 0x19, 0xc1, 0x12, 0xdb, 0x78, 0x8b, 0x03, 0xb1, 0x58, 0xe2, 0x4e, 0xb3, 0xf5, 0xf4, 0x84, 0xb6, 0xbe, 0x01, 0xe7, 0xb8, 0x53, 0x84, 0xbd, 0x48,
0xc4, 0xa5, 0x0e, 0xa0, 0x74, 0xd6, 0x01, 0xa0, 0x2d, 0xb8, 0xe0, 0xf8, 0x7e, 0xf8, 0x40, 0x2c, 0x57, 0xec, 0x05, 0x61, 0x39, 0x74, 0x3c, 0xa8, 0x9f, 0xbb, 0x9d, 0xc2, 0xe0, 0x21, 0x4a, 0xbe,
0xb3, 0x19, 0x86, 0x87, 0x1d, 0x87, 0x1e, 0x32, 0xd1, 0x9b, 0x96, 0x9a, 0x5f, 0x50, 0x8c, 0x17, 0x46, 0xdf, 0xeb, 0x78, 0x51, 0x6d, 0x46, 0xb0, 0xc4, 0x6b, 0xbc, 0xc5, 0x81, 0x58, 0xe2, 0x52,
0x56, 0x46, 0x49, 0xf0, 0x69, 0x7c, 0xf6, 0xbf, 0x72, 0x80, 0x64, 0x97, 0xe1, 0xca, 0xe2, 0x4b, 0x87, 0x59, 0x3a, 0xf3, 0x30, 0xb7, 0xe0, 0x82, 0xe3, 0xfb, 0xe1, 0x03, 0xb1, 0xcd, 0x66, 0x18,
0x06, 0x88, 0x67, 0x60, 0xa6, 0xa3, 0xba, 0x14, 0x2b, 0x9d, 0x9f, 0x74, 0x83, 0xa2, 0xf1, 0x68, 0x1e, 0x76, 0x1c, 0x7a, 0xc8, 0x44, 0x9f, 0x5b, 0x6a, 0x7e, 0x41, 0x31, 0x5e, 0x58, 0x19, 0x25,
0x0b, 0xca, 0xf2, 0xa2, 0x26, 0xce, 0xb7, 0xac, 0x88, 0xcb, 0xdb, 0x1a, 0x71, 0x32, 0xa8, 0x2f, 0xc1, 0xa7, 0xf1, 0xd9, 0xff, 0xcc, 0x01, 0x92, 0x1d, 0x8b, 0x2b, 0x0b, 0x39, 0x19, 0x6c, 0x9e,
0xa4, 0xd4, 0xc4, 0x98, 0xdb, 0xfd, 0x2e, 0xc1, 0x89, 0x04, 0x74, 0x0d, 0xc0, 0xe9, 0x7a, 0xe6, 0x81, 0x99, 0x8e, 0xea, 0x78, 0xac, 0x74, 0xae, 0xd3, 0xcd, 0x8e, 0xc6, 0xa3, 0x2d, 0x28, 0xcb,
0x48, 0xaa, 0x9c, 0x8c, 0x34, 0x92, 0xe6, 0x12, 0x1b, 0x54, 0xe8, 0x55, 0x98, 0xe6, 0x1b, 0xaf, 0x4b, 0x9f, 0x38, 0xf2, 0xb2, 0x22, 0x2e, 0x6f, 0x6b, 0xc4, 0xc9, 0xa0, 0xbe, 0x90, 0x52, 0x13,
0xe6, 0x15, 0x5f, 0xce, 0x76, 0xdd, 0xf9, 0xd1, 0x35, 0x4b, 0x3c, 0x07, 0xf2, 0x27, 0x2c, 0x24, 0x63, 0x6e, 0xf7, 0xbb, 0x04, 0x27, 0x12, 0xd0, 0x35, 0x00, 0xa7, 0xeb, 0x99, 0xe3, 0xad, 0x72,
0xa0, 0x7b, 0x50, 0x14, 0x5e, 0x26, 0x0f, 0x79, 0xc2, 0xba, 0x55, 0x34, 0x31, 0xaa, 0xe8, 0x3e, 0x32, 0x1e, 0x49, 0x1a, 0x55, 0x6c, 0x50, 0xa1, 0x57, 0x61, 0x9a, 0x1b, 0x5e, 0xcd, 0x3e, 0xbe,
0x89, 0x9f, 0xb0, 0x92, 0x68, 0xbf, 0x09, 0xe5, 0x2d, 0xaf, 0x45, 0x43, 0xae, 0x8e, 0x6f, 0x30, 0x9c, 0x2d, 0x74, 0xf0, 0xa3, 0x6b, 0x96, 0x78, 0x3e, 0xe5, 0x4f, 0x58, 0x48, 0x40, 0xf7, 0xa0,
0x4b, 0x35, 0x6d, 0xf1, 0x06, 0x6b, 0x5f, 0xd2, 0x78, 0xee, 0x44, 0x81, 0x13, 0x84, 0xb2, 0x35, 0x28, 0xbc, 0x4c, 0x1e, 0xf2, 0x84, 0x35, 0xb0, 0x68, 0x88, 0x54, 0x01, 0x7f, 0x12, 0x3f, 0x61,
0x2b, 0x24, 0x4e, 0xf4, 0x3a, 0x07, 0x62, 0x89, 0xbb, 0x71, 0x91, 0xe7, 0xfd, 0x9f, 0xbd, 0x57, 0x25, 0xd1, 0x7e, 0x13, 0xca, 0x5b, 0x5e, 0x8b, 0x86, 0x5c, 0x1d, 0x37, 0x30, 0x4b, 0x35, 0x80,
0x9f, 0x7a, 0xe7, 0xbd, 0xfa, 0xd4, 0xbb, 0xef, 0xa9, 0x1a, 0xe0, 0x1f, 0x15, 0x80, 0xed, 0xbd, 0xb1, 0x81, 0xb5, 0x2f, 0x69, 0x3c, 0x77, 0xa2, 0xc0, 0x09, 0x42, 0xd9, 0xe6, 0x15, 0x12, 0x27,
0xef, 0x93, 0x96, 0x8c, 0x2d, 0x67, 0x0f, 0x94, 0x78, 0x2d, 0xa7, 0xe6, 0x98, 0x62, 0xf8, 0x92, 0x7a, 0x9d, 0x03, 0xb1, 0xc4, 0xdd, 0xb8, 0xc8, 0x6b, 0x88, 0x9f, 0xbd, 0x57, 0x9f, 0x7a, 0xe7,
0x1b, 0xaa, 0xe5, 0x0c, 0x1c, 0x4e, 0x51, 0xa2, 0x65, 0x28, 0xc7, 0x43, 0x26, 0x75, 0x6c, 0xf3, 0xbd, 0xfa, 0xd4, 0xbb, 0xef, 0xa9, 0x7a, 0xe2, 0xef, 0x15, 0x80, 0xed, 0xbd, 0xef, 0x93, 0x96,
0xda, 0x0d, 0xe2, 0x49, 0x14, 0x4e, 0x68, 0x52, 0x81, 0x6e, 0xfa, 0xcc, 0x40, 0xd7, 0x84, 0x7c, 0x8c, 0x53, 0x67, 0x0f, 0xa7, 0x78, 0x5d, 0xa8, 0x66, 0xa2, 0x62, 0x90, 0x93, 0x1b, 0xaa, 0x0b,
0xcf, 0x73, 0xc5, 0xa9, 0x94, 0x9b, 0xcf, 0xe9, 0x44, 0x73, 0x67, 0x73, 0xed, 0x64, 0x50, 0x7f, 0x0d, 0x1c, 0x4e, 0x51, 0xa2, 0x65, 0x28, 0xc7, 0x03, 0x2b, 0x75, 0x6c, 0xf3, 0xda, 0x0d, 0xe2,
0x72, 0xdc, 0x84, 0x36, 0xea, 0x77, 0x09, 0x6b, 0xdc, 0xd9, 0x5c, 0xc3, 0x9c, 0xf9, 0xb4, 0x60, 0xa9, 0x16, 0x4e, 0x68, 0x52, 0x41, 0x73, 0xfa, 0xcc, 0xa0, 0xd9, 0x84, 0x7c, 0xcf, 0x73, 0xc5,
0x50, 0x9c, 0x30, 0x18, 0x5c, 0x03, 0x50, 0xab, 0xe6, 0xdc, 0xf2, 0x56, 0xc7, 0xde, 0x79, 0x33, 0xa9, 0x94, 0x9b, 0xcf, 0xe9, 0xa4, 0x75, 0x67, 0x73, 0xed, 0x64, 0x50, 0x7f, 0x72, 0xdc, 0xb4,
0xc6, 0x60, 0x83, 0x0a, 0x31, 0x98, 0x6f, 0x51, 0x22, 0x9d, 0xdd, 0xeb, 0x10, 0x16, 0x39, 0x1d, 0x37, 0xea, 0x77, 0x09, 0x6b, 0xdc, 0xd9, 0x5c, 0xc3, 0x9c, 0xf9, 0xb4, 0x60, 0x50, 0x9c, 0x30,
0x39, 0x72, 0x9a, 0xcc, 0x55, 0x9f, 0x50, 0x6a, 0xe6, 0x57, 0x87, 0x85, 0xe1, 0x51, 0xf9, 0x28, 0x18, 0x5c, 0x03, 0x50, 0xbb, 0xe6, 0xdc, 0xf2, 0x56, 0xc7, 0xde, 0x79, 0x33, 0xc6, 0x60, 0x83,
0x84, 0x79, 0x57, 0x75, 0xbd, 0x89, 0xd2, 0xf2, 0xc4, 0x4a, 0x2f, 0x71, 0x85, 0x6b, 0xc3, 0x82, 0x0a, 0x31, 0x98, 0x6f, 0x51, 0x22, 0x9d, 0xdd, 0xeb, 0x10, 0x16, 0x39, 0x1d, 0x39, 0xbe, 0x9a,
0xf0, 0xa8, 0x6c, 0xf4, 0x3d, 0x58, 0xd0, 0xc0, 0xd1, 0xd1, 0x83, 0x18, 0x82, 0xe5, 0x9b, 0x8b, 0xcc, 0x55, 0x9f, 0x50, 0x6a, 0xe6, 0x57, 0x87, 0x85, 0xe1, 0x51, 0xf9, 0x28, 0x84, 0x79, 0x57,
0xc7, 0x83, 0xfa, 0xc2, 0xda, 0x58, 0x2a, 0xfc, 0x08, 0x09, 0xc8, 0x85, 0xa2, 0x2f, 0xab, 0xb8, 0x75, 0xd0, 0x89, 0xd2, 0xf2, 0xc4, 0x4a, 0x2f, 0x71, 0x85, 0x6b, 0xc3, 0x82, 0xf0, 0xa8, 0x6c,
0x8a, 0xc8, 0xbc, 0x5f, 0xcf, 0xb6, 0x8a, 0xc4, 0xfb, 0x1b, 0x66, 0xf5, 0x16, 0xb7, 0xd6, 0xaa, 0xf4, 0x3d, 0x58, 0xd0, 0xc0, 0xd1, 0x31, 0x86, 0x18, 0xa8, 0xe5, 0x9b, 0x8b, 0xc7, 0x83, 0xfa,
0x70, 0x53, 0xb2, 0xd1, 0x43, 0xa8, 0x38, 0x41, 0x10, 0x46, 0x8e, 0x1c, 0x86, 0xcc, 0x0a, 0x55, 0xc2, 0xda, 0x58, 0x2a, 0xfc, 0x08, 0x09, 0xc8, 0x85, 0xa2, 0x2f, 0x2b, 0xc2, 0x8a, 0xc8, 0xe2,
0x2b, 0x13, 0xab, 0x5a, 0x49, 0x64, 0x0c, 0x55, 0x8b, 0x06, 0x06, 0x9b, 0xaa, 0xd0, 0x03, 0x38, 0x5f, 0xcf, 0xb6, 0x8b, 0xc4, 0xfb, 0x1b, 0x66, 0x25, 0x18, 0xb7, 0xe9, 0xaa, 0x08, 0x54, 0xb2,
0x1f, 0x3e, 0x08, 0x08, 0xc5, 0x64, 0x9f, 0x50, 0x12, 0xb4, 0x08, 0xab, 0x55, 0x85, 0xf6, 0xaf, 0xd1, 0x43, 0xa8, 0x38, 0x41, 0x10, 0x46, 0x8e, 0x1c, 0xac, 0xcc, 0x0a, 0x55, 0x2b, 0x13, 0xab,
0x66, 0xd4, 0x9e, 0x62, 0x4e, 0x5c, 0x3a, 0x0d, 0x67, 0x78, 0x58, 0x0b, 0x6a, 0x00, 0xec, 0x7b, 0x5a, 0x49, 0x64, 0x0c, 0x55, 0x9e, 0x06, 0x06, 0x9b, 0xaa, 0xd0, 0x03, 0x38, 0x1f, 0x3e, 0x08,
0x81, 0xaa, 0xf9, 0x6b, 0xe7, 0x92, 0xa9, 0xe9, 0x46, 0x0c, 0xc5, 0x06, 0x05, 0x7a, 0x01, 0x2a, 0x08, 0xc5, 0x64, 0x9f, 0x50, 0x12, 0xb4, 0x08, 0xab, 0x55, 0x85, 0xf6, 0xaf, 0x66, 0xd4, 0x9e,
0x2d, 0xbf, 0xc7, 0x22, 0x22, 0xc7, 0xb3, 0xe7, 0xc5, 0x0d, 0x8a, 0xd7, 0xb7, 0x9a, 0xa0, 0xb0, 0x62, 0x4e, 0x5c, 0x3a, 0x0d, 0x67, 0x78, 0x58, 0x0b, 0x6a, 0x00, 0xec, 0x7b, 0x81, 0xea, 0x1f,
0x49, 0x87, 0x0e, 0x60, 0xd6, 0x33, 0x9a, 0x8b, 0xda, 0x9c, 0xf0, 0xc5, 0x6b, 0x13, 0x77, 0x14, 0x6a, 0xe7, 0x92, 0x09, 0xec, 0x46, 0x0c, 0xc5, 0x06, 0x05, 0x7a, 0x01, 0x2a, 0x2d, 0xbf, 0xc7,
0xac, 0x39, 0xc7, 0x23, 0x91, 0x09, 0xc1, 0x29, 0xc9, 0xa8, 0x07, 0xd5, 0x8e, 0x99, 0x6a, 0x6a, 0x22, 0x22, 0x47, 0xbd, 0xe7, 0xc5, 0x0d, 0x8a, 0xf7, 0xb7, 0x9a, 0xa0, 0xb0, 0x49, 0x87, 0x0e,
0xf3, 0x62, 0x1f, 0xaf, 0x67, 0x53, 0x35, 0x9a, 0x0c, 0x93, 0x7a, 0x24, 0x85, 0xc3, 0x69, 0x2d, 0x60, 0xd6, 0x33, 0x1a, 0x95, 0xda, 0x9c, 0xf0, 0xc5, 0x6b, 0x13, 0x77, 0x27, 0xac, 0x39, 0xc7,
0x0b, 0x5f, 0x83, 0xca, 0x7f, 0x59, 0x62, 0xf3, 0x12, 0x7d, 0xd8, 0x63, 0x26, 0x2a, 0xd1, 0xdf, 0x23, 0x91, 0x09, 0xc1, 0x29, 0xc9, 0xa8, 0x07, 0xd5, 0x8e, 0x99, 0x6a, 0x6a, 0xf3, 0xc2, 0x8e,
0xcf, 0xc1, 0xb9, 0xf4, 0x39, 0xc7, 0xad, 0xac, 0x35, 0x76, 0xca, 0xaf, 0x93, 0x41, 0x7e, 0x6c, 0xd7, 0xb3, 0xa9, 0x1a, 0x4d, 0x86, 0x49, 0x3d, 0x92, 0xc2, 0xe1, 0xb4, 0x96, 0x85, 0xaf, 0x41,
0x32, 0x50, 0x31, 0x77, 0xfa, 0x71, 0x62, 0x6e, 0x3a, 0x9d, 0x17, 0x32, 0xa5, 0xf3, 0x06, 0x00, 0xe5, 0xbf, 0x2c, 0xd7, 0x79, 0xb9, 0x3f, 0xec, 0x31, 0x13, 0x95, 0xfb, 0xef, 0xe7, 0xe0, 0x5c,
0x2f, 0x77, 0x68, 0xe8, 0xfb, 0x84, 0x8a, 0x10, 0x5d, 0x52, 0x73, 0xfc, 0x18, 0x8a, 0x0d, 0x0a, 0xfa, 0x9c, 0xe3, 0xb6, 0xd8, 0x1a, 0xfb, 0xc5, 0x40, 0x27, 0x83, 0xfc, 0xd8, 0x64, 0xa0, 0x62,
0xb4, 0x01, 0x68, 0xcf, 0x0f, 0x5b, 0x87, 0x62, 0x0b, 0x74, 0x78, 0x11, 0xc1, 0xb9, 0x24, 0x67, 0xee, 0xf4, 0xe3, 0xc4, 0xdc, 0x74, 0x3a, 0x2f, 0x64, 0x4a, 0xe7, 0x0d, 0x00, 0x5e, 0xee, 0xd0,
0xa1, 0xcd, 0x11, 0x2c, 0x3e, 0x85, 0xc3, 0xee, 0xc3, 0xa5, 0x1d, 0x87, 0x72, 0x47, 0x4a, 0xae, 0xd0, 0xf7, 0x09, 0x15, 0x21, 0xba, 0xa4, 0xbe, 0x09, 0xc4, 0x50, 0x6c, 0x50, 0xa0, 0x0d, 0x40,
0xb2, 0x28, 0xfa, 0xdf, 0x18, 0x69, 0x29, 0x9e, 0x9b, 0x34, 0x24, 0x24, 0x8b, 0x4e, 0x60, 0x49, 0x7b, 0x7e, 0xd8, 0x3a, 0x14, 0x26, 0xd0, 0xe1, 0x45, 0x04, 0xe7, 0x92, 0x9c, 0xab, 0x36, 0x47,
0x5b, 0x61, 0xff, 0xd5, 0x82, 0x27, 0x4e, 0xd5, 0xfd, 0x19, 0xb4, 0x34, 0xf7, 0xd3, 0x2d, 0xcd, 0xb0, 0xf8, 0x14, 0x0e, 0xbb, 0x0f, 0x97, 0x76, 0x1c, 0xca, 0x1d, 0x29, 0xb9, 0xca, 0xa2, 0x81,
0x4b, 0x19, 0x47, 0xbf, 0xa7, 0x59, 0x2b, 0x3f, 0xff, 0xa4, 0x9a, 0x9b, 0x19, 0x28, 0xec, 0xf0, 0x78, 0x63, 0xa4, 0x3d, 0x79, 0x6e, 0xd2, 0x90, 0x90, 0x6c, 0x3a, 0x81, 0x25, 0x2d, 0x8a, 0xfd,
0x92, 0xd3, 0xfe, 0xa5, 0x05, 0xb3, 0xe2, 0x69, 0x92, 0x91, 0x79, 0x1d, 0x0a, 0xfb, 0xa1, 0x1e, 0x17, 0x0b, 0x9e, 0x38, 0x55, 0xf7, 0x67, 0xd0, 0x1e, 0xdd, 0x4f, 0xb7, 0x47, 0x2f, 0x65, 0x1c,
0x8b, 0x95, 0xa4, 0xf8, 0x0d, 0x0e, 0xc0, 0x12, 0xfe, 0x18, 0x33, 0xf5, 0xb7, 0x2d, 0x48, 0x0f, 0x23, 0x9f, 0xb6, 0x5a, 0xf9, 0x29, 0x29, 0xd5, 0x28, 0xcd, 0x40, 0x61, 0x87, 0x97, 0x9c, 0xf6,
0xab, 0xd1, 0x2b, 0xd2, 0xdf, 0xad, 0x78, 0x9a, 0x3c, 0xa1, 0xaf, 0xbf, 0x3c, 0xae, 0x19, 0xbb, 0x2f, 0x2d, 0x98, 0x15, 0x4f, 0x93, 0x8c, 0xdf, 0xeb, 0x50, 0xd8, 0x0f, 0xf5, 0x88, 0xad, 0x24,
0x90, 0x69, 0x32, 0x79, 0x05, 0xca, 0x38, 0x0c, 0xa3, 0x1d, 0x27, 0x3a, 0x60, 0x7c, 0xe1, 0x5d, 0xc5, 0x6f, 0x70, 0x00, 0x96, 0xf0, 0xc7, 0x98, 0xcf, 0xbf, 0x6d, 0x41, 0x7a, 0xf0, 0x8d, 0x5e,
0xfe, 0xa0, 0xf6, 0x46, 0x2c, 0x5c, 0x60, 0xb0, 0x84, 0xdb, 0xbf, 0xb0, 0xe0, 0x89, 0xb1, 0x9f, 0x91, 0xfe, 0x6e, 0xc5, 0x93, 0xe9, 0x09, 0x7d, 0xfd, 0xe5, 0x71, 0x8d, 0xdd, 0x85, 0x4c, 0x53,
0x31, 0xf8, 0xb5, 0x6b, 0xc5, 0x6f, 0x6a, 0x45, 0xb1, 0x07, 0x26, 0x74, 0xd8, 0xa0, 0xe2, 0xdd, 0xce, 0x2b, 0x50, 0xc6, 0x61, 0x18, 0xed, 0x38, 0xd1, 0x01, 0xe3, 0x1b, 0xef, 0xf2, 0x07, 0x65,
0x58, 0xea, 0xdb, 0xc7, 0x70, 0x37, 0x96, 0xd2, 0x86, 0xd3, 0xb4, 0xf6, 0xbf, 0x73, 0x50, 0x94, 0x1b, 0xb1, 0x71, 0x81, 0xc1, 0x12, 0x6e, 0xff, 0xc2, 0x82, 0x27, 0xc6, 0x7e, 0x12, 0xe1, 0xd7,
0xa3, 0x99, 0xff, 0xb1, 0xb7, 0x3e, 0x0d, 0x45, 0x26, 0xf4, 0x28, 0xf3, 0xe2, 0x4c, 0x2e, 0xb5, 0xae, 0x15, 0xbf, 0xa9, 0x1d, 0xc5, 0x1e, 0x98, 0xd0, 0x61, 0x83, 0x8a, 0x77, 0x63, 0xa9, 0xef,
0x63, 0x85, 0x15, 0x1d, 0x0c, 0x61, 0xcc, 0x69, 0xeb, 0x08, 0x97, 0x74, 0x30, 0x12, 0x8c, 0x35, 0x28, 0xc3, 0xdd, 0x58, 0x4a, 0x1b, 0x4e, 0xd3, 0xda, 0xff, 0xca, 0x41, 0x51, 0x8e, 0x79, 0xfe,
0x1e, 0xbd, 0x08, 0x45, 0x4a, 0x1c, 0x16, 0xf7, 0x86, 0x8b, 0x5a, 0x24, 0x16, 0xd0, 0x93, 0x41, 0xc7, 0xde, 0xfa, 0x34, 0x14, 0x99, 0xd0, 0xa3, 0x96, 0x17, 0x67, 0x72, 0xa9, 0x1d, 0x2b, 0xac,
0x7d, 0x56, 0x09, 0x17, 0xef, 0x58, 0x51, 0xa3, 0x7b, 0x30, 0xe3, 0x92, 0xc8, 0xf1, 0x7c, 0xdd, 0xe8, 0x60, 0x08, 0x63, 0x4e, 0x5b, 0x47, 0xb8, 0xa4, 0x83, 0x91, 0x60, 0xac, 0xf1, 0xe8, 0x45,
0x2d, 0x3c, 0x3f, 0xc9, 0x08, 0x6b, 0x4d, 0xb2, 0x36, 0x2b, 0xdc, 0x26, 0xf5, 0x82, 0xb5, 0x40, 0x28, 0x52, 0xe2, 0xb0, 0xb8, 0x37, 0x5c, 0xd4, 0x22, 0xb1, 0x80, 0x9e, 0x0c, 0xea, 0xb3, 0x4a,
0x1e, 0x9d, 0x5b, 0xa1, 0x2b, 0xbf, 0x7e, 0x16, 0x92, 0xe8, 0xbc, 0x1a, 0xba, 0x04, 0x0b, 0x8c, 0xb8, 0x78, 0xc7, 0x8a, 0x1a, 0xdd, 0x83, 0x19, 0x97, 0x44, 0x8e, 0xe7, 0xeb, 0x6e, 0xe1, 0xf9,
0xfd, 0x8e, 0x05, 0x15, 0x29, 0x69, 0xd5, 0xe9, 0x31, 0x82, 0xae, 0xc6, 0xab, 0x90, 0xc7, 0xad, 0x49, 0xc6, 0x61, 0x6b, 0x92, 0xb5, 0x59, 0xe1, 0x6b, 0x52, 0x2f, 0x58, 0x0b, 0xe4, 0xd1, 0xb9,
0xeb, 0xc5, 0x69, 0xde, 0x61, 0x9d, 0x0c, 0xea, 0x65, 0x41, 0x26, 0xda, 0x2d, 0xbd, 0x00, 0x63, 0x15, 0xba, 0xf2, 0x4b, 0x6a, 0x21, 0x89, 0xce, 0xab, 0xa1, 0x4b, 0xb0, 0xc0, 0xd8, 0xef, 0x58,
0x8f, 0x72, 0x67, 0xec, 0xd1, 0x53, 0x50, 0x10, 0xb7, 0x47, 0x6d, 0x66, 0xdc, 0x84, 0x88, 0x0b, 0x50, 0x91, 0x92, 0x56, 0x9d, 0x1e, 0x23, 0xe8, 0x6a, 0xbc, 0x0b, 0x79, 0xdc, 0xba, 0x5e, 0x9c,
0x86, 0x25, 0xce, 0xfe, 0x38, 0x07, 0xd5, 0xd4, 0xe2, 0x32, 0x74, 0x1c, 0xf1, 0xb8, 0x34, 0x97, 0xe6, 0x1d, 0xd6, 0xc9, 0xa0, 0x5e, 0x16, 0x64, 0xa2, 0xdd, 0xd2, 0x1b, 0x30, 0x6c, 0x94, 0x3b,
0x61, 0x04, 0x3f, 0xfe, 0x9b, 0xf5, 0x77, 0xa0, 0xd8, 0xe2, 0xeb, 0xd3, 0x7f, 0x1a, 0xb8, 0x3a, 0xc3, 0x46, 0x4f, 0x41, 0x41, 0xdc, 0x1e, 0x65, 0xcc, 0xb8, 0x09, 0x11, 0x17, 0x0c, 0x4b, 0x9c,
0xc9, 0x51, 0x88, 0x9d, 0x49, 0x3c, 0x49, 0xbc, 0x32, 0xac, 0x04, 0xa2, 0x9b, 0x30, 0x4f, 0x49, 0xfd, 0x71, 0x0e, 0xaa, 0xa9, 0xcd, 0x65, 0xe8, 0x38, 0xe2, 0xd1, 0x6b, 0x2e, 0xc3, 0x38, 0x7f,
0x44, 0xfb, 0x2b, 0xfb, 0x11, 0xa1, 0xe6, 0x0c, 0xa0, 0x90, 0xd4, 0xe4, 0x78, 0x98, 0x00, 0x8f, 0xfc, 0xf7, 0xef, 0xef, 0x40, 0xb1, 0xc5, 0xf7, 0xa7, 0xff, 0x80, 0x70, 0x75, 0x92, 0xa3, 0x10,
0xf2, 0xe8, 0x7c, 0x5a, 0x7c, 0x8c, 0x7c, 0x6a, 0xef, 0xc1, 0xec, 0x6d, 0x67, 0xcf, 0x8f, 0xbf, 0x96, 0x49, 0x3c, 0x49, 0xbc, 0x32, 0xac, 0x04, 0xa2, 0x9b, 0x30, 0x4f, 0x49, 0x44, 0xfb, 0x2b,
0x03, 0x62, 0xa8, 0x7a, 0x41, 0xcb, 0xef, 0xb9, 0x44, 0x46, 0x62, 0x1d, 0xbd, 0xf4, 0xa5, 0xdd, 0xfb, 0x11, 0xa1, 0xe6, 0x0c, 0xa0, 0x90, 0xd4, 0xe4, 0x78, 0x98, 0x00, 0x8f, 0xf2, 0xe8, 0x7c,
0x34, 0x91, 0x27, 0x83, 0xfa, 0x85, 0x14, 0x40, 0x7e, 0xf8, 0xc2, 0x69, 0x11, 0xb6, 0x0f, 0xd3, 0x5a, 0x7c, 0x8c, 0x7c, 0x6a, 0xef, 0xc1, 0xec, 0x6d, 0x67, 0xcf, 0x8f, 0xbf, 0x29, 0x62, 0xa8,
0x9f, 0x61, 0x8f, 0xfa, 0x5d, 0x28, 0x27, 0x5d, 0xc4, 0xa7, 0xac, 0xd2, 0x7e, 0x03, 0x4a, 0xdc, 0x7a, 0x41, 0xcb, 0xef, 0xb9, 0x44, 0x46, 0x62, 0x1d, 0xbd, 0xf4, 0xa5, 0xdd, 0x34, 0x91, 0x27,
0xe3, 0x75, 0xf7, 0x7b, 0x46, 0x49, 0x94, 0x2e, 0x56, 0x72, 0x59, 0x8a, 0x15, 0xbb, 0x03, 0xd5, 0x83, 0xfa, 0x85, 0x14, 0x40, 0x7e, 0x44, 0xc3, 0x69, 0x11, 0xb6, 0x0f, 0xd3, 0x9f, 0x61, 0x8f,
0x3b, 0x5d, 0xf7, 0x31, 0xbf, 0x04, 0xe7, 0x32, 0x67, 0xad, 0x6b, 0x20, 0xff, 0x5d, 0xc1, 0x13, 0xfa, 0x5d, 0x28, 0x27, 0x5d, 0xc4, 0xa7, 0xac, 0xd2, 0x7e, 0x03, 0x4a, 0xdc, 0xe3, 0x75, 0xf7,
0x84, 0xcc, 0xda, 0x46, 0x82, 0x30, 0x13, 0xaf, 0xf1, 0x25, 0xe0, 0x27, 0x16, 0x80, 0x18, 0xfb, 0x7b, 0x46, 0x49, 0x94, 0x2e, 0x56, 0x72, 0x59, 0x8a, 0x15, 0xbb, 0x03, 0xd5, 0x3b, 0x5d, 0xf7,
0xac, 0x1f, 0x91, 0x20, 0xe2, 0xfb, 0xc0, 0x9d, 0x6a, 0x78, 0x1f, 0x44, 0x64, 0x10, 0x18, 0x74, 0x31, 0xbf, 0x2a, 0xe7, 0x32, 0x67, 0xad, 0x6b, 0x20, 0xff, 0xa9, 0xc1, 0x13, 0x84, 0xcc, 0xda,
0x07, 0x8a, 0xa1, 0xf4, 0x26, 0x39, 0x9a, 0x9f, 0x70, 0xca, 0x19, 0x5f, 0x24, 0xe9, 0x4f, 0x58, 0x46, 0x82, 0x30, 0x13, 0xaf, 0xf1, 0x55, 0xe1, 0x27, 0x16, 0x80, 0x18, 0xfb, 0xac, 0x1f, 0x91,
0x09, 0x6b, 0x5e, 0xfe, 0xe0, 0x93, 0xc5, 0xa9, 0x0f, 0x3f, 0x59, 0x9c, 0xfa, 0xe8, 0x93, 0xc5, 0x20, 0xe2, 0x76, 0xe0, 0x4e, 0x35, 0x6c, 0x07, 0x11, 0x19, 0x04, 0x06, 0xdd, 0x81, 0x62, 0x28,
0xa9, 0xb7, 0x8e, 0x17, 0xad, 0x0f, 0x8e, 0x17, 0xad, 0x0f, 0x8f, 0x17, 0xad, 0x8f, 0x8e, 0x17, 0xbd, 0x49, 0x8e, 0xf9, 0x27, 0x9c, 0x98, 0xc6, 0x17, 0x49, 0xfa, 0x13, 0x56, 0xc2, 0x9a, 0x97,
0xad, 0x8f, 0x8f, 0x17, 0xad, 0x77, 0xfe, 0xbe, 0x38, 0x75, 0x2f, 0x77, 0x74, 0xf5, 0x3f, 0x01, 0x3f, 0xf8, 0x64, 0x71, 0xea, 0xc3, 0x4f, 0x16, 0xa7, 0x3e, 0xfa, 0x64, 0x71, 0xea, 0xad, 0xe3,
0x00, 0x00, 0xff, 0xff, 0xbe, 0xb0, 0xbe, 0x20, 0x49, 0x26, 0x00, 0x00, 0x45, 0xeb, 0x83, 0xe3, 0x45, 0xeb, 0xc3, 0xe3, 0x45, 0xeb, 0xa3, 0xe3, 0x45, 0xeb, 0xe3, 0xe3,
0x45, 0xeb, 0x9d, 0xbf, 0x2d, 0x4e, 0xdd, 0xcb, 0x1d, 0x5d, 0xfd, 0x4f, 0x00, 0x00, 0x00, 0xff,
0xff, 0x83, 0xb7, 0x3e, 0x8b, 0x95, 0x26, 0x00, 0x00,
} }

View File

@ -395,6 +395,14 @@ message ListMeta {
// identical to the value in the first response, unless you have received this token from an error // identical to the value in the first response, unless you have received this token from an error
// message. // message.
optional string continue = 3; optional string continue = 3;
// RemainingItemCount is the number of subsequent items in the list which are not included in this
// list response. If the list request contained label or field selectors, then the number of
// remaining items is unknown and this field will be unset. If the list is complete (either
// because it is unpaginated or because this is the last page), then there are no more remaining
// items and this field will also be unset. Servers older than v1.15 do not set this field.
// +optional
optional int64 remainingItemCount = 4;
} }
// ListOptions is the query options to a standard REST list call. // ListOptions is the query options to a standard REST list call.

View File

@ -94,6 +94,8 @@ type ListInterface interface {
SetSelfLink(selfLink string) SetSelfLink(selfLink string)
GetContinue() string GetContinue() string
SetContinue(c string) SetContinue(c string)
GetRemainingItemCount() int64
SetRemainingItemCount(c int64)
} }
// Type exposes the type and APIVersion of versioned or internal API objects. // Type exposes the type and APIVersion of versioned or internal API objects.
@ -111,6 +113,8 @@ func (meta *ListMeta) GetSelfLink() string { return meta.SelfLink
func (meta *ListMeta) SetSelfLink(selfLink string) { meta.SelfLink = selfLink } func (meta *ListMeta) SetSelfLink(selfLink string) { meta.SelfLink = selfLink }
func (meta *ListMeta) GetContinue() string { return meta.Continue } func (meta *ListMeta) GetContinue() string { return meta.Continue }
func (meta *ListMeta) SetContinue(c string) { meta.Continue = c } func (meta *ListMeta) SetContinue(c string) { meta.Continue = c }
func (meta *ListMeta) GetRemainingItemCount() int64 { return meta.RemainingItemCount }
func (meta *ListMeta) SetRemainingItemCount(c int64) { meta.RemainingItemCount = c }
func (obj *TypeMeta) GetObjectKind() schema.ObjectKind { return obj } func (obj *TypeMeta) GetObjectKind() schema.ObjectKind { return obj }

View File

@ -81,6 +81,14 @@ type ListMeta struct {
// identical to the value in the first response, unless you have received this token from an error // identical to the value in the first response, unless you have received this token from an error
// message. // message.
Continue string `json:"continue,omitempty" protobuf:"bytes,3,opt,name=continue"` Continue string `json:"continue,omitempty" protobuf:"bytes,3,opt,name=continue"`
// RemainingItemCount is the number of subsequent items in the list which are not included in this
// list response. If the list request contained label or field selectors, then the number of
// remaining items is unknown and this field will be unset. If the list is complete (either
// because it is unpaginated or because this is the last page), then there are no more remaining
// items and this field will also be unset. Servers older than v1.15 do not set this field.
// +optional
RemainingItemCount int64 `json:"remainingItemCount,omitempty" protobuf:"bytes,4,opt,name=remainingItemCount"`
} }
// These are internal finalizer values for Kubernetes-like APIs, must be qualified name unless defined here // These are internal finalizer values for Kubernetes-like APIs, must be qualified name unless defined here

View File

@ -197,10 +197,11 @@ func (List) SwaggerDoc() map[string]string {
} }
var map_ListMeta = map[string]string{ var map_ListMeta = map[string]string{
"": "ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.", "": "ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.",
"selfLink": "selfLink is a URL representing this object. Populated by the system. Read-only.", "selfLink": "selfLink is a URL representing this object. Populated by the system. Read-only.",
"resourceVersion": "String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency", "resourceVersion": "String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency",
"continue": "continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a consistent list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response, unless you have received this token from an error message.", "continue": "continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a consistent list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response, unless you have received this token from an error message.",
"remainingItemCount": "RemainingItemCount is the number of subsequent items in the list which are not included in this list response. If the list request contained label or field selectors, then the number of remaining items is unknown and this field will be unset. If the list is complete (either because it is unpaginated or because this is the last page), then there are no more remaining items and this field will also be unset. Servers older than v1.15 do not set this field.",
} }
func (ListMeta) SwaggerDoc() map[string]string { func (ListMeta) SwaggerDoc() map[string]string {

View File

@ -275,6 +275,14 @@ func getNestedString(obj map[string]interface{}, fields ...string) string {
return val return val
} }
func getNestedInt64(obj map[string]interface{}, fields ...string) int64 {
val, found, err := NestedInt64(obj, fields...)
if !found || err != nil {
return 0
}
return val
}
func jsonPath(fields []string) string { func jsonPath(fields []string) string {
return "." + strings.Join(fields, ".") return "." + strings.Join(fields, ".")
} }

View File

@ -166,6 +166,14 @@ func (u *UnstructuredList) SetContinue(c string) {
u.setNestedField(c, "metadata", "continue") u.setNestedField(c, "metadata", "continue")
} }
func (u *UnstructuredList) GetRemainingItemCount() int64 {
return getNestedInt64(u.Object, "metadata", "remainingItemCount")
}
func (u *UnstructuredList) SetRemainingItemCount(c int64) {
u.setNestedField(c, "metadata", "remainingItemCount")
}
func (u *UnstructuredList) SetGroupVersionKind(gvk schema.GroupVersionKind) { func (u *UnstructuredList) SetGroupVersionKind(gvk schema.GroupVersionKind) {
u.SetAPIVersion(gvk.GroupVersion().String()) u.SetAPIVersion(gvk.GroupVersion().String())
u.SetKind(gvk.Kind) u.SetKind(gvk.Kind)

View File

@ -193,28 +193,31 @@ func TestGenericTypeMeta(t *testing.T) {
} }
type InternalTypeMeta struct { type InternalTypeMeta struct {
Kind string `json:"kind,omitempty"` Kind string `json:"kind,omitempty"`
Namespace string `json:"namespace,omitempty"` Namespace string `json:"namespace,omitempty"`
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
GenerateName string `json:"generateName,omitempty"` GenerateName string `json:"generateName,omitempty"`
UID string `json:"uid,omitempty"` UID string `json:"uid,omitempty"`
CreationTimestamp metav1.Time `json:"creationTimestamp,omitempty"` CreationTimestamp metav1.Time `json:"creationTimestamp,omitempty"`
SelfLink string `json:"selfLink,omitempty"` SelfLink string `json:"selfLink,omitempty"`
ResourceVersion string `json:"resourceVersion,omitempty"` ResourceVersion string `json:"resourceVersion,omitempty"`
Continue string `json:"next,omitempty"` Continue string `json:"next,omitempty"`
APIVersion string `json:"apiVersion,omitempty"` RemainingItemCount int64 `json:"remainingItemCount,omitempty"`
Labels map[string]string `json:"labels,omitempty"` APIVersion string `json:"apiVersion,omitempty"`
Annotations map[string]string `json:"annotations,omitempty"` Labels map[string]string `json:"labels,omitempty"`
Finalizers []string `json:"finalizers,omitempty"` Annotations map[string]string `json:"annotations,omitempty"`
OwnerReferences []metav1.OwnerReference `json:"ownerReferences,omitempty"` Finalizers []string `json:"finalizers,omitempty"`
OwnerReferences []metav1.OwnerReference `json:"ownerReferences,omitempty"`
} }
func (m *InternalTypeMeta) GetResourceVersion() string { return m.ResourceVersion } func (m *InternalTypeMeta) GetResourceVersion() string { return m.ResourceVersion }
func (m *InternalTypeMeta) SetResourceVersion(rv string) { m.ResourceVersion = rv } func (m *InternalTypeMeta) SetResourceVersion(rv string) { m.ResourceVersion = rv }
func (m *InternalTypeMeta) GetSelfLink() string { return m.SelfLink } func (m *InternalTypeMeta) GetSelfLink() string { return m.SelfLink }
func (m *InternalTypeMeta) SetSelfLink(link string) { m.SelfLink = link } func (m *InternalTypeMeta) SetSelfLink(link string) { m.SelfLink = link }
func (m *InternalTypeMeta) GetContinue() string { return m.Continue } func (m *InternalTypeMeta) GetContinue() string { return m.Continue }
func (m *InternalTypeMeta) SetContinue(c string) { m.Continue = c } func (m *InternalTypeMeta) SetContinue(c string) { m.Continue = c }
func (m *InternalTypeMeta) GetRemainingItemCount() int64 { return m.RemainingItemCount }
func (m *InternalTypeMeta) SetRemainingItemCount(c int64) { m.RemainingItemCount = c }
type MyAPIObject struct { type MyAPIObject struct {
TypeMeta InternalTypeMeta `json:",inline"` TypeMeta InternalTypeMeta `json:",inline"`

View File

@ -604,7 +604,7 @@ func (c *Cacher) GetToList(ctx context.Context, key string, resourceVersion stri
} }
} }
if c.versioner != nil { if c.versioner != nil {
if err := c.versioner.UpdateList(listObj, readResourceVersion, ""); err != nil { if err := c.versioner.UpdateList(listObj, readResourceVersion, "", 0); err != nil {
return err return err
} }
} }
@ -679,7 +679,7 @@ func (c *Cacher) List(ctx context.Context, key string, resourceVersion string, p
} }
trace.Step(fmt.Sprintf("Filtered %d items", listVal.Len())) trace.Step(fmt.Sprintf("Filtered %d items", listVal.Len()))
if c.versioner != nil { if c.versioner != nil {
if err := c.versioner.UpdateList(listObj, readResourceVersion, ""); err != nil { if err := c.versioner.UpdateList(listObj, readResourceVersion, "", 0); err != nil {
return err return err
} }
} }

View File

@ -217,13 +217,14 @@ type testVersioner struct{}
func (testVersioner) UpdateObject(obj runtime.Object, resourceVersion uint64) error { func (testVersioner) UpdateObject(obj runtime.Object, resourceVersion uint64) error {
return meta.NewAccessor().SetResourceVersion(obj, strconv.FormatUint(resourceVersion, 10)) return meta.NewAccessor().SetResourceVersion(obj, strconv.FormatUint(resourceVersion, 10))
} }
func (testVersioner) UpdateList(obj runtime.Object, resourceVersion uint64, continueValue string) error { func (testVersioner) UpdateList(obj runtime.Object, resourceVersion uint64, continueValue string, count int64) error {
listAccessor, err := meta.ListAccessor(obj) listAccessor, err := meta.ListAccessor(obj)
if err != nil || listAccessor == nil { if err != nil || listAccessor == nil {
return err return err
} }
listAccessor.SetResourceVersion(strconv.FormatUint(resourceVersion, 10)) listAccessor.SetResourceVersion(strconv.FormatUint(resourceVersion, 10))
listAccessor.SetContinue(continueValue) listAccessor.SetContinue(continueValue)
listAccessor.SetRemainingItemCount(count)
return nil return nil
} }
func (testVersioner) PrepareObjectForStorage(obj runtime.Object) error { func (testVersioner) PrepareObjectForStorage(obj runtime.Object) error {

View File

@ -44,7 +44,7 @@ func (a APIObjectVersioner) UpdateObject(obj runtime.Object, resourceVersion uin
} }
// UpdateList implements Versioner // UpdateList implements Versioner
func (a APIObjectVersioner) UpdateList(obj runtime.Object, resourceVersion uint64, nextKey string) error { func (a APIObjectVersioner) UpdateList(obj runtime.Object, resourceVersion uint64, nextKey string, count int64) error {
listAccessor, err := meta.ListAccessor(obj) listAccessor, err := meta.ListAccessor(obj)
if err != nil || listAccessor == nil { if err != nil || listAccessor == nil {
return err return err
@ -55,6 +55,7 @@ func (a APIObjectVersioner) UpdateList(obj runtime.Object, resourceVersion uint6
} }
listAccessor.SetResourceVersion(versionString) listAccessor.SetResourceVersion(versionString)
listAccessor.SetContinue(nextKey) listAccessor.SetContinue(nextKey)
listAccessor.SetRemainingItemCount(count)
return nil return nil
} }

View File

@ -413,7 +413,7 @@ func (s *store) GetToList(ctx context.Context, key string, resourceVersion strin
} }
} }
// update version with cluster level revision // update version with cluster level revision
return s.versioner.UpdateList(listObj, uint64(getResp.Header.Revision), "") return s.versioner.UpdateList(listObj, uint64(getResp.Header.Revision), "", 0)
} }
func (s *store) Count(key string) (int64, error) { func (s *store) Count(key string) (int64, error) {
@ -576,9 +576,10 @@ func (s *store) List(ctx context.Context, key, resourceVersion string, pred stor
// loop until we have filled the requested limit from etcd or there are no more results // loop until we have filled the requested limit from etcd or there are no more results
var lastKey []byte var lastKey []byte
var hasMore bool var hasMore bool
var getResp *clientv3.GetResponse
for { for {
startTime := time.Now() startTime := time.Now()
getResp, err := s.client.KV.Get(ctx, key, options...) getResp, err = s.client.KV.Get(ctx, key, options...)
metrics.RecordEtcdRequestLatency("list", getTypeName(listPtr), startTime) metrics.RecordEtcdRequestLatency("list", getTypeName(listPtr), startTime)
if err != nil { if err != nil {
return interpretListError(err, len(pred.Continue) > 0, continueKey, keyPrefix) return interpretListError(err, len(pred.Continue) > 0, continueKey, keyPrefix)
@ -639,11 +640,17 @@ func (s *store) List(ctx context.Context, key, resourceVersion string, pred stor
if err != nil { if err != nil {
return err return err
} }
return s.versioner.UpdateList(listObj, uint64(returnedRV), next) remainingItemCount := getResp.Count - pred.Limit
// getResp.Count counts in objects that do not match the pred.
// Instead of returning inaccurate count, return 0.
if !pred.Empty() {
remainingItemCount = 0
}
return s.versioner.UpdateList(listObj, uint64(returnedRV), next, remainingItemCount)
} }
// no continuation // no continuation
return s.versioner.UpdateList(listObj, uint64(returnedRV), "") return s.versioner.UpdateList(listObj, uint64(returnedRV), "", 0)
} }
// growSlice takes a slice value and grows its capacity up // growSlice takes a slice value and grows its capacity up

View File

@ -825,14 +825,15 @@ func TestList(t *testing.T) {
} }
tests := []struct { tests := []struct {
name string name string
disablePaging bool disablePaging bool
rv string rv string
prefix string prefix string
pred storage.SelectionPredicate pred storage.SelectionPredicate
expectedOut []*example.Pod expectedOut []*example.Pod
expectContinue bool expectContinue bool
expectError bool expectedRemainingItemCount int64
expectError bool
}{ }{
{ {
name: "rejects invalid resource version", name: "rejects invalid resource version",
@ -882,8 +883,9 @@ func TestList(t *testing.T) {
Field: fields.Everything(), Field: fields.Everything(),
Limit: 1, Limit: 1,
}, },
expectedOut: []*example.Pod{preset[1].storedObj}, expectedOut: []*example.Pod{preset[1].storedObj},
expectContinue: true, expectContinue: true,
expectedRemainingItemCount: 1,
}, },
{ {
name: "test List with limit when paging disabled", name: "test List with limit when paging disabled",
@ -1061,6 +1063,9 @@ func TestList(t *testing.T) {
t.Errorf("(%s): length of list want=%d, got=%d", tt.name, len(tt.expectedOut), len(out.Items)) t.Errorf("(%s): length of list want=%d, got=%d", tt.name, len(tt.expectedOut), len(out.Items))
continue continue
} }
if e, a := tt.expectedRemainingItemCount, out.ListMeta.RemainingItemCount; e != a {
t.Errorf("(%s): remainingItemCount want=%d, got=%d", tt.name, e, a)
}
for j, wantPod := range tt.expectedOut { for j, wantPod := range tt.expectedOut {
getPod := &out.Items[j] getPod := &out.Items[j]
if !reflect.DeepEqual(wantPod, getPod) { if !reflect.DeepEqual(wantPod, getPod) {

View File

@ -40,10 +40,12 @@ type Versioner interface {
// from database. // from database.
UpdateObject(obj runtime.Object, resourceVersion uint64) error UpdateObject(obj runtime.Object, resourceVersion uint64) error
// UpdateList sets the resource version into an API list object. Returns an error if the object // UpdateList sets the resource version into an API list object. Returns an error if the object
// cannot be updated correctly. May return nil if the requested object does not need metadata // cannot be updated correctly. May return nil if the requested object does not need metadata from
// from database. continueValue is optional and indicates that more results are available if // database. continueValue is optional and indicates that more results are available if the client
// the client passes that value to the server in a subsequent call. // passes that value to the server in a subsequent call. remainingItemCount indicates the number
UpdateList(obj runtime.Object, resourceVersion uint64, continueValue string) error // of remaining objects if the list is partial. The remainingItemCount field is omitted during
// serialization if it is set to 0.
UpdateList(obj runtime.Object, resourceVersion uint64, continueValue string, remainingItemCount int64) error
// PrepareObjectForStorage should set SelfLink and ResourceVersion to the empty value. Should // PrepareObjectForStorage should set SelfLink and ResourceVersion to the empty value. Should
// return an error if the specified object cannot be updated. // return an error if the specified object cannot be updated.
PrepareObjectForStorage(obj runtime.Object) error PrepareObjectForStorage(obj runtime.Object) error

View File

@ -26,7 +26,7 @@ import (
"github.com/onsi/ginkgo" "github.com/onsi/ginkgo"
"github.com/onsi/gomega" "github.com/onsi/gomega"
"k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
@ -88,6 +88,7 @@ var _ = SIGDescribe("Servers with support for API chunking", func() {
lastRV = list.ResourceVersion lastRV = list.ResourceVersion
} }
gomega.Expect(list.ResourceVersion).To(gomega.Equal(lastRV)) gomega.Expect(list.ResourceVersion).To(gomega.Equal(lastRV))
gomega.Expect(int(list.RemainingItemCount) + len(list.Items) + found).To(gomega.BeNumerically("==", numberOfTotalResources))
for _, item := range list.Items { for _, item := range list.Items {
gomega.Expect(item.Name).To(gomega.Equal(fmt.Sprintf("template-%04d", found))) gomega.Expect(item.Name).To(gomega.Equal(fmt.Sprintf("template-%04d", found)))
found++ found++
@ -120,6 +121,7 @@ var _ = SIGDescribe("Servers with support for API chunking", func() {
gomega.Expect(err).ToNot(gomega.HaveOccurred(), "failed to list pod templates in namespace: %s, given limit: %d", ns, opts.Limit) gomega.Expect(err).ToNot(gomega.HaveOccurred(), "failed to list pod templates in namespace: %s, given limit: %d", ns, opts.Limit)
firstToken := list.Continue firstToken := list.Continue
firstRV := list.ResourceVersion firstRV := list.ResourceVersion
gomega.Expect(int(list.RemainingItemCount) + len(list.Items)).To(gomega.BeNumerically("==", numberOfTotalResources))
framework.Logf("Retrieved %d/%d results with rv %s and continue %s", len(list.Items), opts.Limit, list.ResourceVersion, firstToken) framework.Logf("Retrieved %d/%d results with rv %s and continue %s", len(list.Items), opts.Limit, list.ResourceVersion, firstToken)
ginkgo.By("retrieving the second page until the token expires") ginkgo.By("retrieving the second page until the token expires")
@ -153,7 +155,8 @@ var _ = SIGDescribe("Servers with support for API chunking", func() {
gomega.Expect(err).ToNot(gomega.HaveOccurred(), "failed to list pod templates in namespace: %s, given inconsistent continue token %s and limit: %d", ns, opts.Continue, opts.Limit) gomega.Expect(err).ToNot(gomega.HaveOccurred(), "failed to list pod templates in namespace: %s, given inconsistent continue token %s and limit: %d", ns, opts.Continue, opts.Limit)
gomega.Expect(list.ResourceVersion).ToNot(gomega.Equal(firstRV)) gomega.Expect(list.ResourceVersion).ToNot(gomega.Equal(firstRV))
gomega.Expect(len(list.Items)).To(gomega.BeNumerically("==", opts.Limit)) gomega.Expect(len(list.Items)).To(gomega.BeNumerically("==", opts.Limit))
found := oneTenth found := int(oneTenth)
gomega.Expect(int(list.RemainingItemCount) + len(list.Items) + found).To(gomega.BeNumerically("==", numberOfTotalResources))
for _, item := range list.Items { for _, item := range list.Items {
gomega.Expect(item.Name).To(gomega.Equal(fmt.Sprintf("template-%04d", found))) gomega.Expect(item.Name).To(gomega.Equal(fmt.Sprintf("template-%04d", found)))
found++ found++
@ -165,6 +168,7 @@ var _ = SIGDescribe("Servers with support for API chunking", func() {
for { for {
list, err := client.List(opts) list, err := client.List(opts)
gomega.Expect(err).ToNot(gomega.HaveOccurred(), "failed to list pod templates in namespace: %s, given limit: %d", ns, opts.Limit) gomega.Expect(err).ToNot(gomega.HaveOccurred(), "failed to list pod templates in namespace: %s, given limit: %d", ns, opts.Limit)
gomega.Expect(int(list.RemainingItemCount) + len(list.Items) + found).To(gomega.BeNumerically("==", numberOfTotalResources))
framework.Logf("Retrieved %d/%d results with rv %s and continue %s", len(list.Items), opts.Limit, list.ResourceVersion, list.Continue) framework.Logf("Retrieved %d/%d results with rv %s and continue %s", len(list.Items), opts.Limit, list.ResourceVersion, list.Continue)
gomega.Expect(len(list.Items)).To(gomega.BeNumerically("<=", opts.Limit)) gomega.Expect(len(list.Items)).To(gomega.BeNumerically("<=", opts.Limit))
gomega.Expect(list.ResourceVersion).To(gomega.Equal(lastRV)) gomega.Expect(list.ResourceVersion).To(gomega.Equal(lastRV))