Merge pull request #6424 from heyitsanthony/v3api-createminmax

etcdserver: range queries with min/max create revision
This commit is contained in:
Anthony Romano 2016-09-14 19:10:52 -07:00 committed by GitHub
commit e77baa3dcb
11 changed files with 348 additions and 228 deletions

View File

@ -643,6 +643,8 @@ Empty field.
| count_only | count_only when set returns only the count of the keys in the range. | bool |
| min_mod_revision | min_mod_revision is the lower bound for returned key mod revisions; all keys with lesser mod revisions will be filtered away. | int64 |
| max_mod_revision | max_mod_revision is the upper bound for returned key mod revisions; all keys with greater mod revisions will be filtered away. | int64 |
| min_create_revision | min_create_revision is the lower bound for returned key create revisions; all keys with lesser create trevisions will be filtered away. | int64 |
| max_create_revision | max_create_revision is the upper bound for returned key create revisions; all keys with greater create revisions will be filtered away. | int64 |

View File

@ -1865,11 +1865,21 @@
"format": "int64",
"description": "limit is a limit on the number of keys returned for the request."
},
"max_create_revision": {
"type": "string",
"format": "int64",
"description": "max_create_revision is the upper bound for returned key create revisions; all keys with\ngreater create revisions will be filtered away."
},
"max_mod_revision": {
"type": "string",
"format": "int64",
"description": "max_mod_revision is the upper bound for returned key mod revisions; all keys with\ngreater mod revisions will be filtered away."
},
"min_create_revision": {
"type": "string",
"format": "int64",
"description": "min_create_revision is the lower bound for returned key create revisions; all keys with\nlesser create trevisions will be filtered away."
},
"min_mod_revision": {
"type": "string",
"format": "int64",

View File

@ -69,7 +69,7 @@ func (e *Election) Campaign(ctx context.Context, val string) error {
}
}
err = waitDeletes(ctx, client, e.keyPrefix, v3.WithPrefix(), v3.WithRev(e.leaderRev-1))
err = waitDeletes(ctx, client, e.keyPrefix, e.leaderRev-1)
if err != nil {
// clean up in case of context cancel
select {

View File

@ -16,7 +16,6 @@ package concurrency
import (
"fmt"
"math"
v3 "github.com/coreos/etcd/clientv3"
"github.com/coreos/etcd/mvcc/mvccpb"
@ -39,39 +38,27 @@ func waitDelete(ctx context.Context, client *v3.Client, key string, rev int64) e
if err := wr.Err(); err != nil {
return err
}
if err := ctx.Err(); err != nil {
return err
}
return fmt.Errorf("lost watcher waiting for delete")
}
// waitDeletes efficiently waits until all keys matched by Get(key, opts...) are deleted
func waitDeletes(ctx context.Context, client *v3.Client, key string, opts ...v3.OpOption) error {
getOpts := []v3.OpOption{v3.WithSort(v3.SortByCreateRevision, v3.SortAscend)}
getOpts = append(getOpts, opts...)
resp, err := client.Get(ctx, key, getOpts...)
maxRev := int64(math.MaxInt64)
getOpts = append(getOpts, v3.WithRev(0))
for err == nil {
for len(resp.Kvs) > 0 {
i := len(resp.Kvs) - 1
if resp.Kvs[i].CreateRevision <= maxRev {
break
}
resp.Kvs = resp.Kvs[:i]
// waitDeletes efficiently waits until all keys matching the prefix and no greater
// than the create revision.
func waitDeletes(ctx context.Context, client *v3.Client, pfx string, maxCreateRev int64) error {
getOpts := append(v3.WithLastCreate(), v3.WithMaxCreateRev(maxCreateRev))
for {
resp, err := client.Get(ctx, pfx, getOpts...)
if err != nil {
return err
}
if len(resp.Kvs) == 0 {
break
return nil
}
lastKV := resp.Kvs[len(resp.Kvs)-1]
maxRev = lastKV.CreateRevision
err = waitDelete(ctx, client, string(lastKV.Key), maxRev)
if err != nil || len(resp.Kvs) == 1 {
break
lastKey := string(resp.Kvs[0].Key)
if err = waitDelete(ctx, client, lastKey, resp.Header.Revision); err != nil {
return err
}
getOpts = append(getOpts, v3.WithLimit(int64(len(resp.Kvs)-1)))
resp, err = client.Get(ctx, key, getOpts...)
}
return err
}

View File

@ -57,7 +57,7 @@ func (m *Mutex) Lock(ctx context.Context) error {
}
// wait for deletion revisions prior to myKey
err = waitDeletes(ctx, client, m.pfx, v3.WithPrefix(), v3.WithRev(m.myRev-1))
err = waitDeletes(ctx, client, m.pfx, m.myRev-1)
// release lock key if cancelled
select {
case <-ctx.Done():

View File

@ -43,6 +43,8 @@ type Op struct {
countOnly bool
minModRev int64
maxModRev int64
minCreateRev int64
maxCreateRev int64
// for range, watch
rev int64
@ -68,15 +70,17 @@ func (op Op) toRangeRequest() *pb.RangeRequest {
panic("op.t != tRange")
}
r := &pb.RangeRequest{
Key: op.key,
RangeEnd: op.end,
Limit: op.limit,
Revision: op.rev,
Serializable: op.serializable,
KeysOnly: op.keysOnly,
CountOnly: op.countOnly,
MinModRevision: op.minModRev,
MaxModRevision: op.maxModRev,
Key: op.key,
RangeEnd: op.end,
Limit: op.limit,
Revision: op.rev,
Serializable: op.serializable,
KeysOnly: op.keysOnly,
CountOnly: op.countOnly,
MinModRevision: op.minModRev,
MaxModRevision: op.maxModRev,
MinCreateRevision: op.minCreateRev,
MaxCreateRevision: op.maxCreateRev,
}
if op.sort != nil {
r.SortOrder = pb.RangeRequest_SortOrder(op.sort.Order)
@ -128,6 +132,8 @@ func OpDelete(key string, opts ...OpOption) Op {
panic("unexpected countOnly in delete")
case ret.minModRev != 0, ret.maxModRev != 0:
panic("unexpected mod revision filter in delete")
case ret.minCreateRev != 0, ret.maxCreateRev != 0:
panic("unexpected create revision filter in delete")
case ret.filterDelete, ret.filterPut:
panic("unexpected filter in delete")
case ret.createdNotify:
@ -153,7 +159,9 @@ func OpPut(key, val string, opts ...OpOption) Op {
case ret.countOnly:
panic("unexpected countOnly in put")
case ret.minModRev != 0, ret.maxModRev != 0:
panic("unexpected mod revision filter in delete")
panic("unexpected mod revision filter in put")
case ret.minCreateRev != 0, ret.maxCreateRev != 0:
panic("unexpected create revision filter in put")
case ret.filterDelete, ret.filterPut:
panic("unexpected filter in put")
case ret.createdNotify:
@ -178,6 +186,8 @@ func opWatch(key string, opts ...OpOption) Op {
panic("unexpected countOnly in watch")
case ret.minModRev != 0, ret.maxModRev != 0:
panic("unexpected mod revision filter in watch")
case ret.minCreateRev != 0, ret.maxCreateRev != 0:
panic("unexpected create revision filter in watch")
}
return ret
}
@ -286,6 +296,12 @@ func WithMinModRev(rev int64) OpOption { return func(op *Op) { op.minModRev = re
// WithMaxModRev filters out keys for Get with modification revisions greater than the given revision.
func WithMaxModRev(rev int64) OpOption { return func(op *Op) { op.maxModRev = rev } }
// WithMinCreateRev filters out keys for Get with creation revisions less than the given revision.
func WithMinCreateRev(rev int64) OpOption { return func(op *Op) { op.minCreateRev = rev } }
// WithMaxCreateRev filters out keys for Get with creation revisions greater than the given revision.
func WithMaxCreateRev(rev int64) OpOption { return func(op *Op) { op.maxCreateRev = rev } }
// WithFirstCreate gets the key with the oldest creation revision in the request range.
func WithFirstCreate() []OpOption { return withTop(SortByCreateRevision, SortAscend) }

View File

@ -114,11 +114,6 @@ func campaign(c *clientv3.Client, election string, prop string) error {
close(donec)
}()
s, serr := concurrency.NewSession(c)
if serr != nil {
return serr
}
if err = e.Campaign(ctx, prop); err != nil {
return err
}

View File

@ -258,7 +258,9 @@ func (a *applierV3backend) Range(txnID int64, r *pb.RangeRequest) (*pb.RangeResp
}
limit := r.Limit
if r.SortOrder != pb.RangeRequest_NONE || r.MaxModRevision != 0 || r.MinModRevision != 0 {
if r.SortOrder != pb.RangeRequest_NONE ||
r.MinModRevision != 0 || r.MaxModRevision != 0 ||
r.MinCreateRevision != 0 || r.MaxCreateRevision != 0 {
// fetch everything; sort and truncate afterwards
limit = 0
}
@ -293,6 +295,14 @@ func (a *applierV3backend) Range(txnID int64, r *pb.RangeRequest) (*pb.RangeResp
f := func(kv *mvccpb.KeyValue) bool { return kv.ModRevision < r.MinModRevision }
pruneKVs(rr, f)
}
if r.MaxCreateRevision != 0 {
f := func(kv *mvccpb.KeyValue) bool { return kv.CreateRevision > r.MaxCreateRevision }
pruneKVs(rr, f)
}
if r.MinCreateRevision != 0 {
f := func(kv *mvccpb.KeyValue) bool { return kv.CreateRevision < r.MinCreateRevision }
pruneKVs(rr, f)
}
if r.SortOrder != pb.RangeRequest_NONE {
var sorter sort.Interface

View File

@ -257,6 +257,12 @@ type RangeRequest struct {
// max_mod_revision is the upper bound for returned key mod revisions; all keys with
// greater mod revisions will be filtered away.
MaxModRevision int64 `protobuf:"varint,11,opt,name=max_mod_revision,json=maxModRevision,proto3" json:"max_mod_revision,omitempty"`
// min_create_revision is the lower bound for returned key create revisions; all keys with
// lesser create trevisions will be filtered away.
MinCreateRevision int64 `protobuf:"varint,12,opt,name=min_create_revision,json=minCreateRevision,proto3" json:"min_create_revision,omitempty"`
// max_create_revision is the upper bound for returned key create revisions; all keys with
// greater create revisions will be filtered away.
MaxCreateRevision int64 `protobuf:"varint,13,opt,name=max_create_revision,json=maxCreateRevision,proto3" json:"max_create_revision,omitempty"`
}
func (m *RangeRequest) Reset() { *m = RangeRequest{} }
@ -3819,6 +3825,16 @@ func (m *RangeRequest) MarshalTo(data []byte) (int, error) {
i++
i = encodeVarintRpc(data, i, uint64(m.MaxModRevision))
}
if m.MinCreateRevision != 0 {
data[i] = 0x60
i++
i = encodeVarintRpc(data, i, uint64(m.MinCreateRevision))
}
if m.MaxCreateRevision != 0 {
data[i] = 0x68
i++
i = encodeVarintRpc(data, i, uint64(m.MaxCreateRevision))
}
return i, nil
}
@ -6530,6 +6546,12 @@ func (m *RangeRequest) Size() (n int) {
if m.MaxModRevision != 0 {
n += 1 + sovRpc(uint64(m.MaxModRevision))
}
if m.MinCreateRevision != 0 {
n += 1 + sovRpc(uint64(m.MinCreateRevision))
}
if m.MaxCreateRevision != 0 {
n += 1 + sovRpc(uint64(m.MaxCreateRevision))
}
return n
}
@ -8031,6 +8053,44 @@ func (m *RangeRequest) Unmarshal(data []byte) error {
break
}
}
case 12:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field MinCreateRevision", wireType)
}
m.MinCreateRevision = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowRpc
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := data[iNdEx]
iNdEx++
m.MinCreateRevision |= (int64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
case 13:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field MaxCreateRevision", wireType)
}
m.MaxCreateRevision = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowRpc
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := data[iNdEx]
iNdEx++
m.MaxCreateRevision |= (int64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipRpc(data[iNdEx:])
@ -15919,12 +15979,12 @@ var (
)
var fileDescriptorRpc = []byte{
// 3367 bytes of a gzipped FileDescriptorProto
// 3391 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x5b, 0xcf, 0x6f, 0x1b, 0xc7,
0xf5, 0xd7, 0x92, 0x14, 0x29, 0x3e, 0x52, 0x14, 0x3d, 0x92, 0x6d, 0x6a, 0x6d, 0xcb, 0xf2, 0xf8,
0x97, 0x6c, 0x27, 0x52, 0xa2, 0xe4, 0xfb, 0x3d, 0xb8, 0x41, 0x00, 0x59, 0x62, 0x2c, 0x55, 0xb2,
0xe4, 0xac, 0x64, 0x27, 0x05, 0x82, 0x0a, 0x2b, 0x72, 0x2c, 0x2e, 0x44, 0xee, 0x32, 0xbb, 0x4b,
0x5a, 0x4a, 0x5b, 0xa0, 0x48, 0x1b, 0x14, 0xed, 0xb1, 0x39, 0xb4, 0x4d, 0x8f, 0x6d, 0xff, 0x84,
0x5a, 0x4a, 0x5b, 0xa0, 0x48, 0x13, 0x14, 0xed, 0xb1, 0x39, 0xb4, 0x4d, 0x8f, 0x45, 0xff, 0x84,
0xde, 0xfa, 0x07, 0x14, 0xbd, 0xb4, 0x40, 0xff, 0x81, 0x22, 0xed, 0xa1, 0x87, 0xde, 0x7b, 0x2a,
0x5a, 0xcc, 0xaf, 0xdd, 0xd9, 0xe5, 0x2e, 0xe5, 0x74, 0x9b, 0x8b, 0xb5, 0x33, 0xf3, 0xe6, 0x7d,
0xde, 0x7b, 0x33, 0xef, 0xcd, 0x9b, 0x37, 0x34, 0x94, 0xdd, 0x7e, 0x6b, 0xb9, 0xef, 0x3a, 0xbe,
@ -15932,12 +15992,12 @@ var fileDescriptorRpc = []byte{
0x87, 0x0d, 0xac, 0xd0, 0x2f, 0x4e, 0xa3, 0xcf, 0x53, 0x9a, 0x95, 0xde, 0xb0, 0xd5, 0x62, 0xff,
0xf4, 0x8f, 0x56, 0x4e, 0x86, 0x62, 0xe8, 0x0a, 0x1b, 0x32, 0x07, 0x7e, 0x87, 0xfd, 0xd3, 0x3f,
0x62, 0x7f, 0xc4, 0xe0, 0xd5, 0x63, 0xc7, 0x39, 0xee, 0x92, 0x15, 0xb3, 0x6f, 0xad, 0x98, 0xb6,
0xed, 0xf8, 0xa6, 0x6f, 0x39, 0xb6, 0xc7, 0x47, 0xf1, 0x67, 0x1a, 0xd4, 0x0c, 0xe2, 0xf5, 0x1d,
0xed, 0xf8, 0xa6, 0x6f, 0x39, 0xb6, 0xc7, 0x47, 0xf1, 0xe7, 0x1a, 0xd4, 0x0c, 0xe2, 0xf5, 0x1d,
0xdb, 0x23, 0x9b, 0xc4, 0x6c, 0x13, 0x17, 0x5d, 0x03, 0x68, 0x75, 0x07, 0x9e, 0x4f, 0xdc, 0x43,
0xab, 0xdd, 0xd0, 0x16, 0xb5, 0xa5, 0x82, 0x51, 0x16, 0x3d, 0x5b, 0x6d, 0x74, 0x05, 0xca, 0x3d,
0xd2, 0x3b, 0xe2, 0xa3, 0x39, 0x36, 0x3a, 0xc5, 0x3b, 0xb6, 0xda, 0x48, 0x87, 0x29, 0x97, 0x0c,
0x2d, 0xcf, 0x72, 0xec, 0x46, 0x7e, 0x51, 0x5b, 0xca, 0x1b, 0x41, 0x9b, 0x4e, 0x74, 0xcd, 0x17,
0xfe, 0xa1, 0x4f, 0xdc, 0x5e, 0xa3, 0xc0, 0x27, 0xd2, 0x8e, 0x03, 0xe2, 0xf6, 0xf0, 0xaf, 0x0b,
0xfe, 0xa1, 0x4f, 0xdc, 0x5e, 0xa3, 0xc0, 0x27, 0xd2, 0x8e, 0x03, 0xe2, 0xf6, 0xf0, 0x67, 0x93,
0x50, 0x35, 0x4c, 0xfb, 0x98, 0x18, 0xe4, 0xe3, 0x01, 0xf1, 0x7c, 0x54, 0x87, 0xfc, 0x09, 0x39,
0x63, 0xf0, 0x55, 0x83, 0x7e, 0xf2, 0xf9, 0xf6, 0x31, 0x39, 0x24, 0x36, 0x07, 0xae, 0xd2, 0xf9,
0xf6, 0x31, 0x69, 0xda, 0x6d, 0x34, 0x07, 0x93, 0x5d, 0xab, 0x67, 0xf9, 0x02, 0x95, 0x37, 0x22,
@ -15950,185 +16010,186 @@ var fileDescriptorRpc = []byte{
0x8a, 0x76, 0xec, 0xd9, 0xdd, 0x33, 0xb6, 0x68, 0xce, 0xc0, 0xf6, 0xf9, 0x68, 0x99, 0x8d, 0x96,
0x59, 0x0f, 0x1b, 0x5e, 0x82, 0x7a, 0xcf, 0xb2, 0x0f, 0x7b, 0x4e, 0xfb, 0x30, 0x30, 0x08, 0x30,
0x83, 0xd4, 0x7a, 0x96, 0xfd, 0xc4, 0x69, 0x1b, 0xd2, 0x2c, 0x94, 0xd2, 0x3c, 0x8d, 0x52, 0x56,
0x04, 0xa5, 0x79, 0xaa, 0x50, 0xe2, 0x65, 0x28, 0x07, 0x36, 0x41, 0x53, 0x50, 0xd8, 0xdd, 0xdb,
0x6d, 0xd6, 0x27, 0x10, 0x40, 0x71, 0x6d, 0x7f, 0xbd, 0xb9, 0xbb, 0x51, 0xd7, 0x50, 0x05, 0x4a,
0x1b, 0x4d, 0xde, 0xc8, 0xe1, 0x47, 0x00, 0xa1, 0xf6, 0xa8, 0x04, 0xf9, 0xed, 0xe6, 0xb7, 0xea,
0x13, 0x94, 0xe6, 0x79, 0xd3, 0xd8, 0xdf, 0xda, 0xdb, 0xad, 0x6b, 0x74, 0xf2, 0xba, 0xd1, 0x5c,
0x3b, 0x68, 0xd6, 0x73, 0x94, 0xe2, 0xc9, 0xde, 0x46, 0x3d, 0x8f, 0xca, 0x30, 0xf9, 0x7c, 0x6d,
0xe7, 0x59, 0xb3, 0x5e, 0xc0, 0x9f, 0x6b, 0x30, 0x2d, 0xec, 0xc9, 0xf7, 0x2c, 0x7a, 0x1b, 0x8a,
0x1d, 0xb6, 0x6f, 0xd9, 0x56, 0xa9, 0xac, 0x5e, 0x8d, 0x19, 0x3f, 0xb2, 0xb7, 0x0d, 0x41, 0x8b,
0x30, 0xe4, 0x4f, 0x86, 0x5e, 0x23, 0xb7, 0x98, 0x5f, 0xaa, 0xac, 0xd6, 0x97, 0xb9, 0x43, 0x2d,
0x6f, 0x93, 0xb3, 0xe7, 0x66, 0x77, 0x40, 0x0c, 0x3a, 0x88, 0x10, 0x14, 0x7a, 0x8e, 0x4b, 0xd8,
0x8e, 0x9a, 0x32, 0xd8, 0x37, 0xdd, 0x66, 0xcc, 0xa8, 0x62, 0x37, 0xf1, 0x06, 0x6e, 0x01, 0x3c,
0x1d, 0xf8, 0xe9, 0x3b, 0x77, 0x0e, 0x26, 0x87, 0x94, 0xaf, 0xd8, 0xb5, 0xbc, 0xc1, 0xb6, 0x2c,
0x31, 0x3d, 0x12, 0x6c, 0x59, 0xda, 0x40, 0x97, 0xa1, 0xd4, 0x77, 0xc9, 0xf0, 0xf0, 0x64, 0xc8,
0x30, 0xa6, 0x8c, 0x22, 0x6d, 0x6e, 0x0f, 0xb1, 0x0d, 0x15, 0x06, 0x92, 0x49, 0xef, 0x7b, 0x21,
0xf7, 0x1c, 0x9b, 0x36, 0xaa, 0xbb, 0xc4, 0xfb, 0x08, 0xd0, 0x06, 0xe9, 0x12, 0x9f, 0x64, 0x71,
0x4b, 0x45, 0x9b, 0x7c, 0x44, 0x9b, 0x9f, 0x6a, 0x30, 0x1b, 0x61, 0x9f, 0x49, 0xad, 0x06, 0x94,
0xda, 0x8c, 0x19, 0x97, 0x20, 0x6f, 0xc8, 0x26, 0x7a, 0x00, 0x53, 0x42, 0x00, 0xaf, 0x91, 0x4f,
0x59, 0xed, 0x12, 0x97, 0xc9, 0xc3, 0xff, 0xd0, 0xa0, 0x2c, 0x14, 0xdd, 0xeb, 0xa3, 0x35, 0x98,
0x76, 0x79, 0xe3, 0x90, 0xe9, 0x23, 0x24, 0xd2, 0xd3, 0xbd, 0x7b, 0x73, 0xc2, 0xa8, 0x8a, 0x29,
0xac, 0x1b, 0x7d, 0x03, 0x2a, 0x92, 0x45, 0x7f, 0xe0, 0x0b, 0x93, 0x37, 0xa2, 0x0c, 0xc2, 0x9d,
0xb3, 0x39, 0x61, 0x80, 0x20, 0x7f, 0x3a, 0xf0, 0xd1, 0x01, 0xcc, 0xc9, 0xc9, 0x5c, 0x1b, 0x21,
0x46, 0x9e, 0x71, 0x59, 0x8c, 0x72, 0x19, 0x5d, 0xaa, 0xcd, 0x09, 0x03, 0x89, 0xf9, 0xca, 0xe0,
0xa3, 0x32, 0x94, 0x44, 0x2f, 0xfe, 0xa7, 0x06, 0x20, 0x0d, 0xba, 0xd7, 0x47, 0x1b, 0x50, 0x73,
0x45, 0x2b, 0xa2, 0xf0, 0x95, 0x44, 0x85, 0xc5, 0x3a, 0x4c, 0x18, 0xd3, 0x72, 0x12, 0x57, 0xf9,
0x5d, 0xa8, 0x06, 0x5c, 0x42, 0x9d, 0xe7, 0x13, 0x74, 0x0e, 0x38, 0x54, 0xe4, 0x04, 0xaa, 0xf5,
0x07, 0x70, 0x31, 0x98, 0x9f, 0xa0, 0xf6, 0x8d, 0x31, 0x6a, 0x07, 0x0c, 0x67, 0x25, 0x07, 0x55,
0x71, 0xa0, 0x67, 0x01, 0xef, 0xc6, 0x5f, 0xe4, 0xa1, 0xb4, 0xee, 0xf4, 0xfa, 0xa6, 0x4b, 0xd7,
0xa8, 0xe8, 0x12, 0x6f, 0xd0, 0xf5, 0x99, 0xba, 0xb5, 0xd5, 0x9b, 0x51, 0x04, 0x41, 0x26, 0xff,
0x1a, 0x8c, 0xd4, 0x10, 0x53, 0xe8, 0x64, 0x11, 0xfa, 0x73, 0xaf, 0x30, 0x59, 0x04, 0x7e, 0x31,
0x45, 0xfa, 0x52, 0x3e, 0xf4, 0x25, 0x1d, 0x4a, 0x43, 0xe2, 0x86, 0xc7, 0xd5, 0xe6, 0x84, 0x21,
0x3b, 0xd0, 0x3d, 0x98, 0x69, 0xb9, 0xc4, 0xa4, 0xf6, 0x90, 0x71, 0x79, 0x52, 0xd0, 0xd4, 0xf8,
0x40, 0x10, 0xc3, 0x6f, 0x42, 0x35, 0x12, 0xbf, 0x8b, 0x82, 0xae, 0xd2, 0x53, 0x02, 0xfd, 0x25,
0x19, 0x94, 0xe8, 0x59, 0x53, 0xdd, 0x9c, 0x10, 0x61, 0x09, 0xbf, 0x09, 0xd3, 0x11, 0x5d, 0x69,
0xf8, 0x6d, 0xbe, 0xff, 0x6c, 0x6d, 0x87, 0xc7, 0xea, 0xc7, 0x2c, 0x3c, 0x1b, 0x75, 0x8d, 0x86,
0xfc, 0x9d, 0xe6, 0xfe, 0x7e, 0x3d, 0x87, 0xdf, 0x09, 0xa6, 0x88, 0xe0, 0xae, 0xc4, 0xf4, 0x09,
0x25, 0xa6, 0x6b, 0x32, 0xa6, 0xe7, 0xc2, 0x98, 0x9e, 0x7f, 0x54, 0x83, 0x2a, 0x37, 0xc8, 0xe1,
0xc0, 0xa6, 0xe7, 0xca, 0xaf, 0x34, 0x80, 0x83, 0x53, 0x5b, 0x46, 0x9c, 0x15, 0x28, 0xb5, 0x38,
0xf3, 0x86, 0xc6, 0x1c, 0xf8, 0x62, 0xa2, 0x8d, 0x0d, 0x49, 0x85, 0xde, 0x84, 0x92, 0x37, 0x68,
0xb5, 0x88, 0x27, 0xe3, 0xfb, 0xe5, 0x78, 0x0c, 0x11, 0x1e, 0x6e, 0x48, 0x3a, 0x3a, 0xe5, 0x85,
0x69, 0x75, 0x07, 0x2c, 0xda, 0x8f, 0x9f, 0x22, 0xe8, 0xf0, 0x2f, 0x34, 0xa8, 0x30, 0x29, 0x33,
0x05, 0xae, 0xab, 0x50, 0x66, 0x32, 0x90, 0xb6, 0x08, 0x5d, 0x53, 0x46, 0xd8, 0x81, 0xfe, 0x1f,
0xca, 0x72, 0xcb, 0xca, 0xe8, 0xd5, 0x48, 0x66, 0xbb, 0xd7, 0x37, 0x42, 0x52, 0xbc, 0x0d, 0x17,
0x98, 0x55, 0x5a, 0x34, 0xd3, 0x93, 0x76, 0x54, 0x73, 0x21, 0x2d, 0x96, 0x0b, 0xe9, 0x30, 0xd5,
0xef, 0x9c, 0x79, 0x56, 0xcb, 0xec, 0x0a, 0x29, 0x82, 0x36, 0xfe, 0x26, 0x20, 0x95, 0x59, 0x16,
0x75, 0xf1, 0x34, 0x54, 0x36, 0x4d, 0xaf, 0x23, 0x44, 0xc2, 0x1f, 0x42, 0x95, 0x37, 0x33, 0xd9,
0x10, 0x41, 0xa1, 0x63, 0x7a, 0x1d, 0x26, 0xf8, 0xb4, 0xc1, 0xbe, 0xf1, 0x05, 0x98, 0xd9, 0xb7,
0xcd, 0xbe, 0xd7, 0x71, 0x64, 0x70, 0xa5, 0x99, 0x6e, 0x3d, 0xec, 0xcb, 0x84, 0x78, 0x17, 0x66,
0x5c, 0xd2, 0x33, 0x2d, 0xdb, 0xb2, 0x8f, 0x0f, 0x8f, 0xce, 0x7c, 0xe2, 0x89, 0x44, 0xb8, 0x16,
0x74, 0x3f, 0xa2, 0xbd, 0x54, 0xb4, 0xa3, 0xae, 0x73, 0x24, 0x5c, 0x9c, 0x7d, 0xe3, 0xdf, 0x6a,
0x50, 0xfd, 0xc0, 0xf4, 0x5b, 0xd2, 0x0a, 0x68, 0x0b, 0x6a, 0x81, 0x63, 0xb3, 0x1e, 0x21, 0x4b,
0x2c, 0xc2, 0xb3, 0x39, 0xeb, 0xc2, 0xd1, 0x65, 0x84, 0x9f, 0x6e, 0xa9, 0x1d, 0x8c, 0x95, 0x69,
0xb7, 0x48, 0x37, 0x60, 0x95, 0x4b, 0x67, 0xc5, 0x08, 0x55, 0x56, 0x6a, 0xc7, 0xa3, 0x99, 0xf0,
0xf4, 0xe3, 0x6e, 0xf9, 0x45, 0x0e, 0xd0, 0xa8, 0x0c, 0x5f, 0x35, 0x21, 0xb8, 0x0d, 0x35, 0xcf,
0x37, 0x5d, 0xff, 0x30, 0x76, 0x4d, 0x98, 0x66, 0xbd, 0x41, 0x70, 0xba, 0x0b, 0x33, 0x7d, 0xd7,
0x39, 0x76, 0x89, 0xe7, 0x1d, 0xda, 0x8e, 0x6f, 0xbd, 0x38, 0x13, 0xd9, 0x50, 0x4d, 0x76, 0xef,
0xb2, 0x5e, 0xd4, 0x84, 0xd2, 0x0b, 0xab, 0xeb, 0x13, 0xd7, 0x6b, 0x4c, 0x2e, 0xe6, 0x97, 0x6a,
0xab, 0x0f, 0xce, 0xb3, 0xda, 0xf2, 0x7b, 0x8c, 0xfe, 0xe0, 0xac, 0x4f, 0x0c, 0x39, 0x57, 0xcd,
0x53, 0x8a, 0x91, 0x3c, 0xe5, 0x36, 0x40, 0x48, 0x4f, 0xa3, 0xd6, 0xee, 0xde, 0xd3, 0x67, 0x07,
0xf5, 0x09, 0x54, 0x85, 0xa9, 0xdd, 0xbd, 0x8d, 0xe6, 0x4e, 0x93, 0xc6, 0x35, 0xbc, 0x22, 0x6d,
0xa3, 0xda, 0x10, 0xcd, 0xc3, 0xd4, 0x4b, 0xda, 0x2b, 0xef, 0x51, 0x79, 0xa3, 0xc4, 0xda, 0x5b,
0x6d, 0xfc, 0x77, 0x0d, 0xa6, 0xc5, 0x2e, 0xc8, 0xb4, 0x15, 0x55, 0x88, 0x5c, 0x04, 0x82, 0x26,
0x45, 0x7c, 0x77, 0xb4, 0x45, 0xee, 0x25, 0x9b, 0xd4, 0xdd, 0xf9, 0x62, 0x93, 0xb6, 0x30, 0x6b,
0xd0, 0x46, 0xf7, 0xa0, 0xde, 0xe2, 0xee, 0x1e, 0x3b, 0x67, 0x8c, 0x19, 0xd1, 0x1f, 0x2c, 0xd2,
0x6d, 0x28, 0x92, 0x21, 0xb1, 0x7d, 0xaf, 0x51, 0x61, 0xb1, 0x69, 0x5a, 0x66, 0x56, 0x4d, 0xda,
0x6b, 0x88, 0x41, 0xfc, 0x7f, 0x70, 0x61, 0x87, 0xa6, 0xb6, 0x8f, 0x5d, 0xd3, 0x56, 0x93, 0xe4,
0x83, 0x83, 0x1d, 0x61, 0x95, 0xbc, 0x7f, 0xb0, 0x83, 0x6a, 0x90, 0xdb, 0xda, 0x10, 0x3a, 0xe4,
0xac, 0x0d, 0xfc, 0xa9, 0x06, 0x48, 0x9d, 0x97, 0xc9, 0x4c, 0x31, 0xe6, 0x12, 0x3e, 0x1f, 0xc2,
0xcf, 0xc1, 0x24, 0x71, 0x5d, 0xc7, 0x65, 0x06, 0x29, 0x1b, 0xbc, 0x81, 0x6f, 0x09, 0x19, 0x0c,
0x32, 0x74, 0x4e, 0x82, 0x3d, 0xcf, 0xb9, 0x69, 0x81, 0xa8, 0xdb, 0x30, 0x1b, 0xa1, 0xca, 0x14,
0x23, 0xef, 0xc2, 0x45, 0xc6, 0x6c, 0x9b, 0x90, 0xfe, 0x5a, 0xd7, 0x1a, 0xa6, 0xa2, 0xf6, 0xe1,
0x52, 0x9c, 0xf0, 0xeb, 0xb5, 0x11, 0x7e, 0x47, 0x20, 0x1e, 0x58, 0x3d, 0x72, 0xe0, 0xec, 0xa4,
0xcb, 0x46, 0x03, 0x1f, 0xbd, 0x9a, 0x8a, 0xc3, 0x84, 0x7d, 0xe3, 0xdf, 0x68, 0x70, 0x79, 0x64,
0xfa, 0xd7, 0xbc, 0xaa, 0x0b, 0x00, 0xc7, 0x74, 0xfb, 0x90, 0x36, 0x1d, 0xe0, 0x97, 0x36, 0xa5,
0x27, 0x90, 0x93, 0xc6, 0x8e, 0xaa, 0x90, 0xb3, 0x03, 0xc5, 0x27, 0xac, 0x9e, 0xa1, 0x68, 0x55,
0x90, 0x5a, 0xd9, 0x66, 0x8f, 0x5f, 0xe3, 0xca, 0x06, 0xfb, 0x66, 0x47, 0x27, 0x21, 0xee, 0x33,
0x63, 0x87, 0x1f, 0xd1, 0x65, 0x23, 0x68, 0x53, 0xf4, 0x56, 0xd7, 0x22, 0xb6, 0xcf, 0x46, 0x0b,
0x6c, 0x54, 0xe9, 0xc1, 0xcb, 0x50, 0xe7, 0x48, 0x6b, 0xed, 0xb6, 0x72, 0x4c, 0x07, 0xfc, 0xb4,
0x28, 0x3f, 0xfc, 0x12, 0x2e, 0x28, 0xf4, 0x99, 0x4c, 0xf7, 0x1a, 0x14, 0x79, 0xd1, 0x46, 0x9c,
0x10, 0x73, 0xd1, 0x59, 0x1c, 0xc6, 0x10, 0x34, 0xf8, 0x36, 0xcc, 0x8a, 0x1e, 0xd2, 0x73, 0x92,
0x56, 0x9d, 0xd9, 0x07, 0xef, 0xc0, 0x5c, 0x94, 0x2c, 0x93, 0x23, 0xac, 0x49, 0xd0, 0x67, 0xfd,
0xb6, 0x72, 0xe0, 0xc4, 0x17, 0x45, 0x35, 0x58, 0x2e, 0x66, 0xb0, 0x40, 0x20, 0xc9, 0x22, 0x93,
0x40, 0xb3, 0xd2, 0xfc, 0x3b, 0x96, 0x17, 0xa4, 0x15, 0x9f, 0x00, 0x52, 0x3b, 0x33, 0x2d, 0xca,
0x32, 0x94, 0xb8, 0xc1, 0x65, 0xe6, 0x9a, 0xbc, 0x2a, 0x92, 0x88, 0x0a, 0xb4, 0x41, 0x5e, 0xb8,
0xe6, 0x71, 0x8f, 0x04, 0x91, 0x95, 0xe6, 0x6b, 0x6a, 0x67, 0x26, 0x8d, 0xff, 0xa8, 0x41, 0x75,
0xad, 0x6b, 0xba, 0x3d, 0x69, 0xfc, 0x77, 0xa1, 0xc8, 0x13, 0x41, 0x71, 0x59, 0xba, 0x13, 0x65,
0xa3, 0xd2, 0xf2, 0xc6, 0x1a, 0x4f, 0x1b, 0xc5, 0x2c, 0xba, 0x58, 0xa2, 0x56, 0xb8, 0x11, 0xab,
0x1d, 0x6e, 0xa0, 0xd7, 0x61, 0xd2, 0xa4, 0x53, 0x98, 0xff, 0xd6, 0xe2, 0x29, 0x38, 0xe3, 0xc6,
0x0e, 0x6d, 0x4e, 0x85, 0xdf, 0x86, 0x8a, 0x82, 0x40, 0x6f, 0x16, 0x8f, 0x9b, 0xe2, 0x60, 0x5e,
0x5b, 0x3f, 0xd8, 0x7a, 0xce, 0x2f, 0x1c, 0x35, 0x80, 0x8d, 0x66, 0xd0, 0xce, 0xe1, 0x0f, 0xc5,
0x2c, 0xe1, 0xe1, 0xaa, 0x3c, 0x5a, 0x9a, 0x3c, 0xb9, 0x57, 0x92, 0xe7, 0x14, 0xa6, 0x85, 0xfa,
0x99, 0xf6, 0xc0, 0x9b, 0x50, 0x64, 0xfc, 0xe4, 0x16, 0x98, 0x4f, 0x80, 0x95, 0xde, 0xc9, 0x09,
0xf1, 0x0c, 0x4c, 0xef, 0xfb, 0xa6, 0x3f, 0xf0, 0xe4, 0x16, 0xf8, 0x83, 0x06, 0x35, 0xd9, 0x93,
0xb5, 0xae, 0x22, 0xef, 0xa3, 0x3c, 0xe6, 0x05, 0xb7, 0xd1, 0x4b, 0x50, 0x6c, 0x1f, 0xed, 0x5b,
0x9f, 0xc8, 0xea, 0x95, 0x68, 0xd1, 0xfe, 0x2e, 0xc7, 0xe1, 0x15, 0x5e, 0xd1, 0xa2, 0x17, 0x1d,
0xd7, 0x7c, 0xe1, 0x6f, 0xd9, 0x6d, 0x72, 0xca, 0xf2, 0x89, 0x82, 0x11, 0x76, 0xb0, 0xbb, 0x89,
0xa8, 0x04, 0xb3, 0xfc, 0x4b, 0xad, 0x0c, 0xcf, 0xc2, 0x85, 0xb5, 0x81, 0xdf, 0x69, 0xda, 0xe6,
0x51, 0x57, 0x06, 0x01, 0x3c, 0x07, 0x88, 0x76, 0x6e, 0x58, 0x9e, 0xda, 0xdb, 0x84, 0x59, 0xda,
0x4b, 0x6c, 0xdf, 0x6a, 0x29, 0x11, 0x43, 0x86, 0x6d, 0x2d, 0x16, 0xb6, 0x4d, 0xcf, 0x7b, 0xe9,
0xb8, 0x6d, 0xa1, 0x5a, 0xd0, 0xc6, 0x1b, 0x9c, 0xf9, 0x33, 0x2f, 0x12, 0x98, 0xbf, 0x2a, 0x97,
0xa5, 0x90, 0xcb, 0x63, 0xe2, 0x8f, 0xe1, 0x82, 0x1f, 0xc0, 0x45, 0x49, 0x29, 0x0a, 0x16, 0x63,
0x88, 0xf7, 0xe0, 0x9a, 0x24, 0x5e, 0xef, 0xd0, 0xac, 0xfa, 0xa9, 0x00, 0xfc, 0x6f, 0xe5, 0x7c,
0x04, 0x8d, 0x40, 0x4e, 0x96, 0x69, 0x39, 0x5d, 0x55, 0x80, 0x81, 0x27, 0xf6, 0x4c, 0xd9, 0x60,
0xdf, 0xb4, 0xcf, 0x75, 0xba, 0xc1, 0x21, 0x48, 0xbf, 0xf1, 0x3a, 0xcc, 0x4b, 0x1e, 0x22, 0x07,
0x8a, 0x32, 0x19, 0x11, 0x28, 0x89, 0x89, 0x30, 0x18, 0x9d, 0x3a, 0xde, 0xec, 0x2a, 0x65, 0xd4,
0xb4, 0x8c, 0xa7, 0xa6, 0xf0, 0xbc, 0xc8, 0x77, 0x04, 0x15, 0x4c, 0x0d, 0xda, 0xa2, 0x9b, 0x32,
0x50, 0xbb, 0xc5, 0x42, 0xd0, 0xee, 0x91, 0x85, 0x18, 0x61, 0xfd, 0x11, 0x2c, 0x04, 0x42, 0x50,
0xbb, 0x3d, 0x25, 0x6e, 0xcf, 0xf2, 0x3c, 0xe5, 0xc6, 0x9d, 0xa4, 0xf8, 0x1d, 0x28, 0xf4, 0x89,
0x88, 0x29, 0x95, 0x55, 0xb4, 0xcc, 0xdf, 0x6b, 0x96, 0x95, 0xc9, 0x6c, 0x1c, 0xb7, 0xe1, 0xba,
0xe4, 0xce, 0x2d, 0x9a, 0xc8, 0x3e, 0x2e, 0x94, 0xbc, 0x8d, 0x71, 0xb3, 0x8e, 0xde, 0xc6, 0xf2,
0x7c, 0xed, 0xe5, 0x6d, 0x8c, 0x9e, 0x15, 0xaa, 0x6f, 0x65, 0x3a, 0x2b, 0xb6, 0xb9, 0x4d, 0x03,
0x97, 0xcc, 0xc4, 0xec, 0x08, 0xe6, 0xa2, 0x9e, 0x9c, 0x29, 0x8c, 0xcd, 0xc1, 0xa4, 0xef, 0x9c,
0x10, 0x19, 0xc4, 0x78, 0x43, 0x0a, 0x1c, 0xb8, 0x79, 0x26, 0x81, 0xcd, 0x90, 0x19, 0xdb, 0x92,
0x59, 0xe5, 0xa5, 0xab, 0x29, 0xf3, 0x19, 0xde, 0xc0, 0xbb, 0x70, 0x29, 0x1e, 0x26, 0x32, 0x89,
0xfc, 0x9c, 0x6f, 0xe0, 0xa4, 0x48, 0x92, 0x89, 0xef, 0xfb, 0x61, 0x30, 0x50, 0x02, 0x4a, 0x26,
0x96, 0x06, 0xe8, 0x49, 0xf1, 0xe5, 0x7f, 0xb1, 0x5f, 0x83, 0x70, 0x93, 0x89, 0x99, 0x17, 0x32,
0xcb, 0xbe, 0xfc, 0x61, 0x8c, 0xc8, 0x8f, 0x8d, 0x11, 0xc2, 0x49, 0xc2, 0x28, 0xf6, 0x35, 0x6c,
0x3a, 0x81, 0x11, 0x06, 0xd0, 0xac, 0x18, 0xf4, 0x0c, 0x09, 0x30, 0x58, 0x43, 0x6e, 0x6c, 0x35,
0xec, 0x66, 0x5a, 0x8c, 0x0f, 0xc2, 0xd8, 0x39, 0x12, 0x99, 0x33, 0x31, 0xfe, 0x10, 0x16, 0xd3,
0x83, 0x72, 0x16, 0xce, 0xf7, 0x31, 0x94, 0x83, 0x84, 0x52, 0x79, 0x4b, 0xad, 0x40, 0x69, 0x77,
0x6f, 0xff, 0xe9, 0xda, 0x7a, 0xb3, 0xae, 0xad, 0xfe, 0x2b, 0x0f, 0xb9, 0xed, 0xe7, 0xe8, 0xdb,
0x30, 0xc9, 0x5f, 0x5a, 0xc6, 0x3c, 0x44, 0xe9, 0xe3, 0xde, 0x6c, 0xf0, 0xd5, 0x4f, 0xff, 0xfc,
0xb7, 0xcf, 0x73, 0x97, 0xf0, 0x85, 0x95, 0xe1, 0x5b, 0x66, 0xb7, 0xdf, 0x31, 0x57, 0x4e, 0x86,
0x2b, 0xec, 0x4c, 0x78, 0xa8, 0xdd, 0x47, 0xcf, 0x21, 0xff, 0x74, 0xe0, 0xa3, 0xd4, 0x57, 0x2a,
0x3d, 0xfd, 0x2d, 0x07, 0xeb, 0x8c, 0xf3, 0x1c, 0x9e, 0x51, 0x39, 0xf7, 0x07, 0x3e, 0xe5, 0x3b,
0x84, 0x8a, 0xf2, 0x1c, 0x83, 0xce, 0x7d, 0xbf, 0xd2, 0xcf, 0x7f, 0xea, 0xc1, 0x98, 0xe1, 0x5d,
0xc5, 0x97, 0x55, 0x3c, 0xfe, 0x6a, 0xa4, 0xea, 0x73, 0x70, 0x6a, 0xc7, 0xf5, 0x09, 0x1f, 0x18,
0xe2, 0xfa, 0x28, 0x45, 0xfd, 0x64, 0x7d, 0xfc, 0x53, 0x9b, 0xf2, 0x75, 0xc4, 0x13, 0x52, 0xcb,
0x47, 0xd7, 0x13, 0x5e, 0x24, 0xd4, 0xda, 0xbb, 0xbe, 0x98, 0x4e, 0x20, 0x90, 0x6e, 0x30, 0xa4,
0x2b, 0xf8, 0x92, 0x8a, 0xd4, 0x0a, 0xe8, 0x1e, 0x6a, 0xf7, 0x57, 0x3b, 0x30, 0xc9, 0x2a, 0x86,
0xe8, 0x50, 0x7e, 0xe8, 0x09, 0xb5, 0xce, 0x94, 0x1d, 0x10, 0xa9, 0x35, 0xe2, 0x79, 0x86, 0x36,
0x8b, 0x6b, 0x01, 0x1a, 0x2b, 0x1a, 0x3e, 0xd4, 0xee, 0x2f, 0x69, 0x6f, 0x68, 0xab, 0x3f, 0x28,
0xc0, 0x24, 0xab, 0xd4, 0xa0, 0x3e, 0x40, 0x58, 0x83, 0x8b, 0xeb, 0x39, 0x52, 0xd5, 0x8b, 0xeb,
0x39, 0x5a, 0xbe, 0xc3, 0xd7, 0x19, 0xf2, 0x3c, 0x9e, 0x0b, 0x90, 0xd9, 0xb3, 0xf7, 0x0a, 0xab,
0xc9, 0x50, 0xb3, 0xbe, 0x84, 0x8a, 0x52, 0x4b, 0x43, 0x49, 0x1c, 0x23, 0xc5, 0xb8, 0xf8, 0x36,
0x49, 0x28, 0xc4, 0xe1, 0x9b, 0x0c, 0xf4, 0x1a, 0x6e, 0xa8, 0xc6, 0xe5, 0xb8, 0x2e, 0xa3, 0xa4,
0xc0, 0x3f, 0xd4, 0xa0, 0x16, 0xad, 0xa7, 0xa1, 0x9b, 0x09, 0xac, 0xe3, 0x65, 0x39, 0xfd, 0xd6,
0x78, 0xa2, 0x54, 0x11, 0x38, 0xfe, 0x09, 0x21, 0x7d, 0x93, 0x52, 0x0a, 0xdb, 0xa3, 0x1f, 0x69,
0x30, 0x13, 0xab, 0x92, 0xa1, 0x24, 0x88, 0x91, 0x1a, 0x9c, 0x7e, 0xfb, 0x1c, 0x2a, 0x21, 0xc9,
0x5d, 0x26, 0xc9, 0x0d, 0x7c, 0x75, 0xd4, 0x18, 0xbe, 0xd5, 0x23, 0xbe, 0x23, 0xa4, 0x59, 0xfd,
0x77, 0x1e, 0x4a, 0xeb, 0xfc, 0x67, 0x3f, 0xc8, 0x87, 0x72, 0x50, 0x79, 0x42, 0x0b, 0x49, 0x55,
0x89, 0x30, 0x65, 0xd7, 0xaf, 0xa7, 0x8e, 0x0b, 0x11, 0xee, 0x30, 0x11, 0x16, 0xf1, 0x95, 0x40,
0x04, 0xf1, 0xf3, 0xa2, 0x15, 0x7e, 0xf9, 0x5e, 0x31, 0xdb, 0x6d, 0xba, 0x24, 0xdf, 0xd7, 0xa0,
0xaa, 0x16, 0x94, 0xd0, 0x8d, 0xc4, 0x7a, 0x88, 0x5a, 0x93, 0xd2, 0xf1, 0x38, 0x12, 0x81, 0x7f,
0x8f, 0xe1, 0xdf, 0xc4, 0x0b, 0x69, 0xf8, 0x2e, 0xa3, 0x8f, 0x8a, 0xc0, 0x4b, 0x48, 0xc9, 0x22,
0x44, 0x2a, 0x54, 0xc9, 0x22, 0x44, 0x2b, 0x50, 0xe7, 0x8b, 0x30, 0x60, 0xf4, 0x54, 0x84, 0x53,
0x80, 0xb0, 0xc2, 0x84, 0x12, 0x8d, 0xab, 0x5c, 0x62, 0xe2, 0x3e, 0x38, 0x5a, 0x9c, 0x4a, 0xd8,
0x01, 0x31, 0xec, 0xae, 0xe5, 0x51, 0x5f, 0x5c, 0xfd, 0x5d, 0x01, 0x2a, 0x4f, 0x4c, 0xcb, 0xf6,
0x89, 0x6d, 0xda, 0x2d, 0x82, 0x8e, 0x61, 0x92, 0x9d, 0x52, 0xf1, 0xc0, 0xa3, 0x96, 0x7d, 0xe2,
0x81, 0x27, 0x52, 0x13, 0xc1, 0xb7, 0x19, 0xf4, 0x75, 0xac, 0x07, 0xd0, 0xbd, 0x90, 0xff, 0x0a,
0xab, 0x67, 0x50, 0x95, 0x4f, 0xa0, 0xc8, 0xeb, 0x17, 0x28, 0xc6, 0x2d, 0x52, 0xe7, 0xd0, 0xaf,
0x26, 0x0f, 0xa6, 0xee, 0x32, 0x15, 0xcb, 0x63, 0xc4, 0x14, 0xec, 0x3b, 0x00, 0x61, 0xc1, 0x2c,
0x6e, 0xdf, 0x91, 0xfa, 0x9a, 0xbe, 0x98, 0x4e, 0x20, 0x80, 0xef, 0x33, 0xe0, 0x5b, 0xf8, 0x7a,
0x22, 0x70, 0x3b, 0x98, 0x40, 0xc1, 0x5b, 0x50, 0xd8, 0x34, 0xbd, 0x0e, 0x8a, 0x1d, 0x42, 0xca,
0x2b, 0xa9, 0xae, 0x27, 0x0d, 0x09, 0xa8, 0x5b, 0x0c, 0x6a, 0x01, 0xcf, 0x27, 0x42, 0x75, 0x4c,
0x8f, 0xc6, 0x74, 0x34, 0x80, 0x29, 0xf9, 0xf2, 0x89, 0xae, 0xc5, 0x6c, 0x16, 0x7d, 0x25, 0xd5,
0x17, 0xd2, 0x86, 0x05, 0xe0, 0x12, 0x03, 0xc4, 0xf8, 0x5a, 0xb2, 0x51, 0x05, 0xf9, 0x43, 0xed,
0xfe, 0x1b, 0xda, 0xea, 0x4f, 0xea, 0x50, 0xa0, 0xf9, 0x12, 0x3d, 0x45, 0xc2, 0x6b, 0x66, 0xdc,
0xc2, 0x23, 0xc5, 0x9d, 0xb8, 0x85, 0x47, 0x6f, 0xa8, 0x09, 0xa7, 0x08, 0xfb, 0xf1, 0x23, 0x61,
0x54, 0x54, 0x63, 0x1f, 0x2a, 0xca, 0x65, 0x14, 0x25, 0x70, 0x8c, 0x96, 0x8e, 0xe2, 0xa7, 0x48,
0xc2, 0x4d, 0x16, 0x2f, 0x32, 0x50, 0x1d, 0x5f, 0x8c, 0x82, 0xb6, 0x39, 0x19, 0x45, 0xfd, 0x2e,
0x54, 0xd5, 0x5b, 0x2b, 0x4a, 0x60, 0x1a, 0xab, 0x4d, 0xc5, 0x63, 0x45, 0xd2, 0xa5, 0x37, 0xc1,
0x69, 0x82, 0x9f, 0x7a, 0x4a, 0x5a, 0x8a, 0xfe, 0x31, 0x94, 0xc4, 0x5d, 0x36, 0x49, 0xdf, 0x68,
0x35, 0x2b, 0x49, 0xdf, 0xd8, 0x45, 0x38, 0x21, 0x25, 0x61, 0xb0, 0x34, 0x67, 0x97, 0x01, 0x5a,
0x40, 0x3e, 0x26, 0x7e, 0x1a, 0x64, 0x58, 0x9f, 0x49, 0x83, 0x54, 0xee, 0x4b, 0x63, 0x21, 0x8f,
0x89, 0x2f, 0xf6, 0xb2, 0xbc, 0x8c, 0xa0, 0x14, 0x8e, 0x6a, 0x34, 0xc4, 0xe3, 0x48, 0x52, 0xb3,
0xc8, 0x10, 0x55, 0x84, 0x42, 0xf4, 0x3d, 0x80, 0xf0, 0xe2, 0x1d, 0x4f, 0x0c, 0x12, 0xab, 0x77,
0xf1, 0xc4, 0x20, 0xf9, 0xee, 0x9e, 0xe0, 0xc1, 0x21, 0x38, 0xcf, 0x64, 0x29, 0xfc, 0xcf, 0x34,
0x40, 0xa3, 0x17, 0x75, 0xf4, 0x20, 0x19, 0x22, 0xb1, 0x30, 0xa8, 0xbf, 0xf6, 0x6a, 0xc4, 0xa9,
0xd1, 0x33, 0x94, 0xab, 0xc5, 0xa6, 0xf4, 0x5f, 0x52, 0xc9, 0x3e, 0xd3, 0x60, 0x3a, 0x72, 0xd5,
0x47, 0x77, 0x52, 0xd6, 0x39, 0x56, 0x5c, 0xd4, 0xef, 0x9e, 0x4b, 0x97, 0x9a, 0x3b, 0x29, 0xbb,
0x42, 0xe6, 0x8d, 0x3f, 0xd6, 0xa0, 0x16, 0xad, 0x0f, 0xa0, 0x14, 0x80, 0x91, 0x0a, 0xa5, 0xbe,
0x74, 0x3e, 0xe1, 0x2b, 0xac, 0x56, 0x98, 0x4a, 0x7e, 0x0c, 0x25, 0x51, 0x56, 0x48, 0x72, 0x8b,
0x68, 0x81, 0x33, 0xc9, 0x2d, 0x62, 0x35, 0x89, 0x34, 0xb7, 0xa0, 0x37, 0x74, 0xc5, 0x13, 0x45,
0xf1, 0x21, 0x0d, 0x72, 0xbc, 0x27, 0xc6, 0x2a, 0x17, 0x63, 0x21, 0x43, 0x4f, 0x94, 0xa5, 0x07,
0x94, 0xc2, 0xf1, 0x1c, 0x4f, 0x8c, 0x57, 0x2e, 0xd2, 0x3c, 0x91, 0xa1, 0x2a, 0x9e, 0x18, 0x56,
0x0a, 0x92, 0x3c, 0x71, 0xa4, 0x7c, 0x9b, 0xe4, 0x89, 0xa3, 0xc5, 0x86, 0xb4, 0xb5, 0x65, 0xe0,
0x11, 0x4f, 0x9c, 0x4d, 0xa8, 0x2c, 0xa0, 0xd7, 0x52, 0x6c, 0x9a, 0x58, 0x1a, 0xd6, 0x5f, 0x7f,
0x45, 0xea, 0xf1, 0x1e, 0xc0, 0x57, 0x43, 0x7a, 0xc0, 0x2f, 0x35, 0x98, 0x4b, 0x2a, 0x4d, 0xa0,
0x14, 0xb0, 0x94, 0xba, 0xb2, 0xbe, 0xfc, 0xaa, 0xe4, 0xaf, 0x60, 0xb7, 0xc0, 0x27, 0x1e, 0xd5,
0x7f, 0xff, 0xe5, 0x82, 0xf6, 0xa7, 0x2f, 0x17, 0xb4, 0xbf, 0x7c, 0xb9, 0xa0, 0xfd, 0xfc, 0xaf,
0x0b, 0x13, 0x47, 0x45, 0xf6, 0x3f, 0x10, 0xde, 0xfa, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd1,
0x46, 0x74, 0x5f, 0x08, 0x31, 0x00, 0x00,
0x04, 0xa5, 0x79, 0xaa, 0x52, 0x2e, 0xc3, 0x2c, 0xe5, 0xd9, 0x72, 0x89, 0xe9, 0x93, 0x90, 0xb8,
0xca, 0x88, 0x2f, 0xf4, 0x2c, 0x7b, 0x9d, 0x8d, 0x44, 0xe8, 0xcd, 0xd3, 0x11, 0xfa, 0x69, 0x41,
0x6f, 0x9e, 0x46, 0xe9, 0xf1, 0x32, 0x94, 0x03, 0x9b, 0xa3, 0x29, 0x28, 0xec, 0xee, 0xed, 0x36,
0xeb, 0x13, 0x08, 0xa0, 0xb8, 0xb6, 0xbf, 0xde, 0xdc, 0xdd, 0xa8, 0x6b, 0xa8, 0x02, 0xa5, 0x8d,
0x26, 0x6f, 0xe4, 0xf0, 0x23, 0x80, 0xd0, 0xba, 0xa8, 0x04, 0xf9, 0xed, 0xe6, 0x77, 0xea, 0x13,
0x94, 0xe6, 0x79, 0xd3, 0xd8, 0xdf, 0xda, 0xdb, 0xad, 0x6b, 0x74, 0xf2, 0xba, 0xd1, 0x5c, 0x3b,
0x68, 0xd6, 0x73, 0x94, 0xe2, 0xc9, 0xde, 0x46, 0x3d, 0x8f, 0xca, 0x30, 0xf9, 0x7c, 0x6d, 0xe7,
0x59, 0xb3, 0x5e, 0xc0, 0x5f, 0x68, 0x30, 0x2d, 0xd6, 0x8b, 0xfb, 0x04, 0x7a, 0x1b, 0x8a, 0x1d,
0xe6, 0x17, 0x6c, 0x2b, 0x56, 0x56, 0xaf, 0xc6, 0x16, 0x37, 0xe2, 0x3b, 0x86, 0xa0, 0x45, 0x18,
0xf2, 0x27, 0x43, 0xaf, 0x91, 0x5b, 0xcc, 0x2f, 0x55, 0x56, 0xeb, 0xcb, 0xdc, 0x61, 0x97, 0xb7,
0xc9, 0xd9, 0x73, 0xb3, 0x3b, 0x20, 0x06, 0x1d, 0x44, 0x08, 0x0a, 0x3d, 0xc7, 0x25, 0x6c, 0xc7,
0x4e, 0x19, 0xec, 0x9b, 0x6e, 0x63, 0xb6, 0x68, 0x62, 0xb7, 0xf2, 0x06, 0x6e, 0x01, 0x3c, 0x1d,
0xf8, 0xe9, 0x9e, 0x31, 0x07, 0x93, 0x43, 0xca, 0x57, 0x78, 0x05, 0x6f, 0x30, 0x97, 0x20, 0xa6,
0x47, 0x02, 0x97, 0xa0, 0x0d, 0x74, 0x19, 0x4a, 0x7d, 0x97, 0x0c, 0x0f, 0x4f, 0x86, 0x0c, 0x63,
0xca, 0x28, 0xd2, 0xe6, 0xf6, 0x10, 0xdb, 0x50, 0x61, 0x20, 0x99, 0xf4, 0xbe, 0x17, 0x72, 0xcf,
0xb1, 0x69, 0xa3, 0xba, 0x4b, 0xbc, 0x8f, 0x00, 0x6d, 0x90, 0x2e, 0xf1, 0x49, 0x16, 0xb7, 0x57,
0xb4, 0xc9, 0x47, 0xb4, 0xf9, 0x99, 0x06, 0xb3, 0x11, 0xf6, 0x99, 0xd4, 0x6a, 0x40, 0xa9, 0xcd,
0x98, 0x71, 0x09, 0xf2, 0x86, 0x6c, 0xa2, 0x07, 0x30, 0x25, 0x04, 0xf0, 0x1a, 0xf9, 0x94, 0xd5,
0x2e, 0x71, 0x99, 0x3c, 0xfc, 0x0f, 0x0d, 0xca, 0x42, 0xd1, 0xbd, 0x3e, 0x5a, 0x83, 0x69, 0x97,
0x37, 0x0e, 0x99, 0x3e, 0x42, 0x22, 0x3d, 0x3d, 0x7a, 0x6c, 0x4e, 0x18, 0x55, 0x31, 0x85, 0x75,
0xa3, 0x6f, 0x41, 0x45, 0xb2, 0xe8, 0x0f, 0x7c, 0x61, 0xf2, 0x46, 0x94, 0x41, 0xb8, 0x73, 0x36,
0x27, 0x0c, 0x10, 0xe4, 0x4f, 0x07, 0x3e, 0x3a, 0x80, 0x39, 0x39, 0x99, 0x6b, 0x23, 0xc4, 0xc8,
0x33, 0x2e, 0x8b, 0x51, 0x2e, 0xa3, 0x4b, 0xb5, 0x39, 0x61, 0x20, 0x31, 0x5f, 0x19, 0x7c, 0x54,
0x86, 0x92, 0xe8, 0xc5, 0xff, 0xd4, 0x00, 0xa4, 0x41, 0xf7, 0xfa, 0x68, 0x03, 0x6a, 0xae, 0x68,
0x45, 0x14, 0xbe, 0x92, 0xa8, 0xb0, 0x58, 0x87, 0x09, 0x63, 0x5a, 0x4e, 0xe2, 0x2a, 0xbf, 0x0b,
0xd5, 0x80, 0x4b, 0xa8, 0xf3, 0x7c, 0x82, 0xce, 0x01, 0x87, 0x8a, 0x9c, 0x40, 0xb5, 0xfe, 0x00,
0x2e, 0x06, 0xf3, 0x13, 0xd4, 0xbe, 0x31, 0x46, 0xed, 0x80, 0xe1, 0xac, 0xe4, 0xa0, 0x2a, 0x0e,
0xf4, 0xac, 0xe1, 0xdd, 0xf8, 0xcb, 0x3c, 0x94, 0xd6, 0x9d, 0x5e, 0xdf, 0x74, 0xe9, 0x1a, 0x15,
0x5d, 0xe2, 0x0d, 0xba, 0x3e, 0x53, 0xb7, 0xb6, 0x7a, 0x33, 0x8a, 0x20, 0xc8, 0xe4, 0x5f, 0x83,
0x91, 0x1a, 0x62, 0x0a, 0x9d, 0x2c, 0x8e, 0x96, 0xdc, 0x2b, 0x4c, 0x16, 0x07, 0x8b, 0x98, 0x22,
0x7d, 0x29, 0x1f, 0xfa, 0x92, 0x0e, 0xa5, 0x21, 0x71, 0xc3, 0xe3, 0x70, 0x73, 0xc2, 0x90, 0x1d,
0xe8, 0x1e, 0xcc, 0xc4, 0x43, 0xf3, 0xa4, 0xa0, 0xa9, 0xb5, 0xa2, 0x91, 0xfc, 0x26, 0x54, 0x23,
0xe7, 0x43, 0x51, 0xd0, 0x55, 0x7a, 0xca, 0xf1, 0x70, 0x49, 0x06, 0x25, 0x7a, 0x96, 0x55, 0x37,
0x27, 0x44, 0x58, 0xc2, 0x6f, 0xc2, 0x74, 0x44, 0x57, 0x1a, 0x7e, 0x9b, 0xef, 0x3f, 0x5b, 0xdb,
0xe1, 0xb1, 0xfa, 0x31, 0x0b, 0xcf, 0x46, 0x5d, 0xa3, 0x21, 0x7f, 0xa7, 0xb9, 0xbf, 0x5f, 0xcf,
0xe1, 0x77, 0x82, 0x29, 0x22, 0xb8, 0x2b, 0x31, 0x7d, 0x42, 0x89, 0xe9, 0x9a, 0x8c, 0xe9, 0xb9,
0x30, 0xa6, 0xe7, 0x1f, 0xd5, 0xa0, 0xca, 0x0d, 0x72, 0x38, 0xb0, 0xe9, 0xb9, 0xf2, 0x6b, 0x0d,
0xe0, 0xe0, 0xd4, 0x96, 0x11, 0x67, 0x05, 0x4a, 0x2d, 0xce, 0xbc, 0xa1, 0x31, 0x07, 0xbe, 0x98,
0x68, 0x63, 0x43, 0x52, 0xa1, 0x37, 0xa1, 0xe4, 0x0d, 0x5a, 0x2d, 0xe2, 0xc9, 0xf8, 0x7e, 0x39,
0x1e, 0x43, 0x84, 0x87, 0x1b, 0x92, 0x8e, 0x4e, 0x79, 0x61, 0x5a, 0xdd, 0x01, 0x8b, 0xf6, 0xe3,
0xa7, 0x08, 0x3a, 0xfc, 0x4b, 0x0d, 0x2a, 0x4c, 0xca, 0x4c, 0x81, 0xeb, 0x2a, 0x94, 0x99, 0x0c,
0xa4, 0x2d, 0x42, 0xd7, 0x94, 0x11, 0x76, 0xa0, 0xff, 0x87, 0xb2, 0xdc, 0xb2, 0x32, 0x7a, 0x35,
0x92, 0xd9, 0xee, 0xf5, 0x8d, 0x90, 0x14, 0x6f, 0xc3, 0x05, 0x66, 0x95, 0x16, 0xcd, 0x24, 0xa5,
0x1d, 0xd5, 0x5c, 0x4b, 0x8b, 0xe5, 0x5a, 0x3a, 0x4c, 0xf5, 0x3b, 0x67, 0x9e, 0xd5, 0x32, 0xbb,
0x42, 0x8a, 0xa0, 0x8d, 0xbf, 0x0d, 0x48, 0x65, 0x96, 0x45, 0x5d, 0x3c, 0x0d, 0x95, 0x4d, 0xd3,
0xeb, 0x08, 0x91, 0xf0, 0x87, 0x50, 0xe5, 0xcd, 0x4c, 0x36, 0x44, 0x50, 0xe8, 0x98, 0x5e, 0x87,
0x09, 0x3e, 0x6d, 0xb0, 0x6f, 0x7c, 0x01, 0x66, 0xf6, 0x6d, 0xb3, 0xef, 0x75, 0x1c, 0x19, 0x5c,
0x69, 0x26, 0x5d, 0x0f, 0xfb, 0x32, 0x21, 0xde, 0x85, 0x19, 0x97, 0xf4, 0x4c, 0xcb, 0xb6, 0xec,
0xe3, 0xc3, 0xa3, 0x33, 0x9f, 0x78, 0x22, 0xd1, 0xae, 0x05, 0xdd, 0x8f, 0x68, 0x2f, 0x15, 0xed,
0xa8, 0xeb, 0x1c, 0x09, 0x17, 0x67, 0xdf, 0xf8, 0xb7, 0x1a, 0x54, 0x3f, 0x30, 0xfd, 0x96, 0xb4,
0x02, 0xda, 0x82, 0x5a, 0xe0, 0xd8, 0xac, 0x47, 0xc8, 0x12, 0x8b, 0xf0, 0x6c, 0x8e, 0x4c, 0xc1,
0x64, 0x84, 0x9f, 0x6e, 0xa9, 0x1d, 0x8c, 0x95, 0x69, 0xb7, 0x48, 0x37, 0x60, 0x95, 0x4b, 0x67,
0xc5, 0x08, 0x55, 0x56, 0x6a, 0xc7, 0xa3, 0x99, 0xf0, 0xf4, 0xe3, 0x6e, 0xf9, 0x65, 0x0e, 0xd0,
0xa8, 0x0c, 0x5f, 0x37, 0x21, 0xb8, 0x0d, 0x35, 0xcf, 0x37, 0x5d, 0xff, 0x30, 0x76, 0x0d, 0x99,
0x66, 0xbd, 0x41, 0x70, 0xba, 0x0b, 0x33, 0x7d, 0xd7, 0x39, 0x76, 0x89, 0xe7, 0x1d, 0xda, 0x8e,
0x6f, 0xbd, 0x38, 0x13, 0xd9, 0x50, 0x4d, 0x76, 0xef, 0xb2, 0x5e, 0xd4, 0x84, 0xd2, 0x0b, 0xab,
0xeb, 0x13, 0xd7, 0x6b, 0x4c, 0x2e, 0xe6, 0x97, 0x6a, 0xab, 0x0f, 0xce, 0xb3, 0xda, 0xf2, 0x7b,
0x8c, 0xfe, 0xe0, 0xac, 0x4f, 0x0c, 0x39, 0x57, 0xcd, 0x53, 0x8a, 0x91, 0x3c, 0xe5, 0x36, 0x40,
0x48, 0x4f, 0xa3, 0xd6, 0xee, 0xde, 0xd3, 0x67, 0x07, 0xf5, 0x09, 0x54, 0x85, 0xa9, 0xdd, 0xbd,
0x8d, 0xe6, 0x4e, 0x93, 0xc6, 0x35, 0xbc, 0x22, 0x6d, 0xa3, 0xda, 0x10, 0xcd, 0xc3, 0xd4, 0x4b,
0xda, 0x2b, 0xef, 0x69, 0x79, 0xa3, 0xc4, 0xda, 0x5b, 0x6d, 0xfc, 0x77, 0x0d, 0xa6, 0xc5, 0x2e,
0xc8, 0xb4, 0x15, 0x55, 0x88, 0x5c, 0x04, 0x82, 0x26, 0x45, 0x7c, 0x77, 0xb4, 0x45, 0xee, 0x25,
0x9b, 0xd4, 0xdd, 0xf9, 0x62, 0x93, 0xb6, 0x30, 0x6b, 0xd0, 0x46, 0xf7, 0xa0, 0xde, 0xe2, 0xee,
0x1e, 0x3b, 0x67, 0x8c, 0x19, 0xd1, 0x1f, 0x2c, 0xd2, 0x6d, 0x28, 0x92, 0x21, 0xb1, 0x7d, 0xaf,
0x51, 0x61, 0xb1, 0x69, 0x5a, 0x66, 0x56, 0x4d, 0xda, 0x6b, 0x88, 0x41, 0xfc, 0x7f, 0x70, 0x61,
0x87, 0xa6, 0xb6, 0x8f, 0x5d, 0xd3, 0x56, 0x93, 0xe4, 0x83, 0x83, 0x1d, 0x61, 0x95, 0xbc, 0x7f,
0xb0, 0x83, 0x6a, 0x90, 0xdb, 0xda, 0x10, 0x3a, 0xe4, 0xac, 0x0d, 0xfc, 0xa9, 0x06, 0x48, 0x9d,
0x97, 0xc9, 0x4c, 0x31, 0xe6, 0x12, 0x3e, 0x1f, 0xc2, 0xcf, 0xc1, 0x24, 0x71, 0x5d, 0xc7, 0x65,
0x06, 0x29, 0x1b, 0xbc, 0x81, 0x6f, 0x09, 0x19, 0x0c, 0x32, 0x74, 0x4e, 0x82, 0x3d, 0xcf, 0xb9,
0x69, 0x81, 0xa8, 0xdb, 0x30, 0x1b, 0xa1, 0xca, 0x14, 0x23, 0xef, 0xc2, 0x45, 0xc6, 0x6c, 0x9b,
0x90, 0xfe, 0x5a, 0xd7, 0x1a, 0xa6, 0xa2, 0xf6, 0xe1, 0x52, 0x9c, 0xf0, 0x9b, 0xb5, 0x11, 0x7e,
0x47, 0x20, 0x1e, 0x58, 0x3d, 0x72, 0xe0, 0xec, 0xa4, 0xcb, 0x46, 0x03, 0x1f, 0xbd, 0xfa, 0x8a,
0xc3, 0x84, 0x7d, 0xe3, 0xdf, 0x68, 0x70, 0x79, 0x64, 0xfa, 0x37, 0xbc, 0xaa, 0x0b, 0x00, 0xc7,
0x74, 0xfb, 0x90, 0x36, 0x1d, 0xe0, 0x97, 0x36, 0xa5, 0x27, 0x90, 0x93, 0xc6, 0x8e, 0xaa, 0x90,
0xb3, 0x03, 0xc5, 0x27, 0xac, 0x5e, 0xa2, 0x68, 0x55, 0x90, 0x5a, 0xd9, 0x66, 0x8f, 0x5f, 0xe3,
0xca, 0x06, 0xfb, 0x66, 0x47, 0x27, 0x21, 0xee, 0x33, 0x63, 0x87, 0x1f, 0xd1, 0x65, 0x23, 0x68,
0x53, 0xf4, 0x56, 0xd7, 0x22, 0xb6, 0xcf, 0x46, 0x0b, 0x6c, 0x54, 0xe9, 0xc1, 0xcb, 0x50, 0xe7,
0x48, 0x6b, 0xed, 0xb6, 0x72, 0x4c, 0x07, 0xfc, 0xb4, 0x28, 0x3f, 0xfc, 0x12, 0x2e, 0x28, 0xf4,
0x99, 0x4c, 0xf7, 0x1a, 0x14, 0x79, 0x51, 0x48, 0x9c, 0x10, 0x73, 0xd1, 0x59, 0x1c, 0xc6, 0x10,
0x34, 0xf8, 0x36, 0xcc, 0x8a, 0x1e, 0xd2, 0x73, 0x92, 0x56, 0x9d, 0xd9, 0x07, 0xef, 0xc0, 0x5c,
0x94, 0x2c, 0x93, 0x23, 0xac, 0x49, 0xd0, 0x67, 0xfd, 0xb6, 0x72, 0xe0, 0xc4, 0x17, 0x45, 0x35,
0x58, 0x2e, 0x66, 0xb0, 0x40, 0x20, 0xc9, 0x22, 0x93, 0x40, 0xb3, 0xd2, 0xfc, 0x3b, 0x96, 0x17,
0xa4, 0x15, 0x9f, 0x00, 0x52, 0x3b, 0x33, 0x2d, 0xca, 0x32, 0x94, 0xb8, 0xc1, 0x65, 0xe6, 0x9a,
0xbc, 0x2a, 0x92, 0x88, 0x0a, 0xb4, 0x41, 0x5e, 0xb8, 0xe6, 0x71, 0x8f, 0x04, 0x91, 0x95, 0xe6,
0x6b, 0x6a, 0x67, 0x26, 0x8d, 0xff, 0xa8, 0x41, 0x75, 0xad, 0x6b, 0xba, 0x3d, 0x69, 0xfc, 0x77,
0xa1, 0xc8, 0x13, 0x41, 0x71, 0x59, 0xba, 0x13, 0x65, 0xa3, 0xd2, 0xf2, 0xc6, 0x1a, 0x4f, 0x1b,
0xc5, 0x2c, 0xba, 0x58, 0xa2, 0x16, 0xb9, 0x11, 0xab, 0x4d, 0x6e, 0xa0, 0xd7, 0x61, 0xd2, 0xa4,
0x53, 0x98, 0xff, 0xd6, 0xe2, 0x29, 0x38, 0xe3, 0xc6, 0x0e, 0x6d, 0x4e, 0x85, 0xdf, 0x86, 0x8a,
0x82, 0x40, 0x6f, 0x16, 0x8f, 0x9b, 0xe2, 0x60, 0x5e, 0x5b, 0x3f, 0xd8, 0x7a, 0xce, 0x2f, 0x1c,
0x35, 0x80, 0x8d, 0x66, 0xd0, 0xce, 0xe1, 0x0f, 0xc5, 0x2c, 0xe1, 0xe1, 0xaa, 0x3c, 0x5a, 0x9a,
0x3c, 0xb9, 0x57, 0x92, 0xe7, 0x14, 0xa6, 0x85, 0xfa, 0x99, 0xf6, 0xc0, 0x9b, 0x50, 0x64, 0xfc,
0xe4, 0x16, 0x98, 0x4f, 0x80, 0x95, 0xde, 0xc9, 0x09, 0xf1, 0x0c, 0x4c, 0xef, 0xfb, 0xa6, 0x3f,
0xf0, 0xe4, 0x16, 0xf8, 0x83, 0x06, 0x35, 0xd9, 0x93, 0xb5, 0xae, 0x22, 0xef, 0xa3, 0x3c, 0xe6,
0x05, 0xb7, 0xd1, 0x4b, 0x50, 0x6c, 0x1f, 0xed, 0x5b, 0x9f, 0xc8, 0xea, 0x95, 0x68, 0xd1, 0xfe,
0x2e, 0xc7, 0xe1, 0x15, 0x64, 0xd1, 0xa2, 0x17, 0x1d, 0xd7, 0x7c, 0xe1, 0x6f, 0xd9, 0x6d, 0x72,
0xca, 0xf2, 0x89, 0x82, 0x11, 0x76, 0xb0, 0xbb, 0x89, 0xa8, 0x34, 0xb3, 0xfc, 0x4b, 0xad, 0x3c,
0xcf, 0xc2, 0x85, 0xb5, 0x81, 0xdf, 0x69, 0xda, 0xe6, 0x51, 0x57, 0x06, 0x01, 0x3c, 0x07, 0x88,
0x76, 0x6e, 0x58, 0x9e, 0xda, 0xdb, 0x84, 0x59, 0xda, 0x4b, 0x6c, 0xdf, 0x6a, 0x29, 0x11, 0x43,
0x86, 0x6d, 0x2d, 0x16, 0xb6, 0x4d, 0xcf, 0x7b, 0xe9, 0xb8, 0x6d, 0xa1, 0x5a, 0xd0, 0xc6, 0x1b,
0x9c, 0xf9, 0x33, 0x2f, 0x12, 0x98, 0xbf, 0x2e, 0x97, 0xa5, 0x90, 0xcb, 0x63, 0xe2, 0x8f, 0xe1,
0x82, 0x1f, 0xc0, 0x45, 0x49, 0x29, 0x0a, 0x16, 0x63, 0x88, 0xf7, 0xe0, 0x9a, 0x24, 0x5e, 0xef,
0xd0, 0xac, 0xfa, 0xa9, 0x00, 0xfc, 0x6f, 0xe5, 0x7c, 0x04, 0x8d, 0x40, 0x4e, 0x96, 0x69, 0x39,
0x5d, 0x55, 0x80, 0x81, 0x27, 0xf6, 0x4c, 0xd9, 0x60, 0xdf, 0xb4, 0xcf, 0x75, 0xba, 0xc1, 0x21,
0x48, 0xbf, 0xf1, 0x3a, 0xcc, 0x4b, 0x1e, 0x22, 0x07, 0x8a, 0x32, 0x19, 0x11, 0x28, 0x89, 0x89,
0x30, 0x18, 0x9d, 0x3a, 0xde, 0xec, 0x2a, 0x65, 0xd4, 0xb4, 0x8c, 0xa7, 0xa6, 0xf0, 0xbc, 0xc8,
0x77, 0x04, 0x15, 0x4c, 0x0d, 0xda, 0xa2, 0x9b, 0x32, 0x50, 0xbb, 0xc5, 0x42, 0xd0, 0xee, 0x91,
0x85, 0x18, 0x61, 0xfd, 0x11, 0x2c, 0x04, 0x42, 0x50, 0xbb, 0x3d, 0x25, 0x6e, 0xcf, 0xf2, 0x3c,
0xe5, 0xc6, 0x9d, 0xa4, 0xf8, 0x1d, 0x28, 0xf4, 0x89, 0x88, 0x29, 0x95, 0x55, 0xb4, 0xcc, 0xdf,
0x83, 0x96, 0x95, 0xc9, 0x6c, 0x1c, 0xb7, 0xe1, 0xba, 0xe4, 0xce, 0x2d, 0x9a, 0xc8, 0x3e, 0x2e,
0x94, 0xbc, 0x8d, 0x71, 0xb3, 0x8e, 0xde, 0xc6, 0xf2, 0x7c, 0xed, 0xe5, 0x6d, 0x8c, 0x9e, 0x15,
0xaa, 0x6f, 0x65, 0x3a, 0x2b, 0xb6, 0xb9, 0x4d, 0x03, 0x97, 0xcc, 0xc4, 0xec, 0x08, 0xe6, 0xa2,
0x9e, 0x9c, 0x29, 0x8c, 0xcd, 0xc1, 0xa4, 0xef, 0x9c, 0x10, 0x19, 0xc4, 0x78, 0x43, 0x0a, 0x1c,
0xb8, 0x79, 0x26, 0x81, 0xcd, 0x90, 0x19, 0xdb, 0x92, 0x59, 0xe5, 0xa5, 0xab, 0x29, 0xf3, 0x19,
0xde, 0xc0, 0xbb, 0x70, 0x29, 0x1e, 0x26, 0x32, 0x89, 0xfc, 0x9c, 0x6f, 0xe0, 0xa4, 0x48, 0x92,
0x89, 0xef, 0xfb, 0x61, 0x30, 0x50, 0x02, 0x4a, 0x26, 0x96, 0x06, 0xe8, 0x49, 0xf1, 0xe5, 0x7f,
0xb1, 0x5f, 0x83, 0x70, 0x93, 0x89, 0x99, 0x17, 0x32, 0xcb, 0xbe, 0xfc, 0x61, 0x8c, 0xc8, 0x8f,
0x8d, 0x11, 0xc2, 0x49, 0xc2, 0x28, 0xf6, 0x0d, 0x6c, 0x3a, 0x81, 0x11, 0x06, 0xd0, 0xac, 0x18,
0xf4, 0x0c, 0x09, 0x30, 0x58, 0x43, 0x6e, 0x6c, 0x35, 0xec, 0x66, 0x5a, 0x8c, 0x0f, 0xc2, 0xd8,
0x39, 0x12, 0x99, 0x33, 0x31, 0xfe, 0x10, 0x16, 0xd3, 0x83, 0x72, 0x16, 0xce, 0xf7, 0x31, 0x94,
0x83, 0x84, 0x52, 0x79, 0x4b, 0xad, 0x40, 0x69, 0x77, 0x6f, 0xff, 0xe9, 0xda, 0x7a, 0xb3, 0xae,
0xad, 0xfe, 0x2b, 0x0f, 0xb9, 0xed, 0xe7, 0xe8, 0xbb, 0x30, 0xc9, 0x5f, 0x5a, 0xc6, 0x3c, 0x44,
0xe9, 0xe3, 0xde, 0x6c, 0xf0, 0xd5, 0x4f, 0xff, 0xfc, 0xb7, 0x2f, 0x72, 0x97, 0xf0, 0x85, 0x95,
0xe1, 0x5b, 0x66, 0xb7, 0xdf, 0x31, 0x57, 0x4e, 0x86, 0x2b, 0xec, 0x4c, 0x78, 0xa8, 0xdd, 0x47,
0xcf, 0x21, 0xff, 0x74, 0xe0, 0xa3, 0xd4, 0x57, 0x2a, 0x3d, 0xfd, 0x2d, 0x07, 0xeb, 0x8c, 0xf3,
0x1c, 0x9e, 0x51, 0x39, 0xf7, 0x07, 0x3e, 0xe5, 0x3b, 0x84, 0x8a, 0xf2, 0x1c, 0x83, 0xce, 0x7d,
0xbf, 0xd2, 0xcf, 0x7f, 0xea, 0xc1, 0x98, 0xe1, 0x5d, 0xc5, 0x97, 0x55, 0x3c, 0xfe, 0x6a, 0xa4,
0xea, 0x73, 0x70, 0x6a, 0xc7, 0xf5, 0x09, 0x1f, 0x18, 0xe2, 0xfa, 0x28, 0x45, 0xfd, 0x64, 0x7d,
0xfc, 0x53, 0x9b, 0xf2, 0x75, 0xc4, 0x13, 0x52, 0xcb, 0x47, 0xd7, 0x13, 0x5e, 0x24, 0xd4, 0xda,
0xbb, 0xbe, 0x98, 0x4e, 0x20, 0x90, 0x6e, 0x30, 0xa4, 0x2b, 0xf8, 0x92, 0x8a, 0xd4, 0x0a, 0xe8,
0x1e, 0x6a, 0xf7, 0x57, 0x3b, 0x30, 0xc9, 0x2a, 0x86, 0xe8, 0x50, 0x7e, 0xe8, 0x09, 0xb5, 0xce,
0x94, 0x1d, 0x10, 0xa9, 0x35, 0xe2, 0x79, 0x86, 0x36, 0x8b, 0x6b, 0x01, 0x1a, 0x2b, 0x1a, 0x3e,
0xd4, 0xee, 0x2f, 0x69, 0x6f, 0x68, 0xab, 0x3f, 0x2a, 0xc0, 0x24, 0xab, 0xd4, 0xa0, 0x3e, 0x40,
0x58, 0x83, 0x8b, 0xeb, 0x39, 0x52, 0xd5, 0x8b, 0xeb, 0x39, 0x5a, 0xbe, 0xc3, 0xd7, 0x19, 0xf2,
0x3c, 0x9e, 0x0b, 0x90, 0xd9, 0xb3, 0xf7, 0x0a, 0xab, 0xc9, 0x50, 0xb3, 0xbe, 0x84, 0x8a, 0x52,
0x4b, 0x43, 0x49, 0x1c, 0x23, 0xc5, 0xb8, 0xf8, 0x36, 0x49, 0x28, 0xc4, 0xe1, 0x9b, 0x0c, 0xf4,
0x1a, 0x6e, 0xa8, 0xc6, 0xe5, 0xb8, 0x2e, 0xa3, 0xa4, 0xc0, 0x9f, 0x69, 0x50, 0x8b, 0xd6, 0xd3,
0xd0, 0xcd, 0x04, 0xd6, 0xf1, 0xb2, 0x9c, 0x7e, 0x6b, 0x3c, 0x51, 0xaa, 0x08, 0x1c, 0xff, 0x84,
0x90, 0xbe, 0x49, 0x29, 0x85, 0xed, 0xd1, 0x8f, 0x35, 0x98, 0x89, 0x55, 0xc9, 0x50, 0x12, 0xc4,
0x48, 0x0d, 0x4e, 0xbf, 0x7d, 0x0e, 0x95, 0x90, 0xe4, 0x2e, 0x93, 0xe4, 0x06, 0xbe, 0x3a, 0x6a,
0x0c, 0xdf, 0xea, 0x11, 0xdf, 0x11, 0xd2, 0xac, 0xfe, 0x3b, 0x0f, 0xa5, 0x75, 0xfe, 0xb3, 0x22,
0xe4, 0x43, 0x39, 0xa8, 0x3c, 0xa1, 0x85, 0xa4, 0xaa, 0x44, 0x98, 0xb2, 0xeb, 0xd7, 0x53, 0xc7,
0x85, 0x08, 0x77, 0x98, 0x08, 0x8b, 0xf8, 0x4a, 0x20, 0x82, 0xf8, 0xf9, 0xd2, 0x0a, 0xbf, 0x7c,
0xaf, 0x98, 0xed, 0x36, 0x5d, 0x92, 0x1f, 0x6a, 0x50, 0x55, 0x0b, 0x4a, 0xe8, 0x46, 0x62, 0x3d,
0x44, 0xad, 0x49, 0xe9, 0x78, 0x1c, 0x89, 0xc0, 0xbf, 0xc7, 0xf0, 0x6f, 0xe2, 0x85, 0x34, 0x7c,
0x97, 0xd1, 0x47, 0x45, 0xe0, 0x25, 0xa4, 0x64, 0x11, 0x22, 0x15, 0xaa, 0x64, 0x11, 0xa2, 0x15,
0xa8, 0xf3, 0x45, 0x18, 0x30, 0x7a, 0x2a, 0xc2, 0x29, 0x40, 0x58, 0x61, 0x42, 0x89, 0xc6, 0x55,
0x2e, 0x31, 0x71, 0x1f, 0x1c, 0x2d, 0x4e, 0x25, 0xec, 0x80, 0x18, 0x76, 0xd7, 0xf2, 0xa8, 0x2f,
0xae, 0xfe, 0xae, 0x00, 0x95, 0x27, 0xa6, 0x65, 0xfb, 0xc4, 0x36, 0xed, 0x16, 0x41, 0xc7, 0x30,
0xc9, 0x4e, 0xa9, 0x78, 0xe0, 0x51, 0xcb, 0x3e, 0xf1, 0xc0, 0x13, 0xa9, 0x89, 0xe0, 0xdb, 0x0c,
0xfa, 0x3a, 0xd6, 0x03, 0xe8, 0x5e, 0xc8, 0x7f, 0x85, 0xd5, 0x33, 0xa8, 0xca, 0x27, 0x50, 0xe4,
0xf5, 0x0b, 0x14, 0xe3, 0x16, 0xa9, 0x73, 0xe8, 0x57, 0x93, 0x07, 0x53, 0x77, 0x99, 0x8a, 0xe5,
0x31, 0x62, 0x0a, 0xf6, 0x3d, 0x80, 0xb0, 0x60, 0x16, 0xb7, 0xef, 0x48, 0x7d, 0x4d, 0x5f, 0x4c,
0x27, 0x10, 0xc0, 0xf7, 0x19, 0xf0, 0x2d, 0x7c, 0x3d, 0x11, 0xb8, 0x1d, 0x4c, 0xa0, 0xe0, 0x2d,
0x28, 0x6c, 0x9a, 0x5e, 0x07, 0xc5, 0x0e, 0x21, 0xe5, 0x95, 0x54, 0xd7, 0x93, 0x86, 0x04, 0xd4,
0x2d, 0x06, 0xb5, 0x80, 0xe7, 0x13, 0xa1, 0x3a, 0xa6, 0x47, 0x63, 0x3a, 0x1a, 0xc0, 0x94, 0x7c,
0xf9, 0x44, 0xd7, 0x62, 0x36, 0x8b, 0xbe, 0x92, 0xea, 0x0b, 0x69, 0xc3, 0x02, 0x70, 0x89, 0x01,
0x62, 0x7c, 0x2d, 0xd9, 0xa8, 0x82, 0xfc, 0xa1, 0x76, 0xff, 0x0d, 0x6d, 0xf5, 0xa7, 0x75, 0x28,
0xd0, 0x7c, 0x89, 0x9e, 0x22, 0xe1, 0x35, 0x33, 0x6e, 0xe1, 0x91, 0xe2, 0x4e, 0xdc, 0xc2, 0xa3,
0x37, 0xd4, 0x84, 0x53, 0x84, 0xfd, 0xb8, 0x92, 0x30, 0x2a, 0xaa, 0xb1, 0x0f, 0x15, 0xe5, 0x32,
0x8a, 0x12, 0x38, 0x46, 0x4b, 0x47, 0xf1, 0x53, 0x24, 0xe1, 0x26, 0x8b, 0x17, 0x19, 0xa8, 0x8e,
0x2f, 0x46, 0x41, 0xdb, 0x9c, 0x8c, 0xa2, 0x7e, 0x1f, 0xaa, 0xea, 0xad, 0x15, 0x25, 0x30, 0x8d,
0xd5, 0xa6, 0xe2, 0xb1, 0x22, 0xe9, 0xd2, 0x9b, 0xe0, 0x34, 0xc1, 0x4f, 0x49, 0x25, 0x2d, 0x45,
0xff, 0x18, 0x4a, 0xe2, 0x2e, 0x9b, 0xa4, 0x6f, 0xb4, 0x9a, 0x95, 0xa4, 0x6f, 0xec, 0x22, 0x9c,
0x90, 0x92, 0x30, 0x58, 0x9a, 0xb3, 0xcb, 0x00, 0x2d, 0x20, 0x1f, 0x13, 0x3f, 0x0d, 0x32, 0xac,
0xcf, 0xa4, 0x41, 0x2a, 0xf7, 0xa5, 0xb1, 0x90, 0xc7, 0xc4, 0x17, 0x7b, 0x59, 0x5e, 0x46, 0x50,
0x0a, 0x47, 0x35, 0x1a, 0xe2, 0x71, 0x24, 0xa9, 0x59, 0x64, 0x88, 0x2a, 0x42, 0x21, 0xfa, 0x01,
0x40, 0x78, 0xf1, 0x8e, 0x27, 0x06, 0x89, 0xd5, 0xbb, 0x78, 0x62, 0x90, 0x7c, 0x77, 0x4f, 0xf0,
0xe0, 0x10, 0x9c, 0x67, 0xb2, 0x14, 0xfe, 0xe7, 0x1a, 0xa0, 0xd1, 0x8b, 0x3a, 0x7a, 0x90, 0x0c,
0x91, 0x58, 0x18, 0xd4, 0x5f, 0x7b, 0x35, 0xe2, 0xd4, 0xe8, 0x19, 0xca, 0xd5, 0x62, 0x53, 0xfa,
0x2f, 0xa9, 0x64, 0x9f, 0x6b, 0x30, 0x1d, 0xb9, 0xea, 0xa3, 0x3b, 0x29, 0xeb, 0x1c, 0x2b, 0x2e,
0xea, 0x77, 0xcf, 0xa5, 0x4b, 0xcd, 0x9d, 0x94, 0x5d, 0x21, 0xf3, 0xc6, 0x9f, 0x68, 0x50, 0x8b,
0xd6, 0x07, 0x50, 0x0a, 0xc0, 0x48, 0x85, 0x52, 0x5f, 0x3a, 0x9f, 0xf0, 0x15, 0x56, 0x2b, 0x4c,
0x25, 0x3f, 0x86, 0x92, 0x28, 0x2b, 0x24, 0xb9, 0x45, 0xb4, 0xc0, 0x99, 0xe4, 0x16, 0xb1, 0x9a,
0x44, 0x9a, 0x5b, 0xd0, 0x1b, 0xba, 0xe2, 0x89, 0xa2, 0xf8, 0x90, 0x06, 0x39, 0xde, 0x13, 0x63,
0x95, 0x8b, 0xb1, 0x90, 0xa1, 0x27, 0xca, 0xd2, 0x03, 0x4a, 0xe1, 0x78, 0x8e, 0x27, 0xc6, 0x2b,
0x17, 0x69, 0x9e, 0xc8, 0x50, 0x15, 0x4f, 0x0c, 0x2b, 0x05, 0x49, 0x9e, 0x38, 0x52, 0xbe, 0x4d,
0xf2, 0xc4, 0xd1, 0x62, 0x43, 0xda, 0xda, 0x32, 0xf0, 0x88, 0x27, 0xce, 0x26, 0x54, 0x16, 0xd0,
0x6b, 0x29, 0x36, 0x4d, 0x2c, 0x0d, 0xeb, 0xaf, 0xbf, 0x22, 0xf5, 0x78, 0x0f, 0xe0, 0xab, 0x21,
0x3d, 0xe0, 0x57, 0x1a, 0xcc, 0x25, 0x95, 0x26, 0x50, 0x0a, 0x58, 0x4a, 0x5d, 0x59, 0x5f, 0x7e,
0x55, 0xf2, 0x57, 0xb0, 0x5b, 0xe0, 0x13, 0x8f, 0xea, 0xbf, 0xff, 0x6a, 0x41, 0xfb, 0xd3, 0x57,
0x0b, 0xda, 0x5f, 0xbe, 0x5a, 0xd0, 0x7e, 0xf1, 0xd7, 0x85, 0x89, 0xa3, 0x22, 0xfb, 0x1f, 0x0e,
0x6f, 0xfd, 0x27, 0x00, 0x00, 0xff, 0xff, 0x17, 0x62, 0x2c, 0x4e, 0x68, 0x31, 0x00, 0x00,
}

View File

@ -390,6 +390,14 @@ message RangeRequest {
// max_mod_revision is the upper bound for returned key mod revisions; all keys with
// greater mod revisions will be filtered away.
int64 max_mod_revision = 11;
// min_create_revision is the lower bound for returned key create revisions; all keys with
// lesser create trevisions will be filtered away.
int64 min_create_revision = 12;
// max_create_revision is the upper bound for returned key create revisions; all keys with
// greater create revisions will be filtered away.
int64 max_create_revision = 13;
}
message RangeResponse {

View File

@ -896,6 +896,37 @@ func TestV3RangeRequest(t *testing.T) {
},
[]bool{false, false, false, false},
},
// min/max create rev
{
[]string{"rev2", "rev3", "rev2", "rev2", "rev6", "rev3"},
[]pb.RangeRequest{
{
Key: []byte{0}, RangeEnd: []byte{0},
MinCreateRevision: 3,
},
{
Key: []byte{0}, RangeEnd: []byte{0},
MaxCreateRevision: 3,
},
{
Key: []byte{0}, RangeEnd: []byte{0},
MinCreateRevision: 3,
MaxCreateRevision: 5,
},
{
Key: []byte{0}, RangeEnd: []byte{0},
MaxCreateRevision: 10,
},
},
[][]string{
{"rev3", "rev6"},
{"rev2", "rev3"},
{"rev3"},
{"rev2", "rev3", "rev6"},
},
[]bool{false, false, false, false},
},
}
for i, tt := range tests {