From d6c79a9c2fd048c66c38e6199ad87d362d048bf6 Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Wed, 27 Nov 2024 17:51:46 +0800 Subject: [PATCH 01/18] [opt] optimize point queries in join operators, don't build hashtable if build side has only 1 row --- pkg/sql/colexec/dedupjoin/join.go | 116 ++++++++++++++----- pkg/sql/colexec/hashmap_util/hashmap_util.go | 17 ++- pkg/sql/plan/bind_insert.go | 2 +- 3 files changed, 93 insertions(+), 42 deletions(-) diff --git a/pkg/sql/colexec/dedupjoin/join.go b/pkg/sql/colexec/dedupjoin/join.go index 8baa99369be9c..49de0f62e6945 100644 --- a/pkg/sql/colexec/dedupjoin/join.go +++ b/pkg/sql/colexec/dedupjoin/join.go @@ -164,7 +164,7 @@ func (dedupJoin *DedupJoin) build(analyzer process.Analyzer, proc *process.Proce if dedupJoin.OnDuplicateAction != plan.Node_UPDATE { ctr.matched.InitWithSize(ctr.batchRowCount) } else { - ctr.matched.InitWithSize(int64(ctr.mp.GetGroupCount()) + 1) + ctr.matched.InitWithSize(int64(ctr.mp.GetGroupCount())) } } return @@ -194,10 +194,27 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { } } - if ap.OnDuplicateAction != plan.Node_UPDATE { + if ap.OnDuplicateAction != plan.Node_UPDATE || ctr.mp.HashOnUnique() { if ctr.matched.Count() == 0 { - ap.ctr.buf = ctr.batches - ctr.batches = nil + ap.ctr.buf = make([]*batch.Batch, len(ctr.batches)) + for i := range ap.ctr.buf { + ap.ctr.buf[i] = batch.NewWithSize(len(ap.Result)) + batSize := ctr.batches[i].RowCount() + for j, rp := range ap.Result { + if rp.Rel == 1 { + ap.ctr.buf[i].Vecs[j] = vector.NewVec(ap.RightTypes[rp.Pos]) + if err := ap.ctr.buf[i].Vecs[j].UnionBatch(ctr.batches[i].Vecs[rp.Pos], 0, batSize, nil, proc.Mp()); err != nil { + return err + } + } else { + ap.ctr.buf[i].Vecs[j] = vector.NewVec(ap.LeftTypes[rp.Pos]) + if err := vector.AppendMultiFixed(ap.ctr.buf[i].Vecs[j], 0, true, batSize, proc.Mp()); err != nil { + return err + } + } + } + ap.ctr.buf[i].SetRowCount(batSize) + } return nil } @@ -293,7 +310,7 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { ctr.joinBat1, ctr.cfs1 = colexec.NewJoinBatch(ctr.batches[0], proc.Mp()) bitmapLen := uint64(ctr.matched.Len()) - for i := uint64(1); i < bitmapLen; i++ { + for i := uint64(0); i < bitmapLen; i++ { if ctr.matched.Contains(i) { continue } @@ -309,41 +326,55 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { } } - sels = ctr.mp.GetSels(i) + sels = ctr.mp.GetSels(i + 1) idx1, idx2 := sels[0]/colexec.DefaultBatchSize, sels[0]%colexec.DefaultBatchSize - err := colexec.SetJoinBatchValues(ctr.joinBat1, ctr.batches[idx1], int64(idx2), 1, ctr.cfs1) - if err != nil { - return err - } - - for _, sel := range sels[1:] { - idx1, idx2 = sel/colexec.DefaultBatchSize, sel%colexec.DefaultBatchSize - err = colexec.SetJoinBatchValues(ctr.joinBat2, ctr.batches[idx1], int64(idx2), 1, ctr.cfs2) + if len(sels) == 1 { + for j, rp := range ap.Result { + if rp.Rel == 1 { + if err := ap.ctr.buf[batIdx].Vecs[j].UnionOne(ctr.batches[idx1].Vecs[rp.Pos], int64(idx2), proc.Mp()); err != nil { + return err + } + } else { + if err := ap.ctr.buf[batIdx].Vecs[j].UnionNull(proc.Mp()); err != nil { + return err + } + } + } + } else { + err := colexec.SetJoinBatchValues(ctr.joinBat1, ctr.batches[idx1], int64(idx2), 1, ctr.cfs1) if err != nil { return err } - vecs := make([]*vector.Vector, len(ctr.exprExecs)) - for j, exprExec := range ctr.exprExecs { - vecs[j], err = exprExec.Eval(proc, []*batch.Batch{ctr.joinBat1, ctr.joinBat2}, nil) + for _, sel := range sels[1:] { + idx1, idx2 = sel/colexec.DefaultBatchSize, sel%colexec.DefaultBatchSize + err = colexec.SetJoinBatchValues(ctr.joinBat2, ctr.batches[idx1], int64(idx2), 1, ctr.cfs2) if err != nil { return err } - } - for j, pos := range ap.UpdateColIdxList { - ctr.joinBat1.Vecs[pos] = vecs[j] - } - } + vecs := make([]*vector.Vector, len(ctr.exprExecs)) + for j, exprExec := range ctr.exprExecs { + vecs[j], err = exprExec.Eval(proc, []*batch.Batch{ctr.joinBat1, ctr.joinBat2}, nil) + if err != nil { + return err + } + } - for j, rp := range ap.Result { - if rp.Rel == 1 { - if err := ap.ctr.buf[batIdx].Vecs[j].UnionOne(ctr.joinBat1.Vecs[rp.Pos], 0, proc.Mp()); err != nil { - return err + for j, pos := range ap.UpdateColIdxList { + ctr.joinBat1.Vecs[pos] = vecs[j] } - } else { - if err := ap.ctr.buf[batIdx].Vecs[j].UnionNull(proc.Mp()); err != nil { - return err + } + + for j, rp := range ap.Result { + if rp.Rel == 1 { + if err := ap.ctr.buf[batIdx].Vecs[j].UnionOne(ctr.joinBat1.Vecs[rp.Pos], 0, proc.Mp()); err != nil { + return err + } + } else { + if err := ap.ctr.buf[batIdx].Vecs[j].UnionNull(proc.Mp()); err != nil { + return err + } } } } @@ -428,8 +459,8 @@ func (ctr *container) probe(bat *batch.Batch, ap *DedupJoin, proc *process.Proce return err } - sels := ctr.mp.GetSels(vals[k]) - for _, sel := range sels { + if ctr.mp.HashOnUnique() { + sel := vals[k] - 1 idx1, idx2 := sel/colexec.DefaultBatchSize, sel%colexec.DefaultBatchSize err = colexec.SetJoinBatchValues(ctr.joinBat2, ctr.batches[idx1], int64(idx2), 1, ctr.cfs2) if err != nil { @@ -447,6 +478,27 @@ func (ctr *container) probe(bat *batch.Batch, ap *DedupJoin, proc *process.Proce for j, pos := range ap.UpdateColIdxList { ctr.joinBat1.Vecs[pos] = vecs[j] } + } else { + sels := ctr.mp.GetSels(vals[k]) + for _, sel := range sels { + idx1, idx2 := sel/colexec.DefaultBatchSize, sel%colexec.DefaultBatchSize + err = colexec.SetJoinBatchValues(ctr.joinBat2, ctr.batches[idx1], int64(idx2), 1, ctr.cfs2) + if err != nil { + return err + } + + vecs := make([]*vector.Vector, len(ctr.exprExecs)) + for j, exprExec := range ctr.exprExecs { + vecs[j], err = exprExec.Eval(proc, []*batch.Batch{ctr.joinBat1, ctr.joinBat2}, nil) + if err != nil { + return err + } + } + + for j, pos := range ap.UpdateColIdxList { + ctr.joinBat1.Vecs[pos] = vecs[j] + } + } } for j, rp := range ap.Result { @@ -461,7 +513,7 @@ func (ctr *container) probe(bat *batch.Batch, ap *DedupJoin, proc *process.Proce } } - ctr.matched.Add(vals[k]) + ctr.matched.Add(vals[k] - 1) rowCntInc++ } } diff --git a/pkg/sql/colexec/hashmap_util/hashmap_util.go b/pkg/sql/colexec/hashmap_util/hashmap_util.go index 7b1562382d666..75237909605b2 100644 --- a/pkg/sql/colexec/hashmap_util/hashmap_util.go +++ b/pkg/sql/colexec/hashmap_util/hashmap_util.go @@ -370,16 +370,15 @@ func (hb *HashmapBuilder) BuildHashmap(hashOnPK bool, needAllocateSels bool, nee // if groupcount == inputrowcount, it means building hashmap on unique rows // we can free sels now - if !hb.IsDedup { - if hb.keyWidth <= 8 { - if hb.InputBatchRowCount == int(hb.IntHashMap.GroupCount()) { - hb.MultiSels.Free() - } - } else { - if hb.InputBatchRowCount == int(hb.StrHashMap.GroupCount()) { - hb.MultiSels.Free() - } + if hb.keyWidth <= 8 { + if hb.InputBatchRowCount == int(hb.IntHashMap.GroupCount()) { + hb.MultiSels.Free() + } + } else { + if hb.InputBatchRowCount == int(hb.StrHashMap.GroupCount()) { + hb.MultiSels.Free() } } + return nil } diff --git a/pkg/sql/plan/bind_insert.go b/pkg/sql/plan/bind_insert.go index 19cc5ed3d28fc..39bdb93b65c6d 100644 --- a/pkg/sql/plan/bind_insert.go +++ b/pkg/sql/plan/bind_insert.go @@ -237,7 +237,7 @@ func (builder *QueryBuilder) appendDedupAndMultiUpdateNodesForBindInsert( // handle primary/unique key confliction if builder.canSkipDedup(dmlCtx.tableDefs[0]) { - // load do not handle primary/unique key confliction + // restore/load do not handle primary/unique key confliction for i, idxDef := range tableDef.Indexes { if !idxDef.TableExist || skipUniqueIdx[i] { continue From c64e1e3369b2f956c33bef73f76080841020c20b Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Thu, 28 Nov 2024 12:26:41 +0800 Subject: [PATCH 02/18] optimize DML point query --- pkg/container/batch/batch.go | 5 +- pkg/sql/colexec/dedupjoin/join.go | 96 ++++++++++++++++++-- pkg/sql/colexec/hashmap_util/hashmap_util.go | 13 +++ pkg/vm/message/joinMapMsg.go | 15 ++- 4 files changed, 117 insertions(+), 12 deletions(-) diff --git a/pkg/container/batch/batch.go b/pkg/container/batch/batch.go index b4404866b9a9c..005de5055ee49 100644 --- a/pkg/container/batch/batch.go +++ b/pkg/container/batch/batch.go @@ -18,14 +18,13 @@ import ( "bytes" "context" "fmt" - "github.com/matrixorigin/matrixone/pkg/common/bitmap" - - "github.com/matrixorigin/matrixone/pkg/sql/colexec/aggexec" + "github.com/matrixorigin/matrixone/pkg/common/bitmap" "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/common/mpool" "github.com/matrixorigin/matrixone/pkg/container/types" "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/aggexec" ) func New(attrs []string) *Batch { diff --git a/pkg/sql/colexec/dedupjoin/join.go b/pkg/sql/colexec/dedupjoin/join.go index 49de0f62e6945..b03e80e501aef 100644 --- a/pkg/sql/colexec/dedupjoin/join.go +++ b/pkg/sql/colexec/dedupjoin/join.go @@ -199,7 +199,7 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { ap.ctr.buf = make([]*batch.Batch, len(ctr.batches)) for i := range ap.ctr.buf { ap.ctr.buf[i] = batch.NewWithSize(len(ap.Result)) - batSize := ctr.batches[i].RowCount() + batSize := ctr.batches[i].Vecs[0].Length() for j, rp := range ap.Result { if rp.Rel == 1 { ap.ctr.buf[i].Vecs[j] = vector.NewVec(ap.RightTypes[rp.Pos]) @@ -213,6 +213,7 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { } } } + ap.ctr.buf[i].SetRowCount(batSize) } @@ -398,17 +399,100 @@ func (ctr *container) probe(bat *batch.Batch, ap *DedupJoin, proc *process.Proce if err != nil { return err } - if ctr.joinBat1 == nil { - ctr.joinBat1, ctr.cfs1 = colexec.NewJoinBatch(bat, proc.Mp()) + + if ap.OnDuplicateAction == plan.Node_UPDATE { + if ctr.joinBat1 == nil { + ctr.joinBat1, ctr.cfs1 = colexec.NewJoinBatch(bat, proc.Mp()) + } + if ctr.joinBat2 == nil && ctr.batchRowCount > 0 { + ctr.joinBat2, ctr.cfs2 = colexec.NewJoinBatch(ctr.batches[0], proc.Mp()) + } } - if ctr.joinBat2 == nil && ctr.batchRowCount > 0 { - ctr.joinBat2, ctr.cfs2 = colexec.NewJoinBatch(ctr.batches[0], proc.Mp()) + + isPessimistic := proc.GetTxnOperator().Txn().IsPessimistic() + + if ctr.mp.IsPointQuery() { + switch ap.OnDuplicateAction { + case plan.Node_FAIL: + // do nothing for txn.mode = Optimistic + if !isPessimistic { + break + } + + var rowStr string + if len(ap.DedupColTypes) == 1 { + if ap.DedupColName == catalog.IndexTableIndexColName { + if ctr.vecs[0].GetType().Oid == types.T_varchar { + t, _, schema, err := types.DecodeTuple(ctr.vecs[0].GetBytesAt(0)) + if err == nil && len(schema) > 1 { + rowStr = t.ErrString(make([]int32, len(schema))) + } + } + } + + if len(rowStr) == 0 { + rowStr = ctr.vecs[0].RowToString(0) + } + } else { + rowItems, err := types.StringifyTuple(ctr.vecs[0].GetBytesAt(0), ap.DedupColTypes) + if err != nil { + return err + } + rowStr = "(" + strings.Join(rowItems, ",") + ")" + } + return moerr.NewDuplicateEntry(proc.Ctx, rowStr, ap.DedupColName) + + case plan.Node_IGNORE: + ctr.matched.Add(0) + + case plan.Node_UPDATE: + err := colexec.SetJoinBatchValues(ctr.joinBat1, bat, 0, 1, ctr.cfs1) + if err != nil { + return err + } + + err = colexec.SetJoinBatchValues(ctr.joinBat2, ctr.batches[0], 0, 1, ctr.cfs2) + if err != nil { + return err + } + + vecs := make([]*vector.Vector, len(ctr.exprExecs)) + for j, exprExec := range ctr.exprExecs { + vecs[j], err = exprExec.Eval(proc, []*batch.Batch{ctr.joinBat1, ctr.joinBat2}, nil) + if err != nil { + return err + } + } + + for j, pos := range ap.UpdateColIdxList { + ctr.joinBat1.Vecs[pos] = vecs[j] + } + + for j, rp := range ap.Result { + if rp.Rel == 1 { + if err := ctr.rbat.Vecs[j].UnionOne(ctr.joinBat1.Vecs[rp.Pos], 0, proc.Mp()); err != nil { + return err + } + } else { + if err := ctr.rbat.Vecs[j].UnionOne(bat.Vecs[rp.Pos], 0, proc.Mp()); err != nil { + return err + } + } + } + + ctr.matched.Add(0) + } + + ctr.rbat.AddRowCount(1) + result.Batch = ctr.rbat + ap.ctr.lastPos = 0 + + return nil } rowCntInc := 0 count := bat.RowCount() itr := ctr.mp.NewIterator() - isPessimistic := proc.GetTxnOperator().Txn().IsPessimistic() for i := 0; i < count; i += hashmap.UnitLimit { n := count - i if n > hashmap.UnitLimit { diff --git a/pkg/sql/colexec/hashmap_util/hashmap_util.go b/pkg/sql/colexec/hashmap_util/hashmap_util.go index 75237909605b2..2537a533fd1f3 100644 --- a/pkg/sql/colexec/hashmap_util/hashmap_util.go +++ b/pkg/sql/colexec/hashmap_util/hashmap_util.go @@ -189,6 +189,19 @@ func (hb *HashmapBuilder) BuildHashmap(hashOnPK bool, needAllocateSels bool, nee return err } + if hb.IsDedup && hb.InputBatchRowCount == 1 && needUniqueVec { + hb.UniqueJoinKeys = make([]*vector.Vector, len(hb.executor)) + for i, vec := range hb.vecs[0] { + hb.UniqueJoinKeys[i] = vector.NewVec(*vec.GetType()) + err = hb.UniqueJoinKeys[i].UnionOne(vec, 0, proc.Mp()) + if err != nil { + return err + } + } + + return nil + } + var itr hashmap.Iterator if hb.keyWidth <= 8 { if hb.IntHashMap, err = hashmap.NewIntHashMap(false); err != nil { diff --git a/pkg/vm/message/joinMapMsg.go b/pkg/vm/message/joinMapMsg.go index 5c1ffd5545065..9a8cfc2f65eb6 100644 --- a/pkg/vm/message/joinMapMsg.go +++ b/pkg/vm/message/joinMapMsg.go @@ -78,15 +78,19 @@ type JoinMap struct { func NewJoinMap(sels JoinSels, ihm *hashmap.IntHashMap, shm *hashmap.StrHashMap, batches []*batch.Batch, m *mpool.MPool) *JoinMap { return &JoinMap{ + valid: true, shm: shm, ihm: ihm, + mpool: m, multiSels: sels, batches: batches, - mpool: m, - valid: true, } } +func (jm *JoinMap) IsPointQuery() bool { + return jm.runtimeFilter_In && jm.shm == nil && jm.ihm == nil +} + func (jm *JoinMap) GetBatches() []*batch.Batch { if jm == nil { return nil @@ -115,8 +119,13 @@ func (jm *JoinMap) GetRowCount() int64 { func (jm *JoinMap) GetGroupCount() uint64 { if jm.ihm != nil { return jm.ihm.GroupCount() + } else if jm.shm != nil { + return jm.shm.GroupCount() + } else if jm.runtimeFilter_In { + return 1 } - return jm.shm.GroupCount() + + return 0 } func (jm *JoinMap) SetPushedRuntimeFilterIn(b bool) { From e8574ea6eaabdb7c2b0ebb3dc512a6d5acfb997b Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Thu, 28 Nov 2024 19:16:18 +0800 Subject: [PATCH 03/18] use off-heap memory --- pkg/sql/colexec/dedupjoin/join.go | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/pkg/sql/colexec/dedupjoin/join.go b/pkg/sql/colexec/dedupjoin/join.go index b03e80e501aef..2a35c509b2849 100644 --- a/pkg/sql/colexec/dedupjoin/join.go +++ b/pkg/sql/colexec/dedupjoin/join.go @@ -196,18 +196,17 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { if ap.OnDuplicateAction != plan.Node_UPDATE || ctr.mp.HashOnUnique() { if ctr.matched.Count() == 0 { + //ap.ctr.buf = ctr.batches ap.ctr.buf = make([]*batch.Batch, len(ctr.batches)) for i := range ap.ctr.buf { - ap.ctr.buf[i] = batch.NewWithSize(len(ap.Result)) + ap.ctr.buf[i] = batch.NewOffHeapWithSize(len(ap.Result)) batSize := ctr.batches[i].Vecs[0].Length() for j, rp := range ap.Result { if rp.Rel == 1 { - ap.ctr.buf[i].Vecs[j] = vector.NewVec(ap.RightTypes[rp.Pos]) - if err := ap.ctr.buf[i].Vecs[j].UnionBatch(ctr.batches[i].Vecs[rp.Pos], 0, batSize, nil, proc.Mp()); err != nil { - return err - } + ap.ctr.buf[i].SetVector(int32(j), ctr.batches[i].Vecs[rp.Pos]) + ctr.batches[i].Vecs[rp.Pos] = nil } else { - ap.ctr.buf[i].Vecs[j] = vector.NewVec(ap.LeftTypes[rp.Pos]) + ap.ctr.buf[i].Vecs[j] = vector.NewOffHeapVecWithType(ap.LeftTypes[rp.Pos]) if err := vector.AppendMultiFixed(ap.ctr.buf[i].Vecs[j], 0, true, batSize, proc.Mp()); err != nil { return err } @@ -243,10 +242,10 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { newSels = sels[i*colexec.DefaultBatchSize:] } - ap.ctr.buf[i] = batch.NewWithSize(len(ap.Result)) + ap.ctr.buf[i] = batch.NewOffHeapWithSize(len(ap.Result)) for j, rp := range ap.Result { if rp.Rel == 1 { - ap.ctr.buf[i].Vecs[j] = vector.NewVec(ap.RightTypes[rp.Pos]) + ap.ctr.buf[i].Vecs[j] = vector.NewOffHeapVecWithType(ap.RightTypes[rp.Pos]) for _, sel := range newSels { idx1, idx2 := sel/colexec.DefaultBatchSize, sel%colexec.DefaultBatchSize if err := ap.ctr.buf[i].Vecs[j].UnionOne(ctr.batches[idx1].Vecs[rp.Pos], int64(idx2), proc.Mp()); err != nil { @@ -254,7 +253,7 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { } } } else { - ap.ctr.buf[i].Vecs[j] = vector.NewVec(ap.LeftTypes[rp.Pos]) + ap.ctr.buf[i].Vecs[j] = vector.NewOffHeapVecWithType(ap.LeftTypes[rp.Pos]) if err := vector.AppendMultiFixed(ap.ctr.buf[i].Vecs[j], 0, true, len(newSels), proc.Mp()); err != nil { return err } @@ -281,10 +280,10 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { batSize = len(sels) - fillCnt } - ap.ctr.buf[batIdx] = batch.NewWithSize(len(ap.Result)) + ap.ctr.buf[batIdx] = batch.NewOffHeapWithSize(len(ap.Result)) for i, rp := range ap.Result { if rp.Rel == 1 { - ap.ctr.buf[batIdx].Vecs[i] = vector.NewVec(ap.RightTypes[rp.Pos]) + ap.ctr.buf[batIdx].Vecs[i] = vector.NewOffHeapVecWithType(ap.RightTypes[rp.Pos]) for _, sel := range sels[fillCnt : fillCnt+batSize] { idx1, idx2 := sel/colexec.DefaultBatchSize, sel%colexec.DefaultBatchSize if err := ap.ctr.buf[batIdx].Vecs[i].UnionOne(ctr.batches[idx1].Vecs[rp.Pos], int64(idx2), proc.Mp()); err != nil { @@ -292,7 +291,7 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { } } } else { - ap.ctr.buf[batIdx].Vecs[i] = vector.NewVec(ap.LeftTypes[rp.Pos]) + ap.ctr.buf[batIdx].Vecs[i] = vector.NewOffHeapVecWithType(ap.LeftTypes[rp.Pos]) if err := vector.AppendMultiFixed(ap.ctr.buf[batIdx].Vecs[i], 0, true, batSize, proc.Mp()); err != nil { return err } @@ -317,12 +316,12 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { } if rowIdx == 0 { - ap.ctr.buf[batIdx] = batch.NewWithSize(len(ap.Result)) + ap.ctr.buf[batIdx] = batch.NewOffHeapWithSize(len(ap.Result)) for i, rp := range ap.Result { if rp.Rel == 1 { - ap.ctr.buf[batIdx].Vecs[i] = vector.NewVec(ap.RightTypes[rp.Pos]) + ap.ctr.buf[batIdx].Vecs[i] = vector.NewOffHeapVecWithType(ap.RightTypes[rp.Pos]) } else { - ap.ctr.buf[batIdx].Vecs[i] = vector.NewVec(ap.LeftTypes[rp.Pos]) + ap.ctr.buf[batIdx].Vecs[i] = vector.NewOffHeapVecWithType(ap.LeftTypes[rp.Pos]) } } } @@ -627,7 +626,7 @@ func (dedupJoin *DedupJoin) resetRBat() { if ctr.rbat != nil { ctr.rbat.CleanOnlyData() } else { - ctr.rbat = batch.NewWithSize(len(dedupJoin.Result)) + ctr.rbat = batch.NewOffHeapWithSize(len(dedupJoin.Result)) for i, rp := range dedupJoin.Result { if rp.Rel == 0 { From eb511e077811af49e475ed56d23830a23a21c42d Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Thu, 28 Nov 2024 22:37:18 +0800 Subject: [PATCH 04/18] code coverage --- .../cases/dml/insert/insert_duplicate.result | 10 ++++++++++ test/distributed/cases/dml/insert/insert_duplicate.sql | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/test/distributed/cases/dml/insert/insert_duplicate.result b/test/distributed/cases/dml/insert/insert_duplicate.result index 8b7c5ea72012e..775efaf5611c3 100644 --- a/test/distributed/cases/dml/insert/insert_duplicate.result +++ b/test/distributed/cases/dml/insert/insert_duplicate.result @@ -391,3 +391,13 @@ id biz_type namespace sn SELECT * FROM `serial_numbers` WHERE `biz_type` = 4 and `namespace` = '2024091117'; id biz_type namespace sn 100001 4 2024091117 1 +drop table if exists indup_11; +create table indup_11(a int, b int, c int, primary key(a, b)); +insert into indup_11(a, b) select result, result from generate_series(1, 100000) g; +insert into indup_11 values(1, 1, 1); +Duplicate entry '(1,1)' for key '(a,b)' +insert ignore into indup_11 values(1, 1, 1); +insert into indup_11 values(1, 1, 1) on duplicate key update c = a + b; +select * from indup_11 where c is not null; +a b c +1 1 2 diff --git a/test/distributed/cases/dml/insert/insert_duplicate.sql b/test/distributed/cases/dml/insert/insert_duplicate.sql index 5aba9cd55abf8..d0ddf0e378cac 100644 --- a/test/distributed/cases/dml/insert/insert_duplicate.sql +++ b/test/distributed/cases/dml/insert/insert_duplicate.sql @@ -233,3 +233,11 @@ insert into `serial_numbers` (`biz_type`, `namespace`, `sn`) select result,resul INSERT INTO `serial_numbers` (`biz_type`, `namespace`, `sn`) VALUES (4, '2024091117', 1) ON DUPLICATE KEY UPDATE `sn` = `sn` + 1; SELECT * FROM `serial_numbers` WHERE `biz_type` = 4 ; SELECT * FROM `serial_numbers` WHERE `biz_type` = 4 and `namespace` = '2024091117'; + +drop table if exists indup_11; +create table indup_11(a int, b int, c int, primary key(a, b)); +insert into indup_11(a, b) select result, result from generate_series(1, 100000) g; +insert into indup_11 values(1, 1, 1); +insert ignore into indup_11 values(1, 1, 1); +insert into indup_11 values(1, 1, 1) on duplicate key update c = a + b; +select * from indup_11 where c is not null; \ No newline at end of file From 56d4ca649e547be60991447f964355ed6e918ee9 Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Fri, 29 Nov 2024 01:20:38 +0800 Subject: [PATCH 05/18] code coverage --- pkg/sql/colexec/dedupjoin/join.go | 60 +++++++++---------- .../cases/dml/insert/insert_duplicate.result | 4 ++ .../cases/dml/insert/insert_duplicate.sql | 2 + 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/pkg/sql/colexec/dedupjoin/join.go b/pkg/sql/colexec/dedupjoin/join.go index 2a35c509b2849..a32af4abda1fd 100644 --- a/pkg/sql/colexec/dedupjoin/join.go +++ b/pkg/sql/colexec/dedupjoin/join.go @@ -272,37 +272,37 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { batCnt := (count-1)/colexec.DefaultBatchSize + 1 ap.ctr.buf = make([]*batch.Batch, batCnt) - fillCnt := 0 batIdx, rowIdx := 0, 0 - for fillCnt < len(sels) { - batSize := colexec.DefaultBatchSize - if fillCnt+batSize > len(sels) { - batSize = len(sels) - fillCnt - } - - ap.ctr.buf[batIdx] = batch.NewOffHeapWithSize(len(ap.Result)) - for i, rp := range ap.Result { - if rp.Rel == 1 { - ap.ctr.buf[batIdx].Vecs[i] = vector.NewOffHeapVecWithType(ap.RightTypes[rp.Pos]) - for _, sel := range sels[fillCnt : fillCnt+batSize] { - idx1, idx2 := sel/colexec.DefaultBatchSize, sel%colexec.DefaultBatchSize - if err := ap.ctr.buf[batIdx].Vecs[i].UnionOne(ctr.batches[idx1].Vecs[rp.Pos], int64(idx2), proc.Mp()); err != nil { - return err - } - } - } else { - ap.ctr.buf[batIdx].Vecs[i] = vector.NewOffHeapVecWithType(ap.LeftTypes[rp.Pos]) - if err := vector.AppendMultiFixed(ap.ctr.buf[batIdx].Vecs[i], 0, true, batSize, proc.Mp()); err != nil { - return err - } - } - } - - ap.ctr.buf[batIdx].SetRowCount(batSize) - fillCnt += batSize - batIdx++ - rowIdx = batSize % colexec.DefaultBatchSize - } + //fillCnt := 0 + //for fillCnt < len(sels) { + // batSize := colexec.DefaultBatchSize + // if fillCnt+batSize > len(sels) { + // batSize = len(sels) - fillCnt + // } + // + // ap.ctr.buf[batIdx] = batch.NewOffHeapWithSize(len(ap.Result)) + // for i, rp := range ap.Result { + // if rp.Rel == 1 { + // ap.ctr.buf[batIdx].Vecs[i] = vector.NewOffHeapVecWithType(ap.RightTypes[rp.Pos]) + // for _, sel := range sels[fillCnt : fillCnt+batSize] { + // idx1, idx2 := sel/colexec.DefaultBatchSize, sel%colexec.DefaultBatchSize + // if err := ap.ctr.buf[batIdx].Vecs[i].UnionOne(ctr.batches[idx1].Vecs[rp.Pos], int64(idx2), proc.Mp()); err != nil { + // return err + // } + // } + // } else { + // ap.ctr.buf[batIdx].Vecs[i] = vector.NewOffHeapVecWithType(ap.LeftTypes[rp.Pos]) + // if err := vector.AppendMultiFixed(ap.ctr.buf[batIdx].Vecs[i], 0, true, batSize, proc.Mp()); err != nil { + // return err + // } + // } + // } + // + // ap.ctr.buf[batIdx].SetRowCount(batSize) + // fillCnt += batSize + // batIdx++ + // rowIdx = batSize % colexec.DefaultBatchSize + //} if ctr.joinBat1 != nil { ctr.joinBat1.Clean(proc.GetMPool()) diff --git a/test/distributed/cases/dml/insert/insert_duplicate.result b/test/distributed/cases/dml/insert/insert_duplicate.result index 775efaf5611c3..a9365a744f034 100644 --- a/test/distributed/cases/dml/insert/insert_duplicate.result +++ b/test/distributed/cases/dml/insert/insert_duplicate.result @@ -401,3 +401,7 @@ insert into indup_11 values(1, 1, 1) on duplicate key update c = a + b; select * from indup_11 where c is not null; a b c 1 1 2 +insert into indup_11 values(1, 1, 1), (1, 1, 2), (2, 2, 3) on duplicate key update c = c + 10; +select * from indup_11 where c is not null; +a b c +1 1 22 diff --git a/test/distributed/cases/dml/insert/insert_duplicate.sql b/test/distributed/cases/dml/insert/insert_duplicate.sql index d0ddf0e378cac..c1cb13a80e710 100644 --- a/test/distributed/cases/dml/insert/insert_duplicate.sql +++ b/test/distributed/cases/dml/insert/insert_duplicate.sql @@ -240,4 +240,6 @@ insert into indup_11(a, b) select result, result from generate_series(1, 100000) insert into indup_11 values(1, 1, 1); insert ignore into indup_11 values(1, 1, 1); insert into indup_11 values(1, 1, 1) on duplicate key update c = a + b; +select * from indup_11 where c is not null; +insert into indup_11 values(1, 1, 1), (1, 1, 2), (2, 2, 3) on duplicate key update c = c + 10; select * from indup_11 where c is not null; \ No newline at end of file From 5000f257bf883a8364a700fbf707e8262f690d09 Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Fri, 29 Nov 2024 10:25:44 +0800 Subject: [PATCH 06/18] fix a panic in multi-CN DEDUP join --- pkg/pb/pipeline/pipeline.pb.go | 1225 ++++++++++------- pkg/sql/compile/operator.go | 8 +- pkg/sql/compile/remoterun.go | 8 +- proto/pipeline.proto | 28 +- .../cases/dml/insert/insert_ignore.result | 9 + .../cases/dml/insert/insert_ignore.sql | 6 + 6 files changed, 762 insertions(+), 522 deletions(-) diff --git a/pkg/pb/pipeline/pipeline.pb.go b/pkg/pb/pipeline/pipeline.pb.go index fc9821ea72258..fbb5a8079fee0 100644 --- a/pkg/pb/pipeline/pipeline.pb.go +++ b/pkg/pb/pipeline/pipeline.pb.go @@ -3117,19 +3117,21 @@ func (m *MarkJoin) GetShuffleIdx() int32 { } type DedupJoin struct { - LeftCond []*plan.Expr `protobuf:"bytes,1,rep,name=left_cond,json=leftCond,proto3" json:"left_cond,omitempty"` - RightCond []*plan.Expr `protobuf:"bytes,2,rep,name=right_cond,json=rightCond,proto3" json:"right_cond,omitempty"` - RuntimeFilterBuildList []*plan.RuntimeFilterSpec `protobuf:"bytes,3,rep,name=runtime_filter_build_list,json=runtimeFilterBuildList,proto3" json:"runtime_filter_build_list,omitempty"` - IsShuffle bool `protobuf:"varint,4,opt,name=is_shuffle,json=isShuffle,proto3" json:"is_shuffle,omitempty"` - JoinMapTag int32 `protobuf:"varint,5,opt,name=join_map_tag,json=joinMapTag,proto3" json:"join_map_tag,omitempty"` - ShuffleIdx int32 `protobuf:"varint,6,opt,name=shuffle_idx,json=shuffleIdx,proto3" json:"shuffle_idx,omitempty"` - OnDuplicateAction plan.Node_OnDuplicateAction `protobuf:"varint,7,opt,name=on_duplicate_action,json=onDuplicateAction,proto3,enum=plan.Node_OnDuplicateAction" json:"on_duplicate_action,omitempty"` - DedupColName string `protobuf:"bytes,8,opt,name=dedup_col_name,json=dedupColName,proto3" json:"dedup_col_name,omitempty"` - DedupColTypes []plan.Type `protobuf:"bytes,9,rep,name=dedup_col_types,json=dedupColTypes,proto3" json:"dedup_col_types"` - LeftTypes []plan.Type `protobuf:"bytes,10,rep,name=left_types,json=leftTypes,proto3" json:"left_types"` - RightTypes []plan.Type `protobuf:"bytes,11,rep,name=right_types,json=rightTypes,proto3" json:"right_types"` - UpdateColIdxList []int32 `protobuf:"varint,12,rep,packed,name=update_col_idx_list,json=updateColIdxList,proto3" json:"update_col_idx_list,omitempty"` - UpdateColExprList []*plan.Expr `protobuf:"bytes,13,rep,name=update_col_expr_list,json=updateColExprList,proto3" json:"update_col_expr_list,omitempty"` + RelList []int32 `protobuf:"varint,1,rep,packed,name=rel_list,json=relList,proto3" json:"rel_list,omitempty"` + ColList []int32 `protobuf:"varint,2,rep,packed,name=col_list,json=colList,proto3" json:"col_list,omitempty"` + LeftCond []*plan.Expr `protobuf:"bytes,3,rep,name=left_cond,json=leftCond,proto3" json:"left_cond,omitempty"` + RightCond []*plan.Expr `protobuf:"bytes,4,rep,name=right_cond,json=rightCond,proto3" json:"right_cond,omitempty"` + RuntimeFilterBuildList []*plan.RuntimeFilterSpec `protobuf:"bytes,5,rep,name=runtime_filter_build_list,json=runtimeFilterBuildList,proto3" json:"runtime_filter_build_list,omitempty"` + IsShuffle bool `protobuf:"varint,6,opt,name=is_shuffle,json=isShuffle,proto3" json:"is_shuffle,omitempty"` + JoinMapTag int32 `protobuf:"varint,7,opt,name=join_map_tag,json=joinMapTag,proto3" json:"join_map_tag,omitempty"` + ShuffleIdx int32 `protobuf:"varint,8,opt,name=shuffle_idx,json=shuffleIdx,proto3" json:"shuffle_idx,omitempty"` + OnDuplicateAction plan.Node_OnDuplicateAction `protobuf:"varint,9,opt,name=on_duplicate_action,json=onDuplicateAction,proto3,enum=plan.Node_OnDuplicateAction" json:"on_duplicate_action,omitempty"` + DedupColName string `protobuf:"bytes,10,opt,name=dedup_col_name,json=dedupColName,proto3" json:"dedup_col_name,omitempty"` + DedupColTypes []plan.Type `protobuf:"bytes,11,rep,name=dedup_col_types,json=dedupColTypes,proto3" json:"dedup_col_types"` + LeftTypes []plan.Type `protobuf:"bytes,12,rep,name=left_types,json=leftTypes,proto3" json:"left_types"` + RightTypes []plan.Type `protobuf:"bytes,13,rep,name=right_types,json=rightTypes,proto3" json:"right_types"` + UpdateColIdxList []int32 `protobuf:"varint,14,rep,packed,name=update_col_idx_list,json=updateColIdxList,proto3" json:"update_col_idx_list,omitempty"` + UpdateColExprList []*plan.Expr `protobuf:"bytes,15,rep,name=update_col_expr_list,json=updateColExprList,proto3" json:"update_col_expr_list,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -3168,6 +3170,20 @@ func (m *DedupJoin) XXX_DiscardUnknown() { var xxx_messageInfo_DedupJoin proto.InternalMessageInfo +func (m *DedupJoin) GetRelList() []int32 { + if m != nil { + return m.RelList + } + return nil +} + +func (m *DedupJoin) GetColList() []int32 { + if m != nil { + return m.ColList + } + return nil +} + func (m *DedupJoin) GetLeftCond() []*plan.Expr { if m != nil { return m.LeftCond @@ -5934,375 +5950,374 @@ func init() { func init() { proto.RegisterFile("pipeline.proto", fileDescriptor_7ac67a7adf3df9c7) } var fileDescriptor_7ac67a7adf3df9c7 = []byte{ - // 5878 bytes of a gzipped FileDescriptorProto + // 5868 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7c, 0x4d, 0x6c, 0x1d, 0x47, 0x72, 0xb0, 0xdf, 0xff, 0x4c, 0xbd, 0x1f, 0x3e, 0xb6, 0xfe, 0x9e, 0x25, 0x59, 0xa2, 0xc6, 0x92, 0xcc, 0x95, 0x2d, 0xca, 0xa6, 0x57, 0xdf, 0xfa, 0x8b, 0xb3, 0xeb, 0xa5, 0x48, 0x69, 0x97, 0xb6, - 0x28, 0x33, 0x4d, 0x2a, 0x46, 0xf6, 0x90, 0xc1, 0x70, 0xa6, 0xdf, 0xe3, 0x2c, 0xe7, 0xcd, 0x8c, - 0xe6, 0x47, 0x7a, 0xd4, 0x29, 0x40, 0x72, 0xcd, 0x69, 0x4f, 0x41, 0x2e, 0xc1, 0x1e, 0x12, 0xe4, - 0x10, 0x24, 0x48, 0x10, 0x20, 0x40, 0xb0, 0xf7, 0xcd, 0x25, 0xc8, 0x29, 0xc7, 0x20, 0xd8, 0xdc, - 0xf2, 0x73, 0xdb, 0x04, 0xb9, 0x04, 0x08, 0xaa, 0xba, 0xe7, 0xe7, 0xfd, 0x88, 0xa2, 0x64, 0x3b, - 0xd8, 0x05, 0xf6, 0xd6, 0x5d, 0x55, 0xdd, 0xd3, 0x5d, 0x55, 0x5d, 0x5d, 0x5d, 0x5d, 0x3d, 0xd0, - 0x0b, 0xdd, 0x50, 0x78, 0xae, 0x2f, 0xd6, 0xc2, 0x28, 0x48, 0x02, 0xa6, 0x65, 0xf5, 0x8b, 0xb7, - 0x47, 0x6e, 0x72, 0x98, 0x1e, 0xac, 0xd9, 0xc1, 0xf8, 0xce, 0x28, 0x18, 0x05, 0x77, 0x88, 0xe0, - 0x20, 0x1d, 0x52, 0x8d, 0x2a, 0x54, 0x92, 0x0d, 0x2f, 0x42, 0xe8, 0x59, 0xbe, 0x2a, 0x2f, 0x25, - 0xee, 0x58, 0xc4, 0x89, 0x35, 0x0e, 0x33, 0xa4, 0x17, 0xd8, 0x47, 0xaa, 0xac, 0x27, 0x13, 0x45, - 0x67, 0xfc, 0x61, 0x15, 0x5a, 0x3b, 0x22, 0x8e, 0xad, 0x91, 0x60, 0x06, 0xd4, 0x62, 0xd7, 0x19, - 0x54, 0x56, 0x2a, 0xab, 0xbd, 0xf5, 0xfe, 0x5a, 0x3e, 0xac, 0xbd, 0xc4, 0x4a, 0xd2, 0x98, 0x23, - 0x12, 0x69, 0xec, 0xb1, 0x33, 0xa8, 0xce, 0xd2, 0xec, 0x88, 0xe4, 0x30, 0x70, 0x38, 0x22, 0x59, - 0x1f, 0x6a, 0x22, 0x8a, 0x06, 0xb5, 0x95, 0xca, 0x6a, 0x87, 0x63, 0x91, 0x31, 0xa8, 0x3b, 0x56, - 0x62, 0x0d, 0xea, 0x04, 0xa2, 0x32, 0xbb, 0x0e, 0xbd, 0x30, 0x0a, 0x6c, 0xd3, 0xf5, 0x87, 0x81, - 0x49, 0xd8, 0x06, 0x61, 0x3b, 0x08, 0xdd, 0xf6, 0x87, 0xc1, 0x16, 0x52, 0x0d, 0xa0, 0x65, 0xf9, - 0x96, 0x77, 0x1c, 0x8b, 0x41, 0x93, 0xd0, 0x59, 0x95, 0xf5, 0xa0, 0xea, 0x3a, 0x83, 0xd6, 0x4a, - 0x65, 0xb5, 0xce, 0xab, 0xae, 0x83, 0xdf, 0x48, 0x53, 0xd7, 0x19, 0x68, 0xf2, 0x1b, 0x58, 0x66, - 0x06, 0x74, 0x7c, 0x21, 0x9c, 0x47, 0x41, 0xc2, 0x45, 0xe8, 0x1d, 0x0f, 0xf4, 0x95, 0xca, 0xaa, - 0xc6, 0xa7, 0x60, 0xec, 0x22, 0x68, 0x8e, 0x38, 0x48, 0x47, 0x3b, 0xf1, 0x68, 0x00, 0x2b, 0x95, - 0x55, 0x9d, 0xe7, 0x75, 0xe3, 0x31, 0xe8, 0x9b, 0x81, 0xef, 0x0b, 0x3b, 0x09, 0x22, 0x76, 0x15, - 0xda, 0xd9, 0x74, 0x4d, 0xc5, 0xa6, 0x06, 0x87, 0x0c, 0xb4, 0xed, 0xb0, 0x77, 0x60, 0xc9, 0xce, - 0xa8, 0x4d, 0xd7, 0x77, 0xc4, 0x84, 0xf8, 0xd4, 0xe0, 0xbd, 0x1c, 0xbc, 0x8d, 0x50, 0xe3, 0xdf, - 0xab, 0xd0, 0xda, 0x3b, 0x4c, 0x87, 0x43, 0x4f, 0xb0, 0xeb, 0xd0, 0x55, 0xc5, 0xcd, 0xc0, 0xdb, - 0x76, 0x26, 0xaa, 0xdf, 0x69, 0x20, 0x5b, 0x81, 0xb6, 0x02, 0xec, 0x1f, 0x87, 0x42, 0x75, 0x5b, - 0x06, 0x4d, 0xf7, 0xb3, 0xe3, 0xfa, 0xc4, 0xfe, 0x1a, 0x9f, 0x06, 0xce, 0x50, 0x59, 0x13, 0x92, - 0xc8, 0x34, 0x95, 0x45, 0x5f, 0xdb, 0xf0, 0xdc, 0xa7, 0x82, 0x8b, 0xd1, 0xa6, 0x9f, 0x90, 0x5c, - 0x1a, 0xbc, 0x0c, 0x62, 0xeb, 0x70, 0x2e, 0x96, 0x4d, 0xcc, 0xc8, 0xf2, 0x47, 0x22, 0x36, 0x53, - 0xd7, 0x4f, 0xfe, 0xdf, 0x37, 0x07, 0xcd, 0x95, 0xda, 0x6a, 0x9d, 0x9f, 0x51, 0x48, 0x4e, 0xb8, - 0xc7, 0x84, 0x62, 0xef, 0xc3, 0xd9, 0x99, 0x36, 0xb2, 0x49, 0x6b, 0xa5, 0xb6, 0x5a, 0xe3, 0x6c, - 0xaa, 0xc9, 0x36, 0xb5, 0xb8, 0x0f, 0xcb, 0x51, 0xea, 0xa3, 0x26, 0x3f, 0x70, 0xbd, 0x44, 0x44, - 0x7b, 0xa1, 0xb0, 0x49, 0xbe, 0xed, 0xf5, 0x0b, 0x6b, 0xa4, 0xec, 0x7c, 0x16, 0xcd, 0xe7, 0x5b, - 0x18, 0xff, 0x5d, 0x05, 0x6d, 0xcb, 0x8d, 0x43, 0x2b, 0xb1, 0x0f, 0xd9, 0x05, 0x68, 0x0d, 0x53, - 0xdf, 0x2e, 0x24, 0xd8, 0xc4, 0xea, 0xb6, 0xc3, 0x7e, 0x1d, 0x96, 0xbc, 0xc0, 0xb6, 0x3c, 0x33, - 0x17, 0xd6, 0xa0, 0xba, 0x52, 0x5b, 0x6d, 0xaf, 0x9f, 0x29, 0xb4, 0x3c, 0x57, 0x06, 0xde, 0x23, - 0xda, 0x42, 0x39, 0xbe, 0x0d, 0xfd, 0x48, 0x8c, 0x83, 0x44, 0x94, 0x9a, 0xd7, 0xa8, 0x39, 0x2b, - 0x9a, 0x7f, 0x11, 0x59, 0xe1, 0xa3, 0xc0, 0x11, 0x7c, 0x49, 0xd2, 0x16, 0xcd, 0x3f, 0x28, 0xf1, - 0x53, 0x8c, 0x4c, 0xd7, 0x99, 0x98, 0xf4, 0x81, 0x41, 0x7d, 0xa5, 0xb6, 0xda, 0x28, 0x98, 0x23, - 0x46, 0xdb, 0xce, 0xe4, 0x21, 0x62, 0xd8, 0x87, 0x70, 0x7e, 0xb6, 0x89, 0xec, 0x75, 0xd0, 0xa0, - 0x36, 0x67, 0xa6, 0xda, 0x70, 0x42, 0xb1, 0x6b, 0xd0, 0xc9, 0x1a, 0x25, 0xa8, 0x48, 0x4d, 0x29, - 0xda, 0xb8, 0xa4, 0x48, 0x17, 0xa0, 0xe5, 0xc6, 0x66, 0xec, 0xfa, 0x47, 0xb4, 0xb8, 0x34, 0xde, - 0x74, 0xe3, 0x3d, 0xd7, 0x3f, 0x62, 0x6f, 0x82, 0x16, 0x09, 0x5b, 0x62, 0x34, 0xc2, 0xb4, 0x22, - 0x61, 0x13, 0xea, 0x02, 0x60, 0xd1, 0xb4, 0x13, 0xa1, 0x96, 0x58, 0x33, 0x12, 0xf6, 0x66, 0x22, - 0x8c, 0x18, 0x1a, 0x3b, 0x22, 0x1a, 0x09, 0x5c, 0x65, 0xd8, 0x70, 0xcf, 0xb6, 0x7c, 0xe2, 0xbb, - 0xc6, 0xf3, 0x3a, 0xae, 0xf1, 0xd0, 0x8a, 0x12, 0xd7, 0xf2, 0x48, 0xb1, 0x35, 0x9e, 0x55, 0xd9, - 0x25, 0xd0, 0xe3, 0xc4, 0x8a, 0x12, 0x9c, 0x1d, 0x29, 0x74, 0x83, 0x6b, 0x04, 0xc0, 0x35, 0x71, - 0x01, 0x5a, 0xc2, 0x77, 0x08, 0x55, 0x97, 0x92, 0x14, 0xbe, 0xb3, 0xed, 0x4c, 0x8c, 0xbf, 0xaa, - 0x40, 0x77, 0x27, 0xf5, 0x12, 0x77, 0x23, 0x1a, 0xa5, 0x62, 0xec, 0x27, 0x68, 0x1b, 0xb6, 0xdc, - 0x38, 0x51, 0x5f, 0xa6, 0x32, 0x5b, 0x05, 0xfd, 0x7b, 0x51, 0x90, 0x86, 0xf7, 0x27, 0x61, 0x26, - 0x69, 0x90, 0x4a, 0x85, 0x10, 0x5e, 0x20, 0xd9, 0x7b, 0xd0, 0xfe, 0x3c, 0x72, 0x44, 0x74, 0xef, - 0x98, 0x68, 0x6b, 0x73, 0xb4, 0x65, 0x34, 0xbb, 0x0c, 0xfa, 0x9e, 0x08, 0xad, 0xc8, 0x42, 0x15, - 0xa8, 0x93, 0x41, 0x29, 0x00, 0x38, 0x57, 0x22, 0xde, 0x76, 0xd4, 0xb2, 0xca, 0xaa, 0xc6, 0x08, - 0xf4, 0x8d, 0xd1, 0x28, 0x12, 0x23, 0x2b, 0x21, 0xe3, 0x16, 0x84, 0x34, 0xdc, 0x1a, 0xaf, 0x06, - 0x21, 0x19, 0x50, 0x9c, 0x80, 0xe4, 0x0f, 0x95, 0xd9, 0x15, 0xa8, 0x8b, 0xc5, 0xe3, 0x21, 0x38, - 0x3b, 0x0f, 0x4d, 0x3b, 0xf0, 0x87, 0xee, 0x48, 0x99, 0x5d, 0x55, 0x33, 0x7e, 0xbf, 0x06, 0x0d, - 0x9a, 0x1c, 0xb2, 0x17, 0x4d, 0xa1, 0x29, 0x9e, 0x5a, 0x5e, 0x26, 0x15, 0x04, 0xdc, 0x7f, 0x6a, - 0x79, 0x6c, 0x05, 0x1a, 0xd8, 0x4d, 0xbc, 0x80, 0x37, 0x12, 0xc1, 0x6e, 0x42, 0x03, 0x95, 0x28, - 0x9e, 0x1e, 0x01, 0x2a, 0xd1, 0xbd, 0xfa, 0x4f, 0xff, 0xe9, 0xea, 0x1b, 0x5c, 0xa2, 0xd9, 0x3b, - 0x50, 0xb7, 0x46, 0xa3, 0x98, 0x74, 0x79, 0x6a, 0x39, 0xe5, 0xf3, 0xe5, 0x44, 0xc0, 0xee, 0x82, - 0x2e, 0xe5, 0x86, 0xd4, 0x0d, 0xa2, 0xbe, 0x50, 0xda, 0x62, 0xca, 0x22, 0xe5, 0x05, 0x25, 0x72, - 0xdc, 0x8d, 0x95, 0x05, 0x23, 0x8d, 0xd6, 0x78, 0x01, 0xc0, 0x3d, 0x20, 0x8c, 0xc4, 0x86, 0xe7, - 0x05, 0xf6, 0x9e, 0xfb, 0x5c, 0xa8, 0x1d, 0x63, 0x0a, 0xc6, 0x6e, 0x42, 0x6f, 0x57, 0xaa, 0x1c, - 0x17, 0x71, 0xea, 0x25, 0xb1, 0xda, 0x45, 0x66, 0xa0, 0x6c, 0x0d, 0xd8, 0x14, 0x64, 0x9f, 0xa6, - 0xaf, 0xaf, 0xd4, 0x56, 0xbb, 0x7c, 0x01, 0x86, 0xbd, 0x0d, 0xdd, 0x11, 0x72, 0xda, 0xf5, 0x47, - 0xe6, 0xd0, 0xb3, 0x70, 0x83, 0xa9, 0xe1, 0x06, 0x94, 0x01, 0x1f, 0x78, 0xd6, 0xc8, 0xf8, 0x79, - 0x15, 0x9a, 0xdb, 0x7e, 0x2c, 0xa2, 0x04, 0x57, 0x89, 0x35, 0x1c, 0x0a, 0x3b, 0x11, 0xd2, 0x3a, - 0xd5, 0x79, 0x5e, 0xc7, 0x59, 0xee, 0x07, 0x5f, 0x44, 0x6e, 0x22, 0xf6, 0x3e, 0x54, 0x7a, 0x50, - 0x00, 0xd8, 0x2d, 0x58, 0xb6, 0x1c, 0xc7, 0xcc, 0xa8, 0xcd, 0x28, 0x78, 0x16, 0xd3, 0x8a, 0xd1, - 0xf8, 0x92, 0xe5, 0x38, 0x1b, 0x0a, 0xce, 0x83, 0x67, 0x31, 0xbb, 0x06, 0xb5, 0x48, 0x0c, 0x49, - 0x2b, 0xda, 0xeb, 0x4b, 0x52, 0x6a, 0x9f, 0x1f, 0xfc, 0x50, 0xd8, 0x09, 0x17, 0x43, 0x8e, 0x38, - 0x76, 0x16, 0x1a, 0x56, 0x92, 0x44, 0x52, 0x0a, 0x3a, 0x97, 0x15, 0xb6, 0x06, 0x67, 0x68, 0x65, - 0x26, 0x6e, 0xe0, 0x9b, 0x89, 0x75, 0xe0, 0xe1, 0x46, 0x18, 0x2b, 0x9b, 0xbf, 0x9c, 0xa3, 0xf6, - 0x11, 0xb3, 0xed, 0xc4, 0xb8, 0x4b, 0xcc, 0xd2, 0xfb, 0xd6, 0x58, 0xc4, 0x64, 0xf2, 0x75, 0x7e, - 0x66, 0xba, 0xc5, 0x23, 0x44, 0x21, 0xcb, 0x8a, 0x36, 0xb8, 0xb6, 0x35, 0x5a, 0x26, 0x9d, 0x1c, - 0x88, 0x4b, 0xff, 0x1c, 0x34, 0xdd, 0xd8, 0x14, 0xbe, 0xa3, 0xcc, 0x4d, 0xc3, 0x8d, 0xef, 0xfb, - 0x0e, 0x7b, 0x17, 0x74, 0xf9, 0x15, 0x47, 0x0c, 0x69, 0x2f, 0x6f, 0xaf, 0xf7, 0x94, 0x52, 0x22, - 0x78, 0x4b, 0x0c, 0xb9, 0x96, 0xa8, 0x92, 0xf1, 0x93, 0x2a, 0xb4, 0x49, 0x87, 0x1e, 0x87, 0x0e, - 0x2e, 0xb9, 0xb7, 0xa1, 0x3b, 0xcd, 0x3d, 0x29, 0x80, 0x8e, 0x55, 0x66, 0xdd, 0x79, 0x68, 0x6e, - 0xd8, 0x38, 0x0a, 0x92, 0x40, 0x97, 0xab, 0x1a, 0x2e, 0xeb, 0xed, 0x7b, 0xa9, 0x7d, 0x24, 0x12, - 0x62, 0x7a, 0x97, 0x67, 0x55, 0xc4, 0x3c, 0x52, 0x98, 0xba, 0xc4, 0xa8, 0x2a, 0xbb, 0x0f, 0xb0, - 0x27, 0x46, 0x63, 0xe1, 0x27, 0x3b, 0x56, 0xa8, 0xd4, 0xfd, 0xc6, 0x8c, 0xba, 0xcb, 0xb1, 0xad, - 0x15, 0x74, 0xf7, 0xfd, 0x24, 0x3a, 0xe6, 0xa5, 0x86, 0xec, 0x5b, 0xb0, 0x94, 0x12, 0x95, 0x69, - 0x27, 0x13, 0xd3, 0x43, 0x2b, 0xd1, 0xa4, 0xbe, 0x94, 0x64, 0x65, 0x17, 0x9b, 0xc9, 0x84, 0x77, - 0xd3, 0xac, 0xf8, 0xd0, 0x8d, 0x93, 0x8b, 0xdf, 0x86, 0xa5, 0x99, 0x7e, 0xd1, 0x73, 0x3b, 0x12, - 0xc7, 0x34, 0x73, 0x9d, 0x63, 0x11, 0x15, 0xe1, 0xa9, 0xe5, 0xa5, 0x99, 0xcb, 0x21, 0x2b, 0xbf, - 0x56, 0xfd, 0xa8, 0x62, 0xbc, 0x05, 0x8d, 0x8d, 0x28, 0xb2, 0x88, 0xc4, 0xc2, 0xc2, 0xa0, 0x42, - 0xfb, 0x8e, 0xac, 0x18, 0x36, 0xd4, 0x70, 0x74, 0x37, 0xa0, 0x3a, 0x0e, 0x09, 0xd3, 0x5e, 0x3f, - 0x57, 0x9a, 0x9c, 0x15, 0xae, 0xed, 0xa8, 0xc9, 0x54, 0xc7, 0xe1, 0xc5, 0xbb, 0xd0, 0xda, 0x79, - 0x8d, 0x31, 0xfc, 0x67, 0x1d, 0xb4, 0x2d, 0xe1, 0x09, 0x92, 0x81, 0x01, 0x9d, 0xb2, 0x9a, 0x67, - 0xf2, 0x9b, 0x52, 0x7d, 0x03, 0x3a, 0x72, 0x27, 0xa4, 0x56, 0x42, 0xad, 0xa3, 0x29, 0xd8, 0x6b, - 0xc9, 0xf2, 0x32, 0x40, 0x14, 0x3c, 0x33, 0x5d, 0xb9, 0x1d, 0x49, 0xcb, 0xae, 0x45, 0xc1, 0xb3, - 0x6d, 0xdc, 0x90, 0xfe, 0x4f, 0xd6, 0xcd, 0xb7, 0x60, 0x50, 0x5a, 0x37, 0xe8, 0x66, 0x9a, 0xae, - 0x6f, 0x1e, 0xa0, 0xcf, 0xa3, 0x96, 0x50, 0xd1, 0x27, 0x79, 0xa1, 0xdb, 0xfe, 0x3d, 0x72, 0x88, - 0x94, 0x35, 0xd0, 0x4f, 0xb0, 0x06, 0x0b, 0x8d, 0x0b, 0x2c, 0x36, 0x2e, 0xf7, 0xa6, 0xb4, 0xba, - 0x4d, 0x82, 0x37, 0x0a, 0xc1, 0x67, 0xd2, 0x3a, 0x51, 0xa5, 0xaf, 0x41, 0xc7, 0xb6, 0x7c, 0x33, - 0x89, 0x52, 0xdf, 0xb6, 0x12, 0x31, 0xe8, 0xd0, 0xa7, 0xda, 0xb6, 0xe5, 0xef, 0x2b, 0x50, 0xc9, - 0x02, 0x74, 0xcb, 0x16, 0xe0, 0x26, 0x2c, 0x85, 0x91, 0x3b, 0xb6, 0xa2, 0x63, 0xf3, 0x48, 0x1c, - 0x93, 0x30, 0x7a, 0xd2, 0x9f, 0x56, 0xe0, 0xcf, 0xc4, 0xf1, 0xb6, 0x33, 0xf9, 0xb2, 0xba, 0xff, - 0x8f, 0x55, 0xd0, 0x77, 0x23, 0xa1, 0xac, 0xf6, 0x55, 0x68, 0xc7, 0xf6, 0xa1, 0x18, 0x5b, 0x24, - 0x25, 0xd5, 0x03, 0x48, 0x10, 0x0a, 0x67, 0xda, 0x2e, 0x55, 0x4f, 0xb6, 0x4b, 0x38, 0x0e, 0xe9, - 0xed, 0xe0, 0x62, 0xc2, 0x62, 0x61, 0x8c, 0xeb, 0x65, 0x63, 0xbc, 0x02, 0x9d, 0x43, 0x2b, 0x36, - 0xad, 0x34, 0x09, 0x4c, 0x3b, 0xf0, 0x48, 0xe9, 0x34, 0x0e, 0x87, 0x56, 0xbc, 0x91, 0x26, 0xc1, - 0x66, 0x40, 0xde, 0x93, 0x1b, 0x9b, 0x72, 0xd1, 0xab, 0x7d, 0x51, 0x73, 0x63, 0x65, 0xee, 0xd6, - 0xe0, 0x8c, 0x88, 0x13, 0x77, 0x6c, 0x29, 0x81, 0x9a, 0x76, 0x90, 0xfa, 0x09, 0xed, 0x8e, 0x35, - 0xbe, 0x9c, 0xa3, 0x78, 0xf0, 0x6c, 0x13, 0x11, 0xec, 0x7d, 0xe8, 0xd9, 0xc1, 0x38, 0x34, 0x43, - 0xe4, 0x2b, 0xf9, 0x1d, 0xd2, 0x11, 0x2f, 0xfb, 0x05, 0x1d, 0xa4, 0xd8, 0x3d, 0x12, 0xd2, 0x11, - 0x5a, 0x87, 0x25, 0xdb, 0x4b, 0xe3, 0x44, 0x44, 0xe6, 0x81, 0x6a, 0xa2, 0xcf, 0x35, 0xe9, 0x2a, - 0x12, 0xe9, 0x3c, 0x21, 0x63, 0x5b, 0xbb, 0x41, 0x9c, 0x6c, 0x8d, 0xbd, 0x4c, 0x31, 0x2b, 0xaf, - 0xaa, 0x98, 0xd5, 0xc5, 0x8a, 0xb9, 0x40, 0x35, 0x6a, 0x0b, 0x54, 0x83, 0xad, 0x42, 0xbf, 0x4c, - 0x47, 0x22, 0x95, 0x6e, 0x5c, 0xaf, 0x20, 0x24, 0xb1, 0x4a, 0xfe, 0x3a, 0xd2, 0x92, 0x34, 0x32, - 0xfe, 0x2a, 0x2b, 0x22, 0x91, 0x2e, 0x69, 0x48, 0xc1, 0x7c, 0xa5, 0x31, 0xff, 0x1f, 0xde, 0xcc, - 0x5b, 0x9a, 0xcf, 0xdc, 0xe4, 0x30, 0x48, 0x13, 0x73, 0x48, 0x27, 0x96, 0x58, 0x79, 0xdd, 0xe7, - 0xb3, 0x9e, 0xbe, 0x90, 0x68, 0x79, 0x9e, 0x21, 0x1f, 0x69, 0x98, 0x7a, 0x9e, 0x99, 0x88, 0x49, - 0xa2, 0x44, 0x30, 0x90, 0xbc, 0x51, 0x7c, 0x7b, 0x90, 0x7a, 0xde, 0xbe, 0x98, 0x24, 0x68, 0xf1, - 0xb5, 0xa1, 0xaa, 0x18, 0x7f, 0x5d, 0x03, 0x78, 0x18, 0xd8, 0x47, 0xfb, 0x56, 0x34, 0x12, 0x09, - 0xfa, 0xf2, 0x99, 0x1d, 0x52, 0x76, 0xb2, 0x95, 0x48, 0xeb, 0xc3, 0xd6, 0xe1, 0x7c, 0x36, 0x7f, - 0x3b, 0xf0, 0xe8, 0x5c, 0x21, 0x0d, 0x89, 0x5a, 0x06, 0x4c, 0x61, 0xe5, 0xc9, 0x94, 0xac, 0x08, - 0xfb, 0xa8, 0xe0, 0x2d, 0xb6, 0x49, 0x8e, 0x43, 0xe2, 0xed, 0x22, 0x9f, 0xb0, 0x5b, 0x34, 0xdf, - 0x3f, 0x0e, 0xd9, 0xfb, 0x70, 0x2e, 0x12, 0xc3, 0x48, 0xc4, 0x87, 0x66, 0x12, 0x97, 0x3f, 0x26, - 0x5d, 0xfa, 0x65, 0x85, 0xdc, 0x8f, 0xf3, 0x6f, 0xbd, 0x0f, 0xe7, 0x24, 0xa7, 0x66, 0x87, 0x27, - 0xad, 0xee, 0xb2, 0x44, 0x96, 0x47, 0xf7, 0x16, 0x50, 0xf0, 0x43, 0x5a, 0xd2, 0xcc, 0x41, 0xf4, - 0x88, 0x19, 0x07, 0x9e, 0x40, 0xc7, 0x6a, 0xf3, 0x10, 0x4f, 0x9d, 0x5b, 0x62, 0xa8, 0x98, 0x5f, - 0x00, 0x98, 0x01, 0xf5, 0x9d, 0xc0, 0x11, 0xc4, 0xea, 0xde, 0x7a, 0x6f, 0x8d, 0xc2, 0x28, 0xc8, - 0x49, 0x84, 0x72, 0xc2, 0xb1, 0x77, 0x80, 0xba, 0x93, 0xea, 0x37, 0xaf, 0xe3, 0x1a, 0x22, 0x49, - 0x07, 0xdf, 0x87, 0x73, 0xc5, 0x48, 0x4c, 0x2b, 0x31, 0x93, 0x43, 0x41, 0x46, 0x4c, 0x1a, 0xd3, - 0xe5, 0x7c, 0x50, 0x1b, 0xc9, 0xfe, 0xa1, 0xb8, 0xef, 0x3b, 0xc6, 0x47, 0xd0, 0xc4, 0x8f, 0x7d, - 0x1e, 0xb2, 0x35, 0x68, 0x25, 0x24, 0xbc, 0x58, 0x6d, 0xa7, 0x67, 0x0b, 0xab, 0x5a, 0x48, 0x96, - 0x67, 0x44, 0x06, 0x87, 0xa5, 0xdc, 0x44, 0x3d, 0xf6, 0xdd, 0x27, 0xa9, 0x60, 0x9f, 0xc0, 0x72, - 0x18, 0x09, 0xa5, 0x94, 0x66, 0x7a, 0x84, 0x1e, 0x83, 0x5a, 0x5f, 0x67, 0x95, 0x0e, 0xe5, 0x2d, - 0x8e, 0x50, 0x7f, 0x7a, 0xe1, 0x54, 0xdd, 0xf8, 0x01, 0x5c, 0xc8, 0x29, 0xf6, 0x84, 0x1d, 0xf8, - 0x8e, 0x15, 0x1d, 0xd3, 0x6e, 0x32, 0xd3, 0x77, 0xfc, 0x2a, 0x7d, 0xef, 0x51, 0xdf, 0x3f, 0xae, - 0x41, 0xef, 0x73, 0x7f, 0x2b, 0x0d, 0x3d, 0x17, 0x2d, 0xfc, 0x67, 0xd2, 0x00, 0x4b, 0xc3, 0x57, - 0x29, 0x1b, 0xbe, 0x55, 0xe8, 0xab, 0xaf, 0xa0, 0x02, 0x48, 0xb3, 0xa5, 0xe2, 0x2c, 0x12, 0xbe, - 0x19, 0x78, 0xd2, 0x66, 0x7d, 0x1b, 0xce, 0xa5, 0x34, 0x73, 0x49, 0x79, 0x28, 0xec, 0x23, 0xf3, - 0x05, 0x47, 0x26, 0x26, 0x09, 0xb1, 0x29, 0x92, 0x91, 0x01, 0xbb, 0x0a, 0xed, 0xa2, 0x79, 0x66, - 0x7d, 0x21, 0x27, 0xa4, 0x91, 0x04, 0xbe, 0xe9, 0x64, 0x43, 0x56, 0x7b, 0x3f, 0xda, 0xed, 0x5e, - 0x50, 0xcc, 0x04, 0x8d, 0xca, 0x6f, 0xc1, 0xf2, 0x14, 0x25, 0x8d, 0x42, 0xba, 0x69, 0xb7, 0x0b, - 0x31, 0x4e, 0x4f, 0xbf, 0x5c, 0xc5, 0xf1, 0xc8, 0x7d, 0x72, 0x29, 0x98, 0x86, 0x66, 0x86, 0x66, - 0xe4, 0x07, 0x91, 0x50, 0xea, 0x8b, 0x86, 0x86, 0xea, 0x17, 0x1f, 0xc1, 0xd9, 0x45, 0xbd, 0x2c, - 0xd8, 0xec, 0x56, 0xca, 0x9b, 0xdd, 0xcc, 0x71, 0xaf, 0xd8, 0xf8, 0xfe, 0xa4, 0x02, 0xed, 0x07, - 0xe9, 0xf3, 0xe7, 0xc7, 0xd2, 0x1c, 0xb1, 0x0e, 0x54, 0x1e, 0x51, 0x2f, 0x55, 0x5e, 0x79, 0x84, - 0xde, 0xf1, 0xee, 0x11, 0x9a, 0x46, 0xea, 0x44, 0xe7, 0xaa, 0x86, 0x07, 0xc5, 0xdd, 0xa3, 0xfd, - 0x13, 0x8c, 0x82, 0x44, 0xe3, 0xf1, 0xe7, 0x5e, 0xea, 0x7a, 0xe8, 0x33, 0xa9, 0xf5, 0x9f, 0xd7, - 0xf1, 0xe8, 0xb5, 0x3d, 0x94, 0xfa, 0xf2, 0x20, 0x0a, 0xc6, 0x52, 0xa3, 0x95, 0xd5, 0x5d, 0x80, - 0x31, 0xfe, 0xae, 0x06, 0xf5, 0x4f, 0x03, 0xd7, 0x97, 0x61, 0x0b, 0x4f, 0x3a, 0xc6, 0xd2, 0x43, - 0x6d, 0x45, 0xc2, 0x43, 0x0f, 0x18, 0x51, 0xa8, 0x18, 0x9e, 0x3c, 0x59, 0x13, 0xca, 0x0e, 0x24, - 0xaa, 0x38, 0x5c, 0x57, 0x16, 0x1e, 0xae, 0xf3, 0xb3, 0x6f, 0xfd, 0x65, 0x67, 0x5f, 0xdd, 0x13, - 0x43, 0x54, 0x55, 0xdf, 0x51, 0x3e, 0xfe, 0xb4, 0x69, 0x10, 0xc3, 0x64, 0x33, 0xf0, 0x1d, 0xf6, - 0x0d, 0x80, 0xc8, 0x1d, 0x1d, 0x2a, 0xca, 0xe6, 0x7c, 0x3c, 0x82, 0xb0, 0x44, 0xca, 0xe1, 0x4d, - 0x15, 0xe4, 0x52, 0x7b, 0x86, 0x79, 0x80, 0x5c, 0x92, 0xf3, 0x68, 0x65, 0xc7, 0xe6, 0xc5, 0xe1, - 0xb1, 0xf3, 0x53, 0xe1, 0x31, 0xe2, 0x2e, 0xcd, 0xf7, 0x32, 0xa0, 0xe7, 0x70, 0x68, 0x06, 0xbe, - 0x19, 0x66, 0xe1, 0x1d, 0x0d, 0x21, 0x9f, 0xfb, 0xbb, 0x47, 0x68, 0x41, 0xdd, 0xd8, 0x54, 0x51, - 0x22, 0x75, 0xe6, 0x2a, 0x1d, 0xb1, 0x57, 0xa0, 0xf3, 0xc3, 0xc0, 0xf5, 0xcd, 0xb1, 0x15, 0x9a, - 0x89, 0x25, 0xc3, 0xa8, 0x0d, 0x0e, 0x08, 0xdb, 0xb1, 0xc2, 0x7d, 0x6b, 0x44, 0x2e, 0x92, 0x8a, - 0x3b, 0xe1, 0x22, 0x69, 0x4b, 0x02, 0x05, 0x42, 0xf1, 0x5e, 0x02, 0x9d, 0xba, 0xa0, 0xa8, 0x54, - 0x47, 0xca, 0x1e, 0x01, 0xc8, 0x51, 0xe3, 0x5f, 0xab, 0xa0, 0x6d, 0xf8, 0x89, 0x4b, 0xf2, 0x3c, - 0x0f, 0xcd, 0x88, 0x8e, 0xd8, 0x4a, 0x9a, 0xaa, 0x96, 0x4b, 0xac, 0xfa, 0x02, 0x89, 0x4d, 0x49, - 0xa2, 0x76, 0x6a, 0x49, 0xd4, 0x4f, 0x92, 0xc4, 0x34, 0xd7, 0x1a, 0x27, 0x72, 0x6d, 0x2e, 0x30, - 0xf1, 0x75, 0x88, 0x71, 0x56, 0x12, 0xda, 0xcb, 0x24, 0xa1, 0xcf, 0x4a, 0xc2, 0xf8, 0x8b, 0x1a, - 0x68, 0x0f, 0xc5, 0x30, 0xf9, 0xd5, 0xe2, 0xf9, 0x65, 0x59, 0x3c, 0xc6, 0x7f, 0xd4, 0x40, 0xe7, - 0x38, 0xc3, 0xaf, 0x51, 0x66, 0x77, 0x00, 0x48, 0x16, 0x27, 0x0b, 0x8e, 0xe4, 0x25, 0x63, 0x5f, - 0x1f, 0x40, 0x5b, 0xca, 0x44, 0xb6, 0x68, 0xbc, 0xa0, 0x85, 0x14, 0xdc, 0xfe, 0xbc, 0xbc, 0x9b, - 0xa7, 0x96, 0x77, 0xeb, 0xb5, 0xe5, 0xad, 0x7d, 0x15, 0xf2, 0xd6, 0x4f, 0x94, 0x37, 0xbc, 0x4c, - 0xde, 0xed, 0x97, 0xc9, 0xbb, 0x33, 0x27, 0xef, 0x1f, 0xd7, 0xa0, 0x4b, 0xf2, 0xde, 0x13, 0xe3, - 0x2f, 0x67, 0x14, 0x67, 0x84, 0x54, 0x7b, 0x55, 0x21, 0xd5, 0x4f, 0x2d, 0xa4, 0xc6, 0x6b, 0x0b, - 0xa9, 0xf9, 0x55, 0x08, 0xa9, 0x75, 0xa2, 0x90, 0xb4, 0x97, 0x09, 0x49, 0x7f, 0xf5, 0x45, 0x99, - 0x0b, 0xe9, 0x4b, 0xef, 0x5c, 0xbf, 0x12, 0xd2, 0x57, 0x24, 0x24, 0x98, 0x13, 0x12, 0x7a, 0x16, - 0x5f, 0x7a, 0x11, 0x7d, 0x1d, 0x9e, 0xc5, 0x89, 0xcc, 0x6e, 0x7c, 0x15, 0xcc, 0x6e, 0x9e, 0xc8, - 0xec, 0xd6, 0xcb, 0x98, 0xfd, 0x1a, 0x9e, 0xc5, 0x5f, 0xd6, 0x00, 0xf6, 0x5c, 0x7f, 0xe4, 0x89, - 0x5f, 0xf9, 0x16, 0xbf, 0x34, 0xbe, 0xc5, 0xdf, 0x56, 0x41, 0xdb, 0xb1, 0xa2, 0xa3, 0x5f, 0xb8, - 0x15, 0xf2, 0x36, 0xb4, 0x02, 0xbf, 0xbc, 0x1e, 0xca, 0x74, 0xcd, 0xc0, 0xff, 0x85, 0x50, 0xf9, - 0x1f, 0x35, 0x40, 0xdf, 0x12, 0x4e, 0x1a, 0x12, 0xfb, 0xa6, 0xd8, 0x50, 0x39, 0x35, 0x1b, 0xaa, - 0xaf, 0xad, 0x73, 0xb5, 0xd7, 0xd3, 0xb9, 0x69, 0xbe, 0xd4, 0x5f, 0xc6, 0x97, 0xc6, 0xcb, 0xf8, - 0xd2, 0x9c, 0x3b, 0xee, 0x3d, 0x84, 0x33, 0x53, 0xf1, 0x10, 0x4b, 0x5e, 0xaa, 0xb5, 0x28, 0xc8, - 0x76, 0x59, 0x8e, 0xf7, 0x51, 0xe0, 0x4c, 0x85, 0x44, 0xe4, 0x55, 0x1b, 0x5f, 0x0e, 0x66, 0x41, - 0xec, 0x3a, 0xf4, 0x1c, 0x64, 0x32, 0x85, 0x79, 0x28, 0x60, 0xab, 0x51, 0xfc, 0xa1, 0x43, 0xd0, - 0xcd, 0xc0, 0xa3, 0x28, 0xc4, 0x47, 0xb0, 0x54, 0x50, 0x25, 0xf9, 0xcd, 0xed, 0xc2, 0x20, 0x65, - 0xd6, 0x50, 0xee, 0xa6, 0xd3, 0xbe, 0x2f, 0xbc, 0xb2, 0xef, 0xdb, 0x3e, 0xc5, 0x8e, 0x7d, 0x1b, - 0xce, 0x64, 0xd7, 0x78, 0x2a, 0xac, 0x49, 0x12, 0xec, 0xd0, 0x3a, 0xeb, 0xab, 0x9b, 0x3b, 0x0a, - 0x6a, 0x92, 0x88, 0x3e, 0x86, 0xb3, 0x25, 0x72, 0x5c, 0x64, 0x92, 0xbe, 0x3b, 0xa7, 0x2b, 0xcb, - 0x79, 0x5b, 0xac, 0x62, 0x63, 0xe3, 0x77, 0x2a, 0xd0, 0xda, 0x8d, 0x02, 0x27, 0xb5, 0x93, 0xd7, - 0xb4, 0xc2, 0xd3, 0x1a, 0x52, 0x7b, 0x99, 0x86, 0xd4, 0x67, 0x35, 0xc4, 0xf8, 0xdd, 0x0a, 0xe8, - 0x6a, 0x08, 0x0f, 0xd7, 0xbf, 0xa6, 0xad, 0xe0, 0xe5, 0xa3, 0x78, 0x06, 0x3a, 0x45, 0x2f, 0x4f, - 0x34, 0x6e, 0x27, 0xae, 0xb0, 0xea, 0x6b, 0xad, 0x30, 0xe3, 0x47, 0x15, 0xe8, 0x52, 0xa0, 0xf7, - 0x41, 0xea, 0x4b, 0x1d, 0x5e, 0x1c, 0xeb, 0x5c, 0x81, 0x7a, 0x24, 0x92, 0x2c, 0x07, 0xa3, 0x23, - 0x3f, 0xb3, 0x19, 0x78, 0x5b, 0x62, 0xc8, 0x09, 0x83, 0x4c, 0xb0, 0xa2, 0x51, 0xbc, 0x28, 0x0b, - 0x04, 0xe1, 0x38, 0xab, 0xd0, 0x8a, 0xac, 0x71, 0x9c, 0x65, 0x81, 0xc8, 0x1a, 0x63, 0x50, 0xa7, - 0x95, 0xd2, 0xa0, 0x95, 0x42, 0x65, 0x63, 0x03, 0xce, 0xdd, 0x9f, 0x24, 0x22, 0xf2, 0x2d, 0x5a, - 0x31, 0xeb, 0xa8, 0x6f, 0x14, 0xdc, 0xcd, 0x88, 0x2b, 0x05, 0x31, 0x0e, 0xb8, 0x9c, 0xe3, 0x26, - 0x2b, 0xc6, 0x0d, 0x68, 0x0f, 0x5d, 0x4f, 0x98, 0xc1, 0x70, 0x18, 0x8b, 0x04, 0xbf, 0x2e, 0x4b, - 0x34, 0xad, 0x1a, 0x57, 0x35, 0xe3, 0x27, 0x75, 0xe8, 0x64, 0x9f, 0xa2, 0x1c, 0xa0, 0xc5, 0xd3, - 0xbf, 0x04, 0x3a, 0xf5, 0x16, 0xbb, 0xcf, 0x05, 0xf1, 0xa0, 0xc6, 0x35, 0x04, 0x50, 0xd2, 0xc6, - 0x06, 0x2c, 0x97, 0x3e, 0x65, 0x26, 0x41, 0x62, 0x79, 0x8a, 0x0d, 0xa5, 0x9b, 0xe6, 0x12, 0x09, - 0x5f, 0xc2, 0xca, 0xe7, 0x54, 0xde, 0x47, 0x6a, 0x64, 0x6f, 0x1e, 0xda, 0x9d, 0x63, 0x2f, 0x62, - 0xd8, 0xf7, 0x60, 0x09, 0x67, 0xbb, 0x2e, 0x57, 0x25, 0xcd, 0x57, 0xee, 0x36, 0x57, 0x8b, 0x4f, - 0x2c, 0xe4, 0x19, 0xef, 0xfa, 0x53, 0x2c, 0x7c, 0x0b, 0xc0, 0x8e, 0x04, 0x2e, 0xd8, 0xf8, 0x89, - 0x47, 0x16, 0x51, 0xe7, 0xba, 0x84, 0xec, 0x3d, 0xf1, 0xf2, 0x99, 0xe6, 0xae, 0x82, 0x2e, 0x67, - 0x4a, 0x8a, 0x7e, 0x1b, 0xda, 0x41, 0xe4, 0x8e, 0x5c, 0x5f, 0x06, 0xa2, 0xb5, 0x05, 0xa3, 0x05, - 0x49, 0x40, 0x61, 0x69, 0x03, 0x9a, 0x52, 0x51, 0x17, 0xdc, 0x45, 0x28, 0x0c, 0xe3, 0xd0, 0xdb, - 0x3f, 0x40, 0x03, 0x47, 0x69, 0x96, 0x9b, 0x81, 0xa7, 0xcc, 0xda, 0xad, 0xf9, 0x69, 0xa1, 0x7c, - 0xd6, 0xa6, 0x89, 0x65, 0x28, 0x7a, 0xa6, 0x07, 0x76, 0x13, 0x96, 0xe2, 0x24, 0x72, 0xed, 0x04, - 0xa7, 0x68, 0x8e, 0x03, 0x47, 0x90, 0x3f, 0xa1, 0xf1, 0xae, 0x04, 0xef, 0x3d, 0xf1, 0x76, 0x02, - 0x47, 0x5c, 0xdc, 0x80, 0x33, 0x0b, 0xba, 0x7b, 0xa5, 0x0b, 0x58, 0x1b, 0x60, 0x2f, 0x89, 0x84, - 0x35, 0x26, 0xe5, 0x79, 0x07, 0x5a, 0xc9, 0x81, 0x47, 0xb7, 0xab, 0x95, 0x85, 0xb7, 0xab, 0xcd, - 0xe4, 0x00, 0xb9, 0x54, 0x52, 0xc7, 0x2a, 0xdd, 0x73, 0xaa, 0x1a, 0x7e, 0xc8, 0x73, 0xc7, 0x6e, - 0xa2, 0x92, 0x26, 0x65, 0xc5, 0xf8, 0x10, 0x74, 0xea, 0x81, 0xbe, 0x91, 0xfb, 0x95, 0x95, 0x13, - 0xfd, 0x4a, 0xe3, 0x3d, 0xd0, 0x7f, 0x13, 0x87, 0x49, 0x8d, 0xae, 0x42, 0x9b, 0x6e, 0xe0, 0xcd, - 0x03, 0x2f, 0xb0, 0x8f, 0xb2, 0x9b, 0x61, 0x02, 0xdd, 0x43, 0x88, 0x01, 0xa0, 0x3d, 0xf6, 0xdd, - 0xc0, 0xdf, 0xf0, 0x3c, 0xe3, 0x0f, 0xea, 0xa0, 0x7f, 0xdf, 0x8a, 0x0f, 0xc9, 0x4a, 0xb0, 0x15, - 0x68, 0x3f, 0x12, 0xc2, 0x41, 0xc0, 0x8e, 0x15, 0xaa, 0xec, 0xac, 0x32, 0x88, 0x5d, 0x04, 0xed, - 0xfb, 0xd2, 0x93, 0xf9, 0x4c, 0xdd, 0x79, 0xe6, 0xf5, 0xac, 0x35, 0xdd, 0xf0, 0x8b, 0x2c, 0x11, - 0xa8, 0x0c, 0x62, 0xb7, 0xa0, 0x8f, 0x55, 0xca, 0x81, 0x42, 0x1d, 0x14, 0x5e, 0xac, 0x76, 0xfa, - 0x39, 0x38, 0xbb, 0x05, 0x80, 0xbe, 0x06, 0xe5, 0x0e, 0xc4, 0x0b, 0xbc, 0xad, 0x12, 0x96, 0x5d, - 0x01, 0xf8, 0x34, 0x37, 0xb0, 0xd9, 0xce, 0x5f, 0x40, 0xd8, 0x75, 0xe8, 0xaa, 0x1a, 0x17, 0xc3, - 0x4d, 0x75, 0xe3, 0xdc, 0xe0, 0xd3, 0x40, 0x76, 0x1f, 0x96, 0xf9, 0x2b, 0x67, 0x7e, 0xce, 0x81, - 0x70, 0xf3, 0xa0, 0x7b, 0x56, 0x27, 0x0d, 0x95, 0x73, 0xdc, 0x72, 0x63, 0xf2, 0xc7, 0x5e, 0xe4, - 0x81, 0xc0, 0x57, 0xe5, 0x81, 0xb4, 0x4f, 0xe7, 0x81, 0x74, 0x4e, 0xe5, 0x81, 0x18, 0x3f, 0xaf, - 0x41, 0x47, 0x6d, 0xae, 0xb4, 0xf9, 0x4c, 0x09, 0xbf, 0x72, 0xb2, 0xf0, 0xab, 0xa7, 0x13, 0x7e, - 0xed, 0x54, 0xc2, 0xaf, 0x9f, 0x28, 0xfc, 0x85, 0x62, 0x6b, 0xbc, 0xb2, 0xd8, 0x5e, 0xa6, 0x43, - 0x57, 0x00, 0xf6, 0x72, 0x5f, 0x52, 0x29, 0x50, 0x09, 0x32, 0x25, 0x76, 0xed, 0x54, 0x62, 0xd7, - 0xbf, 0x2a, 0xb1, 0xc3, 0xe9, 0xc4, 0xde, 0x3e, 0x9d, 0xd8, 0xf7, 0x00, 0x68, 0xf7, 0x90, 0x32, - 0x5f, 0xc8, 0xdd, 0xca, 0xab, 0x72, 0xd7, 0xf8, 0x9f, 0x0a, 0xc0, 0x9e, 0x35, 0x0e, 0xa5, 0xf3, - 0xc1, 0xbe, 0x0b, 0xed, 0x98, 0x6a, 0xf2, 0xee, 0x45, 0x66, 0xff, 0x97, 0x76, 0xb7, 0x82, 0x54, - 0x15, 0x71, 0x68, 0x1c, 0xe2, 0xbc, 0x4c, 0xde, 0xbe, 0xec, 0x21, 0xcf, 0xbf, 0x68, 0x64, 0x04, - 0x74, 0xed, 0x7d, 0x03, 0x7a, 0x8a, 0x20, 0x14, 0x91, 0x2d, 0x7c, 0x69, 0x67, 0x2b, 0xbc, 0x2b, - 0xa1, 0xbb, 0x12, 0xc8, 0x3e, 0xc8, 0xc9, 0xec, 0xc0, 0x4b, 0xc7, 0x0b, 0xb5, 0x4d, 0x35, 0xd9, - 0x94, 0x04, 0xc6, 0x7a, 0x36, 0x15, 0x1a, 0x88, 0x06, 0x75, 0xfc, 0x5e, 0xff, 0x0d, 0xd6, 0x86, - 0x96, 0xea, 0xb5, 0x5f, 0x61, 0x5d, 0xd0, 0x29, 0x09, 0x99, 0x70, 0x55, 0xe3, 0x8f, 0xcf, 0x40, - 0x7b, 0xdb, 0x8f, 0x93, 0x28, 0x95, 0x42, 0x2c, 0x72, 0x6d, 0x1b, 0x94, 0x6b, 0xab, 0x12, 0x70, - 0xe4, 0x34, 0x28, 0x01, 0xe7, 0x26, 0xd4, 0x2d, 0x3f, 0x71, 0x95, 0xa3, 0x59, 0x4a, 0xe8, 0xce, - 0x42, 0x7b, 0x9c, 0xf0, 0xec, 0x36, 0xb4, 0x54, 0xf6, 0xb7, 0x4a, 0xae, 0x5c, 0x98, 0x3a, 0x9e, - 0xd1, 0xb0, 0x35, 0xd0, 0x1c, 0x95, 0x96, 0xae, 0x16, 0x49, 0xa9, 0xeb, 0x2c, 0x61, 0x9d, 0xe7, - 0x34, 0xec, 0x1a, 0xd4, 0xac, 0x91, 0x5c, 0x0f, 0x94, 0x10, 0x93, 0x91, 0x52, 0x32, 0x2f, 0x47, - 0x1c, 0x33, 0xa0, 0x8e, 0xee, 0x2d, 0xad, 0x09, 0xda, 0x06, 0x33, 0x1a, 0x39, 0x4a, 0xc4, 0xb1, - 0x3b, 0xea, 0x14, 0x4a, 0x84, 0xda, 0xec, 0x77, 0xb3, 0xab, 0x1f, 0x79, 0x1a, 0xfd, 0x54, 0x35, - 0x88, 0xc5, 0xd8, 0x95, 0x0d, 0xf4, 0xd9, 0x06, 0x59, 0xf8, 0x8c, 0x6b, 0x71, 0x16, 0x48, 0xbb, - 0x0b, 0xed, 0x98, 0xe2, 0x3c, 0xb2, 0x09, 0x64, 0x59, 0x00, 0x79, 0x93, 0x3c, 0x08, 0xc4, 0x21, - 0x2e, 0x02, 0x42, 0x77, 0x40, 0x1f, 0x5b, 0xd1, 0x91, 0x6c, 0xd4, 0x9e, 0xfd, 0x4e, 0x16, 0x84, - 0xe0, 0xda, 0x38, 0x0b, 0x47, 0xac, 0x03, 0xc8, 0x85, 0x45, 0x2d, 0x3a, 0xb3, 0x2c, 0xcf, 0x0f, - 0xde, 0x5c, 0x77, 0xf2, 0x33, 0xf8, 0xbb, 0xd0, 0x0a, 0xe5, 0xb9, 0x83, 0x32, 0xc7, 0xda, 0xeb, - 0xcb, 0x45, 0x03, 0x75, 0x20, 0xe1, 0x19, 0x05, 0xfb, 0x0e, 0xf4, 0x64, 0xaa, 0xc6, 0x50, 0xb9, - 0xe9, 0x94, 0x4d, 0x36, 0x95, 0x95, 0x3c, 0xe5, 0xc5, 0xf3, 0x6e, 0x32, 0xe5, 0xd4, 0x7f, 0x0c, - 0x5d, 0xa1, 0xbc, 0x28, 0x33, 0xb6, 0x2d, 0x7f, 0xd0, 0xa7, 0xe6, 0xe7, 0x17, 0x3b, 0x59, 0xbc, - 0x23, 0xca, 0x2e, 0xf1, 0x2a, 0x34, 0x55, 0xfa, 0xd0, 0x32, 0xb5, 0x2a, 0xbd, 0xb6, 0x91, 0xb7, - 0xdd, 0x5c, 0xe1, 0xd9, 0xbd, 0x99, 0x3c, 0x04, 0x74, 0xa3, 0x58, 0x96, 0x1a, 0xb4, 0x38, 0xb9, - 0x60, 0x2a, 0x43, 0xe1, 0x33, 0x71, 0x8c, 0xbc, 0x2c, 0xf2, 0x37, 0x06, 0x67, 0x66, 0x79, 0x99, - 0x27, 0x6f, 0x70, 0x3d, 0xcf, 0xdb, 0x40, 0x83, 0x54, 0xce, 0x27, 0x91, 0x57, 0xf2, 0x67, 0xa9, - 0xe9, 0x9b, 0x0b, 0x9a, 0xca, 0x9b, 0x79, 0xbe, 0x14, 0xce, 0xa4, 0xa5, 0xbc, 0x07, 0x5a, 0x10, - 0x39, 0x94, 0x26, 0x36, 0x38, 0x47, 0x2b, 0x7e, 0x59, 0x65, 0x7b, 0xc9, 0xb4, 0x7a, 0x32, 0x64, - 0xad, 0x40, 0x56, 0xd8, 0x6d, 0xe8, 0x84, 0x51, 0xf0, 0x43, 0x61, 0x27, 0xd2, 0x59, 0x3e, 0x3f, - 0x9f, 0x8e, 0xaf, 0xf0, 0xe4, 0x3b, 0x17, 0xce, 0xf0, 0x85, 0x17, 0x3a, 0xc3, 0x2b, 0x99, 0xfb, - 0x37, 0x98, 0xcf, 0x7d, 0x20, 0x04, 0xf6, 0xa2, 0x1c, 0xc7, 0x37, 0xe7, 0x7b, 0x51, 0x4e, 0xe4, - 0x00, 0x5a, 0x6e, 0xfc, 0xc0, 0x8d, 0xe2, 0x64, 0x70, 0x31, 0xdb, 0x74, 0xa8, 0x8a, 0x6e, 0xa7, - 0x1b, 0x3f, 0xb4, 0xe2, 0x64, 0x70, 0x29, 0x7b, 0x51, 0x81, 0x35, 0xe4, 0xb9, 0x0c, 0x13, 0x90, - 0xfe, 0x5e, 0x9e, 0xe5, 0x79, 0x7e, 0xa5, 0xa7, 0xe2, 0x3d, 0xa4, 0xbf, 0x9f, 0xc0, 0x92, 0x6c, - 0x53, 0x2c, 0xc9, 0xb7, 0x66, 0x75, 0x72, 0xea, 0x6e, 0x88, 0x77, 0xa3, 0xa9, 0xab, 0xa2, 0xbc, - 0x03, 0x34, 0x59, 0xb2, 0x83, 0x2b, 0x0b, 0x3b, 0xc8, 0x8d, 0x9b, 0xec, 0x20, 0xbf, 0xc6, 0xb8, - 0x05, 0x4d, 0x95, 0xf3, 0x76, 0x75, 0xce, 0x68, 0xa9, 0xec, 0x4e, 0xae, 0x28, 0xd8, 0x37, 0xa0, - 0x45, 0x09, 0x4f, 0x41, 0x38, 0x58, 0x99, 0x55, 0x62, 0x99, 0xd7, 0xc4, 0x9b, 0x9e, 0xcc, 0x6f, - 0x7a, 0x17, 0x5a, 0x59, 0x3c, 0xe1, 0xda, 0xec, 0xc2, 0x54, 0x7b, 0x3b, 0xcf, 0x28, 0xd8, 0x0d, - 0x68, 0x8c, 0xd1, 0xa4, 0x0f, 0x8c, 0x59, 0x63, 0x28, 0x2d, 0xbd, 0xc4, 0x92, 0x21, 0xa2, 0x63, - 0x82, 0x5c, 0x7d, 0x6f, 0xcf, 0x19, 0xa2, 0xfc, 0x0c, 0xc1, 0x21, 0x2e, 0xce, 0x13, 0xbf, 0x0d, - 0x17, 0xcb, 0xb9, 0x4c, 0x59, 0xa2, 0x93, 0x3a, 0xff, 0x5d, 0xa7, 0x5e, 0xae, 0x2d, 0x50, 0xf0, - 0xe9, 0x94, 0x28, 0x7e, 0x21, 0x7c, 0x41, 0xae, 0xd4, 0xdd, 0x7c, 0xc3, 0x44, 0xbb, 0x32, 0xb8, - 0x31, 0x37, 0xac, 0x7c, 0xcb, 0xcd, 0xb6, 0x51, 0xda, 0xa9, 0x3f, 0x82, 0xce, 0x30, 0x7d, 0xfe, - 0xfc, 0x58, 0x85, 0x21, 0x06, 0x37, 0xa9, 0x5d, 0xe9, 0xac, 0x5b, 0xca, 0xcc, 0xe1, 0xed, 0x61, - 0x29, 0x4d, 0xe7, 0x02, 0xb4, 0x6c, 0xdf, 0xb4, 0x1c, 0x27, 0x1a, 0xbc, 0x23, 0x33, 0x73, 0x6c, - 0x7f, 0xc3, 0x71, 0x28, 0xc5, 0x29, 0x08, 0x05, 0x3d, 0x4d, 0x31, 0x5d, 0x67, 0xb0, 0x2a, 0xb7, - 0xee, 0x0c, 0xb4, 0xed, 0xd0, 0xa3, 0x37, 0x2b, 0xb2, 0x3c, 0x4f, 0x78, 0x48, 0xf0, 0x0d, 0xf5, - 0xe8, 0x4d, 0x81, 0xb6, 0x1d, 0x76, 0x0d, 0x3a, 0x63, 0x6b, 0x62, 0x66, 0x90, 0xc1, 0x2d, 0xf9, - 0xa2, 0x68, 0x6c, 0x4d, 0x76, 0x15, 0x08, 0xd5, 0x5c, 0x26, 0x24, 0x93, 0xb2, 0xbd, 0x3b, 0xab, - 0xe6, 0x79, 0x04, 0x86, 0xeb, 0x6e, 0x1e, 0x8c, 0x21, 0x73, 0x44, 0x46, 0xd8, 0xf4, 0xd6, 0x07, - 0xef, 0xcd, 0x9b, 0x23, 0x15, 0x3a, 0x42, 0x73, 0x94, 0x45, 0x91, 0xd6, 0x01, 0xa4, 0xb5, 0x26, - 0x61, 0xdf, 0x9e, 0x6d, 0x93, 0x9f, 0xe5, 0xb8, 0xcc, 0xc6, 0x25, 0x51, 0xaf, 0x03, 0xd0, 0xa9, - 0x52, 0xb6, 0x59, 0x9b, 0x6d, 0x93, 0x1f, 0xe5, 0xb8, 0xfe, 0x34, 0x3f, 0xd5, 0xdd, 0x01, 0x3d, - 0xc5, 0x43, 0x9b, 0x69, 0x79, 0xde, 0xe0, 0xce, 0xec, 0x1a, 0xc8, 0xce, 0x73, 0x5c, 0x4b, 0x55, - 0x09, 0x3f, 0x42, 0x51, 0x68, 0x72, 0xe3, 0x06, 0xef, 0xcf, 0x7e, 0x24, 0x3f, 0xf4, 0x71, 0xfd, - 0x30, 0x3f, 0xff, 0x7d, 0x0c, 0xdd, 0x2c, 0x84, 0x2a, 0x9b, 0x7d, 0x30, 0xbb, 0x75, 0x94, 0xcf, - 0x03, 0x3c, 0x7b, 0xd6, 0x25, 0x1b, 0xdf, 0x85, 0xb6, 0xe4, 0xb8, 0x6c, 0xba, 0x3e, 0xab, 0x60, - 0x85, 0x53, 0xc9, 0xa5, 0x68, 0x64, 0xb3, 0x1b, 0xd0, 0xb0, 0xc2, 0xd0, 0x3b, 0x1e, 0x7c, 0x38, - 0xbb, 0xaa, 0x36, 0x10, 0xcc, 0x25, 0x16, 0xf5, 0x70, 0x9c, 0x7a, 0x89, 0x9b, 0xa5, 0x16, 0x7f, - 0x73, 0x56, 0x0f, 0x4b, 0x4f, 0x17, 0x78, 0x7b, 0x5c, 0x7a, 0x63, 0xf1, 0x1e, 0x68, 0x61, 0x10, - 0x27, 0xa6, 0x33, 0xf6, 0x06, 0x77, 0xe7, 0x76, 0x5f, 0x99, 0xbf, 0xca, 0x5b, 0xa1, 0x2c, 0x18, - 0x77, 0xa1, 0xb3, 0x41, 0x8f, 0x3d, 0xdd, 0x98, 0x4c, 0xf9, 0x0d, 0xa8, 0xe7, 0x11, 0xc2, 0x7c, - 0x8f, 0x20, 0x8a, 0xe7, 0x62, 0xdb, 0x1f, 0x06, 0x9c, 0xd0, 0xc6, 0xdf, 0xd7, 0xa0, 0xb9, 0x17, - 0xa4, 0x91, 0x2d, 0x5e, 0x9e, 0x99, 0xfd, 0x56, 0xa6, 0x32, 0x7e, 0x91, 0xb5, 0x26, 0xb5, 0x83, - 0xd0, 0xe5, 0xe0, 0x63, 0x8d, 0x82, 0x32, 0x79, 0xf0, 0xf1, 0x2c, 0x34, 0xe4, 0xa1, 0x5e, 0xe6, - 0x06, 0xcb, 0x0a, 0x2d, 0x97, 0x34, 0x3e, 0x74, 0x82, 0x67, 0x3e, 0x2e, 0x97, 0x06, 0xa5, 0xd6, - 0x42, 0x06, 0xda, 0x76, 0xe8, 0x79, 0x4b, 0x46, 0x40, 0xeb, 0x51, 0x46, 0x82, 0x3a, 0x19, 0x90, - 0x56, 0x65, 0x16, 0xd8, 0x6c, 0xbd, 0x20, 0xb0, 0x79, 0x05, 0xea, 0x7e, 0x96, 0x93, 0x9a, 0xe3, - 0xe9, 0x61, 0x21, 0xc1, 0xd9, 0x2d, 0xc8, 0xd3, 0xc9, 0x95, 0xbf, 0xf6, 0xe2, 0x74, 0xf3, 0x75, - 0xd0, 0xf3, 0xa7, 0xc2, 0xb9, 0xa7, 0x56, 0x3c, 0x1e, 0xde, 0xcf, 0x4a, 0xbc, 0x20, 0x5b, 0x10, - 0x11, 0x0d, 0xa3, 0xe0, 0x40, 0x05, 0xaf, 0xda, 0xaf, 0x12, 0x11, 0xdd, 0xc5, 0x76, 0x59, 0x9c, - 0xd7, 0x8d, 0x4d, 0x3b, 0xf0, 0x29, 0xe8, 0xad, 0xb6, 0xcf, 0x4d, 0xac, 0x1a, 0x7f, 0x53, 0x01, - 0x0d, 0x67, 0x87, 0x32, 0x66, 0x0c, 0xea, 0x63, 0x3b, 0x4c, 0x95, 0xbf, 0x4e, 0x65, 0xf5, 0x14, - 0x58, 0x4a, 0x4f, 0x3d, 0x05, 0x26, 0xde, 0xd6, 0x64, 0xb8, 0x12, 0xcb, 0xf2, 0x91, 0xe1, 0xb1, - 0x17, 0x58, 0x8e, 0x92, 0x58, 0x56, 0x65, 0xef, 0x01, 0x93, 0xaf, 0xe0, 0x26, 0xa1, 0xe5, 0x3b, - 0xea, 0x6d, 0xaa, 0x4a, 0xe6, 0xea, 0xd3, 0x73, 0x38, 0x42, 0xc8, 0x87, 0xa9, 0xec, 0x1c, 0x34, - 0x6d, 0xdf, 0xb4, 0xfd, 0x44, 0x9d, 0x4b, 0x1b, 0xb6, 0xbf, 0xe9, 0x27, 0x0a, 0xec, 0xe6, 0xc7, - 0xd1, 0x86, 0xed, 0x6f, 0x3b, 0x13, 0xe3, 0xcf, 0x2a, 0xb0, 0xbc, 0x1b, 0x05, 0xb6, 0x88, 0xe3, - 0x87, 0xe8, 0x48, 0x58, 0xe4, 0x16, 0x32, 0xa8, 0x53, 0x44, 0x53, 0xbe, 0xef, 0xa3, 0x32, 0x6a, - 0xa2, 0x0c, 0x15, 0xe5, 0x67, 0xa8, 0x1a, 0xd7, 0x09, 0x42, 0x47, 0xa8, 0x1c, 0x4d, 0x0d, 0x6b, - 0x25, 0x34, 0xc5, 0x42, 0x6f, 0x40, 0xaf, 0x78, 0xfd, 0x41, 0x3d, 0xa8, 0x87, 0xbd, 0x39, 0x94, - 0x7a, 0xb9, 0x0a, 0xed, 0x48, 0x58, 0xe8, 0x6a, 0x51, 0x37, 0x0d, 0xa2, 0x01, 0x09, 0xc2, 0x7e, - 0x8c, 0x43, 0xe8, 0xef, 0x46, 0x22, 0xb4, 0x22, 0x81, 0xd6, 0x7b, 0x4c, 0x1c, 0x3f, 0x0f, 0x4d, - 0x4f, 0xf8, 0xa3, 0xe4, 0x50, 0x8d, 0x57, 0xd5, 0xf2, 0x47, 0xdd, 0xd5, 0xd2, 0xa3, 0x6e, 0xe4, - 0x7c, 0x24, 0x2c, 0xf5, 0xf6, 0x9b, 0xca, 0xb8, 0x52, 0xfc, 0xd4, 0x53, 0x51, 0x56, 0x8d, 0xcb, - 0x8a, 0xf1, 0xa7, 0x35, 0x68, 0x2b, 0xce, 0xd0, 0x57, 0xa4, 0x0c, 0x2b, 0xb9, 0x0c, 0xfb, 0x50, - 0x8b, 0x9f, 0x78, 0x4a, 0xa8, 0x58, 0x64, 0x1f, 0x42, 0xcd, 0x73, 0xc7, 0xea, 0x10, 0x76, 0x69, - 0x6a, 0x2f, 0x98, 0xe6, 0xaf, 0x3a, 0x4b, 0x23, 0x35, 0xbb, 0x44, 0xb6, 0x7a, 0x62, 0xa2, 0xca, - 0x29, 0x9e, 0xa0, 0x5d, 0x9e, 0xa0, 0x5e, 0x23, 0x53, 0x2d, 0x9b, 0x12, 0x88, 0xb3, 0xc5, 0xda, - 0xe5, 0xba, 0x82, 0x6c, 0x3b, 0xec, 0x9b, 0xa0, 0xc5, 0xbe, 0x15, 0xc6, 0x87, 0x41, 0xa2, 0x0e, - 0x5d, 0x6c, 0x2d, 0x99, 0xf8, 0x6b, 0x9b, 0x8f, 0xf6, 0x27, 0xfe, 0x9e, 0xc2, 0xa8, 0x8f, 0xe5, - 0x94, 0xec, 0x3b, 0xd0, 0x89, 0x45, 0x1c, 0xcb, 0x67, 0x38, 0xc3, 0x40, 0x2d, 0xe2, 0x73, 0xe5, - 0x03, 0x13, 0x61, 0x71, 0xd6, 0xaa, 0x71, 0x3b, 0x2e, 0x40, 0xec, 0xfb, 0xd0, 0xcb, 0xda, 0x7b, - 0xc1, 0x68, 0x24, 0xb2, 0x87, 0x16, 0x97, 0xe6, 0x7a, 0x78, 0x48, 0xe8, 0x52, 0x3f, 0xdd, 0xb8, - 0x8c, 0x60, 0xdf, 0x83, 0x5e, 0x28, 0x85, 0x69, 0xaa, 0x2b, 0x00, 0x69, 0x0c, 0x2e, 0x4e, 0xb9, - 0x2e, 0x53, 0xc2, 0x2e, 0x92, 0xf4, 0x0b, 0x78, 0x6c, 0xfc, 0x57, 0x05, 0xda, 0xa5, 0x51, 0xd3, - 0x53, 0xfb, 0x58, 0x44, 0xd9, 0x75, 0x00, 0x96, 0x11, 0x76, 0x18, 0xa8, 0x17, 0xaa, 0x3a, 0xa7, - 0x32, 0xc2, 0xa2, 0x40, 0xdd, 0x0f, 0xe9, 0x9c, 0xca, 0x68, 0x00, 0xd5, 0xf9, 0x57, 0x3e, 0xf0, - 0x23, 0xa1, 0xd4, 0x79, 0xa7, 0x00, 0x6e, 0x53, 0x74, 0x0b, 0xd5, 0xe9, 0xc0, 0x8a, 0xb3, 0x0b, - 0x8a, 0xbc, 0x8e, 0x0b, 0xf9, 0xa9, 0x88, 0x70, 0x2c, 0xca, 0x76, 0x66, 0x55, 0x94, 0x35, 0xd9, - 0xa4, 0xe7, 0x81, 0x2f, 0x6f, 0x73, 0x3b, 0x5c, 0x43, 0xc0, 0x0f, 0x02, 0x9f, 0x9a, 0x29, 0xc9, - 0xaa, 0xcb, 0xc1, 0xac, 0x8a, 0x96, 0xe7, 0x49, 0x2a, 0xd0, 0xbd, 0x73, 0xe8, 0x42, 0x50, 0xe7, - 0x2d, 0xaa, 0x6f, 0x3b, 0xc6, 0xbf, 0x55, 0x60, 0x79, 0x8e, 0xd9, 0xe8, 0x4d, 0x21, 0xa3, 0xb3, - 0xb7, 0x13, 0x1d, 0xde, 0xc4, 0xea, 0xb6, 0x43, 0x88, 0x64, 0x4c, 0xca, 0x54, 0x55, 0x88, 0x64, - 0x8c, 0x9a, 0x74, 0x0e, 0x9a, 0xc9, 0x84, 0x66, 0x2b, 0x17, 0x46, 0x23, 0x99, 0xe0, 0x34, 0x37, - 0x40, 0xf7, 0x82, 0x91, 0xe9, 0x89, 0xa7, 0xc2, 0x23, 0x3e, 0xf4, 0xd6, 0xaf, 0x9f, 0x20, 0xe5, - 0xb5, 0x87, 0xc1, 0xe8, 0x21, 0xd2, 0x72, 0xcd, 0x53, 0x25, 0xe3, 0x53, 0xd0, 0x32, 0x28, 0xd3, - 0xa1, 0xb1, 0x25, 0x0e, 0xd2, 0x51, 0xff, 0x0d, 0xa6, 0x41, 0x1d, 0x5b, 0xf4, 0x2b, 0x58, 0xfa, - 0xc2, 0x8a, 0xfc, 0x7e, 0x15, 0xd1, 0xf7, 0xa3, 0x28, 0x88, 0xfa, 0x35, 0x2c, 0xee, 0x5a, 0xbe, - 0x6b, 0xf7, 0xeb, 0x58, 0x7c, 0x60, 0x25, 0x96, 0xd7, 0x6f, 0x18, 0x7f, 0xde, 0x00, 0x6d, 0x57, - 0x7d, 0x9d, 0x6d, 0x41, 0x37, 0xff, 0xdb, 0xc1, 0xe2, 0xc0, 0xd0, 0xee, 0x6c, 0x81, 0x02, 0x43, - 0x9d, 0xb0, 0x54, 0x9b, 0xfd, 0x67, 0x42, 0x75, 0xee, 0x9f, 0x09, 0x97, 0xa1, 0xf6, 0x24, 0x3a, - 0x9e, 0xbe, 0xc2, 0xdb, 0xf5, 0x2c, 0x9f, 0x23, 0x98, 0x7d, 0x00, 0x6d, 0x94, 0xbb, 0x19, 0xd3, - 0x76, 0xae, 0x82, 0x2a, 0xe5, 0x3f, 0x53, 0x10, 0x9c, 0x03, 0x12, 0xa9, 0x2d, 0x7f, 0x0d, 0x34, - 0xfb, 0xd0, 0xf5, 0x9c, 0x48, 0xf8, 0x2a, 0x52, 0xcd, 0xe6, 0x87, 0xcc, 0x73, 0x1a, 0xf6, 0x5d, - 0x7a, 0x4d, 0x90, 0x05, 0x83, 0xca, 0xc9, 0x4c, 0xe7, 0xa6, 0xce, 0xdb, 0x19, 0x05, 0x5f, 0x2a, - 0x91, 0xd3, 0xce, 0x55, 0x3c, 0x45, 0x6b, 0x95, 0x9f, 0xa2, 0xc9, 0x77, 0xf4, 0xb4, 0xe1, 0x68, - 0xf9, 0xa9, 0x0f, 0xf7, 0x9b, 0x9b, 0x6a, 0xf7, 0x9e, 0x8b, 0xa4, 0x64, 0x7b, 0x9c, 0xda, 0xc5, - 0xaf, 0x43, 0x0f, 0xbd, 0x02, 0x53, 0x3a, 0x13, 0x68, 0x4a, 0x40, 0x3d, 0x85, 0x4d, 0xe3, 0xc3, - 0x2d, 0x74, 0x27, 0x50, 0x19, 0x6f, 0x40, 0x2f, 0x9b, 0x8b, 0x7a, 0x0b, 0x21, 0x73, 0x38, 0xba, - 0x19, 0x54, 0x3e, 0x85, 0x58, 0x83, 0x33, 0xf6, 0xa1, 0xe5, 0xfb, 0xc2, 0x33, 0x0f, 0xd2, 0xe1, - 0x30, 0xdb, 0x01, 0xe4, 0xf5, 0xf2, 0xb2, 0x42, 0xdd, 0x23, 0x0c, 0x6d, 0x28, 0x06, 0x74, 0x7d, - 0xd7, 0x93, 0xef, 0x07, 0x69, 0xb7, 0xeb, 0x12, 0x65, 0xdb, 0x77, 0x3d, 0x0a, 0x22, 0xe3, 0x9e, - 0xf7, 0x09, 0xf4, 0xd3, 0xd4, 0x75, 0x62, 0x33, 0x09, 0xb2, 0x5f, 0x10, 0x0c, 0x7a, 0xc4, 0xba, - 0x92, 0x97, 0xfa, 0x38, 0x75, 0x9d, 0xfd, 0x40, 0xfd, 0x84, 0xa0, 0x4b, 0xf4, 0x59, 0xd5, 0xf8, - 0x04, 0x3a, 0x65, 0xdd, 0x41, 0x5d, 0xa4, 0xe3, 0x5b, 0xff, 0x0d, 0x06, 0xd0, 0x7c, 0x14, 0x44, - 0x63, 0xcb, 0xeb, 0x57, 0xb0, 0x2c, 0x1f, 0x68, 0xf6, 0xab, 0xac, 0x03, 0x5a, 0x76, 0xae, 0xe8, - 0xd7, 0x8c, 0x8f, 0x41, 0xcb, 0xfe, 0xa9, 0x40, 0x8f, 0xd9, 0x03, 0x47, 0x48, 0xaf, 0x4a, 0x5a, - 0x26, 0x0d, 0x01, 0xe4, 0x51, 0x65, 0x3f, 0x07, 0xa9, 0x16, 0x3f, 0x07, 0x31, 0x7e, 0x03, 0x3a, - 0xe5, 0xc1, 0x65, 0x71, 0xbf, 0x4a, 0x11, 0xf7, 0x5b, 0xd0, 0x8a, 0x2e, 0xea, 0xa2, 0x60, 0x6c, - 0x96, 0x1c, 0x0c, 0x0d, 0x01, 0xf8, 0x19, 0xe3, 0xf7, 0x2a, 0xd0, 0x20, 0x57, 0x99, 0xb6, 0x16, - 0x2c, 0x14, 0x6b, 0xa7, 0xc1, 0x75, 0x82, 0xd0, 0x4c, 0xcb, 0x17, 0xde, 0xd5, 0x17, 0x5f, 0x78, - 0xd7, 0xa6, 0x2f, 0xbc, 0x4f, 0x99, 0xdb, 0x74, 0xeb, 0x09, 0x34, 0xe5, 0xff, 0x58, 0xd8, 0x32, - 0x74, 0x1f, 0xfb, 0x47, 0x7e, 0xf0, 0xcc, 0x97, 0x80, 0xfe, 0x1b, 0xec, 0x0c, 0x2c, 0x65, 0x4c, - 0x57, 0x3f, 0x7e, 0xe9, 0x57, 0x58, 0x1f, 0x3a, 0x24, 0xd6, 0x0c, 0x52, 0x65, 0x97, 0x61, 0xa0, - 0x36, 0x87, 0xad, 0xc0, 0x17, 0x8f, 0x82, 0xc4, 0x1d, 0x1e, 0x67, 0xd8, 0x1a, 0x5b, 0x82, 0xf6, - 0x5e, 0x12, 0x84, 0x7b, 0xc2, 0x77, 0x5c, 0x7f, 0xd4, 0xaf, 0xdf, 0x7a, 0x00, 0x4d, 0xf9, 0x9b, - 0x98, 0xd2, 0x27, 0x25, 0xa0, 0xff, 0x06, 0x52, 0x7f, 0x61, 0xb9, 0x89, 0xeb, 0x8f, 0x1e, 0x89, - 0x49, 0x22, 0x8d, 0xd2, 0x43, 0x2b, 0x4e, 0xfa, 0x55, 0xd6, 0x03, 0x50, 0xbd, 0xde, 0xf7, 0x9d, - 0x7e, 0xed, 0xde, 0xe6, 0x4f, 0x7f, 0x76, 0xa5, 0xf2, 0x0f, 0x3f, 0xbb, 0x52, 0xf9, 0xe7, 0x9f, - 0x5d, 0x79, 0xe3, 0x8f, 0xfe, 0xe5, 0x4a, 0xe5, 0x07, 0x1f, 0x94, 0x7e, 0x82, 0x33, 0xb6, 0x92, - 0xc8, 0x9d, 0xc8, 0xab, 0xce, 0xac, 0xe2, 0x8b, 0x3b, 0xe1, 0xd1, 0xe8, 0x4e, 0x78, 0x70, 0x27, - 0xd3, 0xb9, 0x83, 0x26, 0xfd, 0xdb, 0xe6, 0xc3, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x56, 0x51, - 0xd9, 0x95, 0x5a, 0x47, 0x00, 0x00, + 0x48, 0x33, 0x4d, 0x2a, 0x46, 0xf6, 0x90, 0xc1, 0x70, 0xa6, 0xdf, 0xe3, 0x2c, 0xe7, 0xcd, 0x8c, + 0xe6, 0x47, 0x7a, 0xd4, 0x29, 0x40, 0x72, 0xcd, 0x29, 0xa7, 0x20, 0x97, 0x60, 0x0f, 0x09, 0x72, + 0x08, 0x12, 0x24, 0x08, 0x10, 0x20, 0xd8, 0xfb, 0xee, 0x25, 0xc8, 0x29, 0xc7, 0x20, 0xd8, 0xdc, + 0xf2, 0x73, 0xdb, 0x04, 0xb9, 0x04, 0x08, 0xaa, 0xba, 0xe7, 0xe7, 0xfd, 0x88, 0xfa, 0xb1, 0x1d, + 0xec, 0x02, 0x7b, 0xeb, 0xae, 0xaa, 0xee, 0xe9, 0xae, 0xaa, 0xae, 0xae, 0xae, 0xae, 0x1e, 0xe8, + 0x85, 0x6e, 0x28, 0x3c, 0xd7, 0x17, 0x6b, 0x61, 0x14, 0x24, 0x01, 0xd3, 0xb2, 0xfa, 0xc5, 0xdb, + 0x23, 0x37, 0x39, 0x4a, 0x0f, 0xd7, 0xec, 0x60, 0x7c, 0x67, 0x14, 0x8c, 0x82, 0x3b, 0x44, 0x70, + 0x98, 0x0e, 0xa9, 0x46, 0x15, 0x2a, 0xc9, 0x86, 0x17, 0x21, 0xf4, 0x2c, 0x5f, 0x95, 0x97, 0x12, + 0x77, 0x2c, 0xe2, 0xc4, 0x1a, 0x87, 0x19, 0xd2, 0x0b, 0xec, 0x63, 0x55, 0xd6, 0x93, 0x89, 0xa2, + 0x33, 0xfe, 0xa8, 0x0a, 0xad, 0x1d, 0x11, 0xc7, 0xd6, 0x48, 0x30, 0x03, 0x6a, 0xb1, 0xeb, 0x0c, + 0x2a, 0x2b, 0x95, 0xd5, 0xde, 0x7a, 0x7f, 0x2d, 0x1f, 0xd6, 0x7e, 0x62, 0x25, 0x69, 0xcc, 0x11, + 0x89, 0x34, 0xf6, 0xd8, 0x19, 0x54, 0x67, 0x69, 0x76, 0x44, 0x72, 0x14, 0x38, 0x1c, 0x91, 0xac, + 0x0f, 0x35, 0x11, 0x45, 0x83, 0xda, 0x4a, 0x65, 0xb5, 0xc3, 0xb1, 0xc8, 0x18, 0xd4, 0x1d, 0x2b, + 0xb1, 0x06, 0x75, 0x02, 0x51, 0x99, 0x5d, 0x87, 0x5e, 0x18, 0x05, 0xb6, 0xe9, 0xfa, 0xc3, 0xc0, + 0x24, 0x6c, 0x83, 0xb0, 0x1d, 0x84, 0x6e, 0xfb, 0xc3, 0x60, 0x0b, 0xa9, 0x06, 0xd0, 0xb2, 0x7c, + 0xcb, 0x3b, 0x89, 0xc5, 0xa0, 0x49, 0xe8, 0xac, 0xca, 0x7a, 0x50, 0x75, 0x9d, 0x41, 0x6b, 0xa5, + 0xb2, 0x5a, 0xe7, 0x55, 0xd7, 0xc1, 0x6f, 0xa4, 0xa9, 0xeb, 0x0c, 0x34, 0xf9, 0x0d, 0x2c, 0x33, + 0x03, 0x3a, 0xbe, 0x10, 0xce, 0x6e, 0x90, 0x70, 0x11, 0x7a, 0x27, 0x03, 0x7d, 0xa5, 0xb2, 0xaa, + 0xf1, 0x29, 0x18, 0xbb, 0x08, 0x9a, 0x23, 0x0e, 0xd3, 0xd1, 0x4e, 0x3c, 0x1a, 0xc0, 0x4a, 0x65, + 0x55, 0xe7, 0x79, 0xdd, 0x78, 0x04, 0xfa, 0x66, 0xe0, 0xfb, 0xc2, 0x4e, 0x82, 0x88, 0x5d, 0x85, + 0x76, 0x36, 0x5d, 0x53, 0xb1, 0xa9, 0xc1, 0x21, 0x03, 0x6d, 0x3b, 0xec, 0x1d, 0x58, 0xb2, 0x33, + 0x6a, 0xd3, 0xf5, 0x1d, 0x31, 0x21, 0x3e, 0x35, 0x78, 0x2f, 0x07, 0x6f, 0x23, 0xd4, 0xf8, 0xf7, + 0x2a, 0xb4, 0xf6, 0x8f, 0xd2, 0xe1, 0xd0, 0x13, 0xec, 0x3a, 0x74, 0x55, 0x71, 0x33, 0xf0, 0xb6, + 0x9d, 0x89, 0xea, 0x77, 0x1a, 0xc8, 0x56, 0xa0, 0xad, 0x00, 0x07, 0x27, 0xa1, 0x50, 0xdd, 0x96, + 0x41, 0xd3, 0xfd, 0xec, 0xb8, 0x3e, 0xb1, 0xbf, 0xc6, 0xa7, 0x81, 0x33, 0x54, 0xd6, 0x84, 0x24, + 0x32, 0x4d, 0x65, 0xd1, 0xd7, 0x36, 0x3c, 0xf7, 0x89, 0xe0, 0x62, 0xb4, 0xe9, 0x27, 0x24, 0x97, + 0x06, 0x2f, 0x83, 0xd8, 0x3a, 0x9c, 0x8b, 0x65, 0x13, 0x33, 0xb2, 0xfc, 0x91, 0x88, 0xcd, 0xd4, + 0xf5, 0x93, 0xff, 0xf7, 0xcd, 0x41, 0x73, 0xa5, 0xb6, 0x5a, 0xe7, 0x67, 0x14, 0x92, 0x13, 0xee, + 0x11, 0xa1, 0xd8, 0xfb, 0x70, 0x76, 0xa6, 0x8d, 0x6c, 0xd2, 0x5a, 0xa9, 0xad, 0xd6, 0x38, 0x9b, + 0x6a, 0xb2, 0x4d, 0x2d, 0xee, 0xc3, 0x72, 0x94, 0xfa, 0xa8, 0xc9, 0x0f, 0x5c, 0x2f, 0x11, 0xd1, + 0x7e, 0x28, 0x6c, 0x92, 0x6f, 0x7b, 0xfd, 0xc2, 0x1a, 0x29, 0x3b, 0x9f, 0x45, 0xf3, 0xf9, 0x16, + 0xc6, 0x7f, 0x57, 0x41, 0xdb, 0x72, 0xe3, 0xd0, 0x4a, 0xec, 0x23, 0x76, 0x01, 0x5a, 0xc3, 0xd4, + 0xb7, 0x0b, 0x09, 0x36, 0xb1, 0xba, 0xed, 0xb0, 0x5f, 0x87, 0x25, 0x2f, 0xb0, 0x2d, 0xcf, 0xcc, + 0x85, 0x35, 0xa8, 0xae, 0xd4, 0x56, 0xdb, 0xeb, 0x67, 0x0a, 0x2d, 0xcf, 0x95, 0x81, 0xf7, 0x88, + 0xb6, 0x50, 0x8e, 0x6f, 0x43, 0x3f, 0x12, 0xe3, 0x20, 0x11, 0xa5, 0xe6, 0x35, 0x6a, 0xce, 0x8a, + 0xe6, 0x5f, 0x44, 0x56, 0xb8, 0x1b, 0x38, 0x82, 0x2f, 0x49, 0xda, 0xa2, 0xf9, 0x07, 0x25, 0x7e, + 0x8a, 0x91, 0xe9, 0x3a, 0x13, 0x93, 0x3e, 0x30, 0xa8, 0xaf, 0xd4, 0x56, 0x1b, 0x05, 0x73, 0xc4, + 0x68, 0xdb, 0x99, 0x3c, 0x44, 0x0c, 0xfb, 0x10, 0xce, 0xcf, 0x36, 0x91, 0xbd, 0x0e, 0x1a, 0xd4, + 0xe6, 0xcc, 0x54, 0x1b, 0x4e, 0x28, 0x76, 0x0d, 0x3a, 0x59, 0xa3, 0x04, 0x15, 0xa9, 0x29, 0x45, + 0x1b, 0x97, 0x14, 0xe9, 0x02, 0xb4, 0xdc, 0xd8, 0x8c, 0x5d, 0xff, 0x98, 0x16, 0x97, 0xc6, 0x9b, + 0x6e, 0xbc, 0xef, 0xfa, 0xc7, 0xec, 0x4d, 0xd0, 0x22, 0x61, 0x4b, 0x8c, 0x46, 0x98, 0x56, 0x24, + 0x6c, 0x42, 0x5d, 0x00, 0x2c, 0x9a, 0x76, 0x22, 0xd4, 0x12, 0x6b, 0x46, 0xc2, 0xde, 0x4c, 0x84, + 0x11, 0x43, 0x63, 0x47, 0x44, 0x23, 0x81, 0xab, 0x0c, 0x1b, 0xee, 0xdb, 0x96, 0x4f, 0x7c, 0xd7, + 0x78, 0x5e, 0xc7, 0x35, 0x1e, 0x5a, 0x51, 0xe2, 0x5a, 0x1e, 0x29, 0xb6, 0xc6, 0xb3, 0x2a, 0xbb, + 0x04, 0x7a, 0x9c, 0x58, 0x51, 0x82, 0xb3, 0x23, 0x85, 0x6e, 0x70, 0x8d, 0x00, 0xb8, 0x26, 0x2e, + 0x40, 0x4b, 0xf8, 0x0e, 0xa1, 0xea, 0x52, 0x92, 0xc2, 0x77, 0xb6, 0x9d, 0x89, 0xf1, 0xd7, 0x15, + 0xe8, 0xee, 0xa4, 0x5e, 0xe2, 0x6e, 0x44, 0xa3, 0x54, 0x8c, 0xfd, 0x04, 0x6d, 0xc3, 0x96, 0x1b, + 0x27, 0xea, 0xcb, 0x54, 0x66, 0xab, 0xa0, 0x7f, 0x2f, 0x0a, 0xd2, 0xf0, 0xfe, 0x24, 0xcc, 0x24, + 0x0d, 0x52, 0xa9, 0x10, 0xc2, 0x0b, 0x24, 0x7b, 0x0f, 0xda, 0x9f, 0x47, 0x8e, 0x88, 0xee, 0x9d, + 0x10, 0x6d, 0x6d, 0x8e, 0xb6, 0x8c, 0x66, 0x97, 0x41, 0xdf, 0x17, 0xa1, 0x15, 0x59, 0xa8, 0x02, + 0x75, 0x32, 0x28, 0x05, 0x00, 0xe7, 0x4a, 0xc4, 0xdb, 0x8e, 0x5a, 0x56, 0x59, 0xd5, 0x18, 0x81, + 0xbe, 0x31, 0x1a, 0x45, 0x62, 0x64, 0x25, 0x64, 0xdc, 0x82, 0x90, 0x86, 0x5b, 0xe3, 0xd5, 0x20, + 0x24, 0x03, 0x8a, 0x13, 0x90, 0xfc, 0xa1, 0x32, 0xbb, 0x02, 0x75, 0xb1, 0x78, 0x3c, 0x04, 0x67, + 0xe7, 0xa1, 0x69, 0x07, 0xfe, 0xd0, 0x1d, 0x29, 0xb3, 0xab, 0x6a, 0xc6, 0xef, 0xd7, 0xa0, 0x41, + 0x93, 0x43, 0xf6, 0xa2, 0x29, 0x34, 0xc5, 0x13, 0xcb, 0xcb, 0xa4, 0x82, 0x80, 0xfb, 0x4f, 0x2c, + 0x8f, 0xad, 0x40, 0x03, 0xbb, 0x89, 0x17, 0xf0, 0x46, 0x22, 0xd8, 0x4d, 0x68, 0xa0, 0x12, 0xc5, + 0xd3, 0x23, 0x40, 0x25, 0xba, 0x57, 0xff, 0xc9, 0x3f, 0x5d, 0x7d, 0x83, 0x4b, 0x34, 0x7b, 0x07, + 0xea, 0xd6, 0x68, 0x14, 0x93, 0x2e, 0x4f, 0x2d, 0xa7, 0x7c, 0xbe, 0x9c, 0x08, 0xd8, 0x5d, 0xd0, + 0xa5, 0xdc, 0x90, 0xba, 0x41, 0xd4, 0x17, 0x4a, 0x5b, 0x4c, 0x59, 0xa4, 0xbc, 0xa0, 0x44, 0x8e, + 0xbb, 0xb1, 0xb2, 0x60, 0xa4, 0xd1, 0x1a, 0x2f, 0x00, 0xb8, 0x07, 0x84, 0x91, 0xd8, 0xf0, 0xbc, + 0xc0, 0xde, 0x77, 0x9f, 0x09, 0xb5, 0x63, 0x4c, 0xc1, 0xd8, 0x4d, 0xe8, 0xed, 0x49, 0x95, 0xe3, + 0x22, 0x4e, 0xbd, 0x24, 0x56, 0xbb, 0xc8, 0x0c, 0x94, 0xad, 0x01, 0x9b, 0x82, 0x1c, 0xd0, 0xf4, + 0xf5, 0x95, 0xda, 0x6a, 0x97, 0x2f, 0xc0, 0xb0, 0xb7, 0xa1, 0x3b, 0x42, 0x4e, 0xbb, 0xfe, 0xc8, + 0x1c, 0x7a, 0x16, 0x6e, 0x30, 0x35, 0xdc, 0x80, 0x32, 0xe0, 0x03, 0xcf, 0x1a, 0x19, 0x3f, 0xaf, + 0x42, 0x73, 0xdb, 0x8f, 0x45, 0x94, 0xe0, 0x2a, 0xb1, 0x86, 0x43, 0x61, 0x27, 0x42, 0x5a, 0xa7, + 0x3a, 0xcf, 0xeb, 0x38, 0xcb, 0x83, 0xe0, 0x8b, 0xc8, 0x4d, 0xc4, 0xfe, 0x87, 0x4a, 0x0f, 0x0a, + 0x00, 0xbb, 0x05, 0xcb, 0x96, 0xe3, 0x98, 0x19, 0xb5, 0x19, 0x05, 0x4f, 0x63, 0x5a, 0x31, 0x1a, + 0x5f, 0xb2, 0x1c, 0x67, 0x43, 0xc1, 0x79, 0xf0, 0x34, 0x66, 0xd7, 0xa0, 0x16, 0x89, 0x21, 0x69, + 0x45, 0x7b, 0x7d, 0x49, 0x4a, 0xed, 0xf3, 0xc3, 0x1f, 0x0a, 0x3b, 0xe1, 0x62, 0xc8, 0x11, 0xc7, + 0xce, 0x42, 0xc3, 0x4a, 0x92, 0x48, 0x4a, 0x41, 0xe7, 0xb2, 0xc2, 0xd6, 0xe0, 0x0c, 0xad, 0xcc, + 0xc4, 0x0d, 0x7c, 0x33, 0xb1, 0x0e, 0x3d, 0xdc, 0x08, 0x63, 0x65, 0xf3, 0x97, 0x73, 0xd4, 0x01, + 0x62, 0xb6, 0x9d, 0x18, 0x77, 0x89, 0x59, 0x7a, 0xdf, 0x1a, 0x8b, 0x98, 0x4c, 0xbe, 0xce, 0xcf, + 0x4c, 0xb7, 0xd8, 0x45, 0x14, 0xb2, 0xac, 0x68, 0x83, 0x6b, 0x5b, 0xa3, 0x65, 0xd2, 0xc9, 0x81, + 0xb8, 0xf4, 0xcf, 0x41, 0xd3, 0x8d, 0x4d, 0xe1, 0x3b, 0xca, 0xdc, 0x34, 0xdc, 0xf8, 0xbe, 0xef, + 0xb0, 0x77, 0x41, 0x97, 0x5f, 0x71, 0xc4, 0x90, 0xf6, 0xf2, 0xf6, 0x7a, 0x4f, 0x29, 0x25, 0x82, + 0xb7, 0xc4, 0x90, 0x6b, 0x89, 0x2a, 0x19, 0x3f, 0xae, 0x42, 0x9b, 0x74, 0xe8, 0x51, 0xe8, 0xe0, + 0x92, 0x7b, 0x1b, 0xba, 0xd3, 0xdc, 0x93, 0x02, 0xe8, 0x58, 0x65, 0xd6, 0x9d, 0x87, 0xe6, 0x86, + 0x8d, 0xa3, 0x20, 0x09, 0x74, 0xb9, 0xaa, 0xe1, 0xb2, 0xde, 0xbe, 0x97, 0xda, 0xc7, 0x22, 0x21, + 0xa6, 0x77, 0x79, 0x56, 0x45, 0xcc, 0xae, 0xc2, 0xd4, 0x25, 0x46, 0x55, 0xd9, 0x7d, 0x80, 0x7d, + 0x31, 0x1a, 0x0b, 0x3f, 0xd9, 0xb1, 0x42, 0xa5, 0xee, 0x37, 0x66, 0xd4, 0x5d, 0x8e, 0x6d, 0xad, + 0xa0, 0xbb, 0xef, 0x27, 0xd1, 0x09, 0x2f, 0x35, 0x64, 0xdf, 0x82, 0xa5, 0x94, 0xa8, 0x4c, 0x3b, + 0x99, 0x98, 0x1e, 0x5a, 0x89, 0x26, 0xf5, 0xa5, 0x24, 0x2b, 0xbb, 0xd8, 0x4c, 0x26, 0xbc, 0x9b, + 0x66, 0xc5, 0x87, 0x6e, 0x9c, 0x5c, 0xfc, 0x36, 0x2c, 0xcd, 0xf4, 0x8b, 0x9e, 0xdb, 0xb1, 0x38, + 0xa1, 0x99, 0xeb, 0x1c, 0x8b, 0xa8, 0x08, 0x4f, 0x2c, 0x2f, 0xcd, 0x5c, 0x0e, 0x59, 0xf9, 0xb5, + 0xea, 0x47, 0x15, 0xe3, 0x2d, 0x68, 0x6c, 0x44, 0x91, 0x45, 0x24, 0x16, 0x16, 0x06, 0x15, 0xda, + 0x77, 0x64, 0xc5, 0xb0, 0xa1, 0x86, 0xa3, 0xbb, 0x01, 0xd5, 0x71, 0x48, 0x98, 0xf6, 0xfa, 0xb9, + 0xd2, 0xe4, 0xac, 0x70, 0x6d, 0x47, 0x4d, 0xa6, 0x3a, 0x0e, 0x2f, 0xde, 0x85, 0xd6, 0xce, 0x6b, + 0x8c, 0xe1, 0x3f, 0xeb, 0xa0, 0x6d, 0x09, 0x4f, 0x90, 0x0c, 0x0c, 0xe8, 0x94, 0xd5, 0x3c, 0x93, + 0xdf, 0x94, 0xea, 0x1b, 0xd0, 0x91, 0x3b, 0x21, 0xb5, 0x12, 0x6a, 0x1d, 0x4d, 0xc1, 0x5e, 0x4b, + 0x96, 0x97, 0x01, 0xa2, 0xe0, 0xa9, 0xe9, 0xca, 0xed, 0x48, 0x5a, 0x76, 0x2d, 0x0a, 0x9e, 0x6e, + 0xe3, 0x86, 0xf4, 0x7f, 0xb2, 0x6e, 0xbe, 0x05, 0x83, 0xd2, 0xba, 0x41, 0x37, 0xd3, 0x74, 0x7d, + 0xf3, 0x10, 0x7d, 0x1e, 0xb5, 0x84, 0x8a, 0x3e, 0xc9, 0x0b, 0xdd, 0xf6, 0xef, 0x91, 0x43, 0xa4, + 0xac, 0x81, 0x7e, 0x8a, 0x35, 0x58, 0x68, 0x5c, 0x60, 0xb1, 0x71, 0xb9, 0x37, 0xa5, 0xd5, 0x6d, + 0x12, 0xbc, 0x51, 0x08, 0x3e, 0x93, 0xd6, 0xa9, 0x2a, 0x7d, 0x0d, 0x3a, 0xb6, 0xe5, 0x9b, 0x49, + 0x94, 0xfa, 0xb6, 0x95, 0x88, 0x41, 0x87, 0x3e, 0xd5, 0xb6, 0x2d, 0xff, 0x40, 0x81, 0x4a, 0x16, + 0xa0, 0x5b, 0xb6, 0x00, 0x37, 0x61, 0x29, 0x8c, 0xdc, 0xb1, 0x15, 0x9d, 0x98, 0xc7, 0xe2, 0x84, + 0x84, 0xd1, 0x93, 0xfe, 0xb4, 0x02, 0x7f, 0x26, 0x4e, 0xb6, 0x9d, 0xc9, 0x97, 0xd5, 0xfd, 0x7f, + 0xac, 0x82, 0xbe, 0x17, 0x09, 0x65, 0xb5, 0xaf, 0x42, 0x3b, 0xb6, 0x8f, 0xc4, 0xd8, 0x22, 0x29, + 0xa9, 0x1e, 0x40, 0x82, 0x50, 0x38, 0xd3, 0x76, 0xa9, 0x7a, 0xba, 0x5d, 0xc2, 0x71, 0x48, 0x6f, + 0x07, 0x17, 0x13, 0x16, 0x0b, 0x63, 0x5c, 0x2f, 0x1b, 0xe3, 0x15, 0xe8, 0x1c, 0x59, 0xb1, 0x69, + 0xa5, 0x49, 0x60, 0xda, 0x81, 0x47, 0x4a, 0xa7, 0x71, 0x38, 0xb2, 0xe2, 0x8d, 0x34, 0x09, 0x36, + 0x03, 0xf2, 0x9e, 0xdc, 0xd8, 0x94, 0x8b, 0x5e, 0xed, 0x8b, 0x9a, 0x1b, 0x2b, 0x73, 0xb7, 0x06, + 0x67, 0x44, 0x9c, 0xb8, 0x63, 0x4b, 0x09, 0xd4, 0xb4, 0x83, 0xd4, 0x4f, 0x68, 0x77, 0xac, 0xf1, + 0xe5, 0x1c, 0xc5, 0x83, 0xa7, 0x9b, 0x88, 0x60, 0xef, 0x43, 0xcf, 0x0e, 0xc6, 0xa1, 0x19, 0x22, + 0x5f, 0xc9, 0xef, 0x90, 0x8e, 0x78, 0xd9, 0x2f, 0xe8, 0x20, 0xc5, 0xde, 0xb1, 0x90, 0x8e, 0xd0, + 0x3a, 0x2c, 0xd9, 0x5e, 0x1a, 0x27, 0x22, 0x32, 0x0f, 0x55, 0x13, 0x7d, 0xae, 0x49, 0x57, 0x91, + 0x48, 0xe7, 0x09, 0x19, 0xdb, 0xda, 0x0b, 0xe2, 0x64, 0x6b, 0xec, 0x65, 0x8a, 0x59, 0x79, 0x55, + 0xc5, 0xac, 0x2e, 0x56, 0xcc, 0x05, 0xaa, 0x51, 0x5b, 0xa0, 0x1a, 0x6c, 0x15, 0xfa, 0x65, 0x3a, + 0x12, 0xa9, 0x74, 0xe3, 0x7a, 0x05, 0x21, 0x89, 0x55, 0xf2, 0xd7, 0x91, 0x96, 0xa4, 0x91, 0xf1, + 0x57, 0x59, 0x11, 0x89, 0x74, 0x49, 0x43, 0x0a, 0xe6, 0x2b, 0x8d, 0xf9, 0xff, 0xf0, 0x66, 0xde, + 0xd2, 0x7c, 0xea, 0x26, 0x47, 0x41, 0x9a, 0x98, 0x43, 0x3a, 0xb1, 0xc4, 0xca, 0xeb, 0x3e, 0x9f, + 0xf5, 0xf4, 0x85, 0x44, 0xcb, 0xf3, 0x0c, 0xf9, 0x48, 0xc3, 0xd4, 0xf3, 0xcc, 0x44, 0x4c, 0x12, + 0x25, 0x82, 0x81, 0xe4, 0x8d, 0xe2, 0xdb, 0x83, 0xd4, 0xf3, 0x0e, 0xc4, 0x24, 0x41, 0x8b, 0xaf, + 0x0d, 0x55, 0xc5, 0xf8, 0x9b, 0x1a, 0xc0, 0xc3, 0xc0, 0x3e, 0x3e, 0xb0, 0xa2, 0x91, 0x48, 0xd0, + 0x97, 0xcf, 0xec, 0x90, 0xb2, 0x93, 0xad, 0x44, 0x5a, 0x1f, 0xb6, 0x0e, 0xe7, 0xb3, 0xf9, 0xdb, + 0x81, 0x47, 0xe7, 0x0a, 0x69, 0x48, 0xd4, 0x32, 0x60, 0x0a, 0x2b, 0x4f, 0xa6, 0x64, 0x45, 0xd8, + 0x47, 0x05, 0x6f, 0xb1, 0x4d, 0x72, 0x12, 0x12, 0x6f, 0x17, 0xf9, 0x84, 0xdd, 0xa2, 0xf9, 0xc1, + 0x49, 0xc8, 0xde, 0x87, 0x73, 0x91, 0x18, 0x46, 0x22, 0x3e, 0x32, 0x93, 0xb8, 0xfc, 0x31, 0xe9, + 0xd2, 0x2f, 0x2b, 0xe4, 0x41, 0x9c, 0x7f, 0xeb, 0x7d, 0x38, 0x27, 0x39, 0x35, 0x3b, 0x3c, 0x69, + 0x75, 0x97, 0x25, 0xb2, 0x3c, 0xba, 0xb7, 0x80, 0x82, 0x1f, 0xd2, 0x92, 0x66, 0x0e, 0xa2, 0x47, + 0xcc, 0x38, 0xf4, 0x04, 0x3a, 0x56, 0x9b, 0x47, 0x78, 0xea, 0xdc, 0x12, 0x43, 0xc5, 0xfc, 0x02, + 0xc0, 0x0c, 0xa8, 0xef, 0x04, 0x8e, 0x20, 0x56, 0xf7, 0xd6, 0x7b, 0x6b, 0x14, 0x46, 0x41, 0x4e, + 0x22, 0x94, 0x13, 0x8e, 0xbd, 0x03, 0xd4, 0x9d, 0x54, 0xbf, 0x79, 0x1d, 0xd7, 0x10, 0x49, 0x3a, + 0xf8, 0x3e, 0x9c, 0x2b, 0x46, 0x62, 0x5a, 0x89, 0x99, 0x1c, 0x09, 0x32, 0x62, 0xd2, 0x98, 0x2e, + 0xe7, 0x83, 0xda, 0x48, 0x0e, 0x8e, 0xc4, 0x7d, 0xdf, 0x31, 0x3e, 0x82, 0x26, 0x7e, 0xec, 0xf3, + 0x90, 0xad, 0x41, 0x2b, 0x21, 0xe1, 0xc5, 0x6a, 0x3b, 0x3d, 0x5b, 0x58, 0xd5, 0x42, 0xb2, 0x3c, + 0x23, 0x32, 0x38, 0x2c, 0xe5, 0x26, 0xea, 0x91, 0xef, 0x3e, 0x4e, 0x05, 0xfb, 0x04, 0x96, 0xc3, + 0x48, 0x28, 0xa5, 0x34, 0xd3, 0x63, 0xf4, 0x18, 0xd4, 0xfa, 0x3a, 0xab, 0x74, 0x28, 0x6f, 0x71, + 0x8c, 0xfa, 0xd3, 0x0b, 0xa7, 0xea, 0xc6, 0x0f, 0xe0, 0x42, 0x4e, 0xb1, 0x2f, 0xec, 0xc0, 0x77, + 0xac, 0xe8, 0x84, 0x76, 0x93, 0x99, 0xbe, 0xe3, 0x57, 0xe9, 0x7b, 0x9f, 0xfa, 0xfe, 0x51, 0x0d, + 0x7a, 0x9f, 0xfb, 0x5b, 0x69, 0xe8, 0xb9, 0x68, 0xe1, 0x3f, 0x93, 0x06, 0x58, 0x1a, 0xbe, 0x4a, + 0xd9, 0xf0, 0xad, 0x42, 0x5f, 0x7d, 0x05, 0x15, 0x40, 0x9a, 0x2d, 0x15, 0x67, 0x91, 0xf0, 0xcd, + 0xc0, 0x93, 0x36, 0xeb, 0xdb, 0x70, 0x2e, 0xa5, 0x99, 0x4b, 0xca, 0x23, 0x61, 0x1f, 0x9b, 0xcf, + 0x39, 0x32, 0x31, 0x49, 0x88, 0x4d, 0x91, 0x8c, 0x0c, 0xd8, 0x55, 0x68, 0x17, 0xcd, 0x33, 0xeb, + 0x0b, 0x39, 0x21, 0x8d, 0x24, 0xf0, 0x4d, 0x27, 0x1b, 0xb2, 0xda, 0xfb, 0xd1, 0x6e, 0xf7, 0x82, + 0x62, 0x26, 0x68, 0x54, 0x7e, 0x0b, 0x96, 0xa7, 0x28, 0x69, 0x14, 0xd2, 0x4d, 0xbb, 0x5d, 0x88, + 0x71, 0x7a, 0xfa, 0xe5, 0x2a, 0x8e, 0x47, 0xee, 0x93, 0x4b, 0xc1, 0x34, 0x34, 0x33, 0x34, 0x23, + 0x3f, 0x88, 0x84, 0x52, 0x5f, 0x34, 0x34, 0x54, 0xbf, 0xb8, 0x0b, 0x67, 0x17, 0xf5, 0xb2, 0x60, + 0xb3, 0x5b, 0x29, 0x6f, 0x76, 0x33, 0xc7, 0xbd, 0x62, 0xe3, 0xfb, 0xd3, 0x0a, 0xb4, 0x1f, 0xa4, + 0xcf, 0x9e, 0x9d, 0x48, 0x73, 0xc4, 0x3a, 0x50, 0xd9, 0xa5, 0x5e, 0xaa, 0xbc, 0xb2, 0x8b, 0xde, + 0xf1, 0xde, 0x31, 0x9a, 0x46, 0xea, 0x44, 0xe7, 0xaa, 0x86, 0x07, 0xc5, 0xbd, 0xe3, 0x83, 0x53, + 0x8c, 0x82, 0x44, 0xe3, 0xf1, 0xe7, 0x5e, 0xea, 0x7a, 0xe8, 0x33, 0xa9, 0xf5, 0x9f, 0xd7, 0xf1, + 0xe8, 0xb5, 0x3d, 0x94, 0xfa, 0xf2, 0x20, 0x0a, 0xc6, 0x52, 0xa3, 0x95, 0xd5, 0x5d, 0x80, 0x31, + 0x7e, 0x5a, 0x83, 0xfa, 0xa7, 0x81, 0xeb, 0xcb, 0xb0, 0x85, 0x27, 0x1d, 0x63, 0xe9, 0xa1, 0xb6, + 0x22, 0xe1, 0xa1, 0x07, 0x8c, 0x28, 0x54, 0x0c, 0x4f, 0x9e, 0xac, 0x09, 0x65, 0x07, 0x12, 0x55, + 0x1c, 0xae, 0x2b, 0x0b, 0x0f, 0xd7, 0xf9, 0xd9, 0xb7, 0xfe, 0xa2, 0xb3, 0xaf, 0xee, 0x89, 0x21, + 0xaa, 0xaa, 0xef, 0x28, 0x1f, 0x7f, 0xda, 0x34, 0x88, 0x61, 0xb2, 0x19, 0xf8, 0x0e, 0xfb, 0x06, + 0x40, 0xe4, 0x8e, 0x8e, 0x14, 0x65, 0x73, 0x3e, 0x1e, 0x41, 0x58, 0x22, 0xe5, 0xf0, 0xa6, 0x0a, + 0x72, 0xa9, 0x3d, 0xc3, 0x3c, 0x44, 0x2e, 0xc9, 0x79, 0xb4, 0xb2, 0x63, 0xf3, 0xe2, 0xf0, 0xd8, + 0xf9, 0xa9, 0xf0, 0x18, 0x71, 0x97, 0xe6, 0x7b, 0x19, 0xd0, 0x73, 0x38, 0x32, 0x03, 0xdf, 0x0c, + 0xb3, 0xf0, 0x8e, 0x86, 0x90, 0xcf, 0xfd, 0xbd, 0x63, 0xb4, 0xa0, 0x6e, 0x6c, 0xaa, 0x28, 0x91, + 0x3a, 0x73, 0x95, 0x8e, 0xd8, 0x2b, 0xd0, 0xf9, 0x61, 0xe0, 0xfa, 0xe6, 0xd8, 0x0a, 0xcd, 0xc4, + 0x92, 0x61, 0xd4, 0x06, 0x07, 0x84, 0xed, 0x58, 0xe1, 0x81, 0x35, 0x22, 0x17, 0x49, 0xc5, 0x9d, + 0x70, 0x91, 0xb4, 0x25, 0x81, 0x02, 0xa1, 0x78, 0x2f, 0x81, 0x4e, 0x5d, 0x50, 0x54, 0xaa, 0x23, + 0x65, 0x8f, 0x00, 0xe4, 0xa8, 0xf1, 0xaf, 0x55, 0xd0, 0x36, 0xfc, 0xc4, 0x25, 0x79, 0x9e, 0x87, + 0x66, 0x44, 0x47, 0x6c, 0x25, 0x4d, 0x55, 0xcb, 0x25, 0x56, 0x7d, 0x8e, 0xc4, 0xa6, 0x24, 0x51, + 0x7b, 0x69, 0x49, 0xd4, 0x4f, 0x93, 0xc4, 0x34, 0xd7, 0x1a, 0xa7, 0x72, 0x6d, 0x2e, 0x30, 0xf1, + 0x75, 0x88, 0x71, 0x56, 0x12, 0xda, 0x8b, 0x24, 0xa1, 0xcf, 0x4a, 0xc2, 0xf8, 0xcb, 0x1a, 0x68, + 0x0f, 0xc5, 0x30, 0xf9, 0xd5, 0xe2, 0xf9, 0x65, 0x59, 0x3c, 0xc6, 0x7f, 0xd4, 0x40, 0xe7, 0x38, + 0xc3, 0xaf, 0x51, 0x66, 0x77, 0x00, 0x48, 0x16, 0xa7, 0x0b, 0x8e, 0xe4, 0x25, 0x63, 0x5f, 0x1f, + 0x40, 0x5b, 0xca, 0x44, 0xb6, 0x68, 0x3c, 0xa7, 0x85, 0x14, 0xdc, 0xc1, 0xbc, 0xbc, 0x9b, 0x2f, + 0x2d, 0xef, 0xd6, 0x6b, 0xcb, 0x5b, 0xfb, 0x2a, 0xe4, 0xad, 0x9f, 0x2a, 0x6f, 0x78, 0x91, 0xbc, + 0xdb, 0x2f, 0x92, 0x77, 0x67, 0x4e, 0xde, 0x3f, 0xaa, 0x41, 0x97, 0xe4, 0xbd, 0x2f, 0xc6, 0x5f, + 0xce, 0x28, 0xce, 0x08, 0xa9, 0xf6, 0xaa, 0x42, 0xaa, 0xbf, 0xb4, 0x90, 0x1a, 0xaf, 0x2d, 0xa4, + 0xe6, 0x57, 0x21, 0xa4, 0xd6, 0xa9, 0x42, 0xd2, 0x5e, 0x24, 0x24, 0xfd, 0xd5, 0x17, 0x65, 0x2e, + 0xa4, 0x2f, 0xbd, 0x73, 0xfd, 0x4a, 0x48, 0x5f, 0x91, 0x90, 0x60, 0x4e, 0x48, 0xe8, 0x59, 0x7c, + 0xe9, 0x45, 0xf4, 0x75, 0x78, 0x16, 0xa7, 0x32, 0xbb, 0xf1, 0x55, 0x30, 0xbb, 0x79, 0x2a, 0xb3, + 0x5b, 0x2f, 0x62, 0xf6, 0x6b, 0x78, 0x16, 0x7f, 0x55, 0x03, 0xd8, 0x77, 0xfd, 0x91, 0x27, 0x7e, + 0xe5, 0x5b, 0xfc, 0xd2, 0xf8, 0x16, 0x7f, 0x57, 0x05, 0x6d, 0xc7, 0x8a, 0x8e, 0x7f, 0xe1, 0x56, + 0xc8, 0xdb, 0xd0, 0x0a, 0xfc, 0xf2, 0x7a, 0x28, 0xd3, 0x35, 0x03, 0xff, 0x17, 0x42, 0xe5, 0x7f, + 0xda, 0x00, 0x7d, 0x4b, 0x38, 0x69, 0xf8, 0x25, 0x34, 0xfe, 0x97, 0xc5, 0xbc, 0xbc, 0xe0, 0xb8, + 0x33, 0xcb, 0xcd, 0xd6, 0x8b, 0xb8, 0xa9, 0xcd, 0x1d, 0x12, 0x1f, 0xc2, 0x99, 0xa9, 0x28, 0x8a, + 0x25, 0xaf, 0xe2, 0x74, 0x0a, 0xcd, 0x5d, 0x96, 0xe3, 0xdd, 0x0d, 0x9c, 0xa9, 0x40, 0x8a, 0xbc, + 0xa0, 0xe3, 0xcb, 0xc1, 0x2c, 0x88, 0x5d, 0x87, 0x9e, 0x83, 0xa2, 0xa1, 0xe0, 0x10, 0x85, 0x79, + 0x65, 0xfa, 0x4f, 0x87, 0xa0, 0x9b, 0x81, 0x47, 0xb1, 0x8b, 0x8f, 0x60, 0xa9, 0xa0, 0x92, 0x96, + 0xa5, 0xfd, 0x1c, 0xcb, 0xd2, 0xcd, 0x1a, 0xca, 0x3d, 0x78, 0xda, 0x63, 0xee, 0xbc, 0xb2, 0xc7, + 0xdc, 0x7d, 0x89, 0x7d, 0xfe, 0x36, 0x9c, 0xc9, 0x2e, 0xff, 0x54, 0x30, 0x94, 0x24, 0xd8, 0x23, + 0x0d, 0xea, 0xab, 0xfb, 0x3e, 0x0a, 0x85, 0x92, 0x88, 0x3e, 0x86, 0xb3, 0x25, 0x72, 0x5c, 0x9a, + 0x92, 0x7e, 0x69, 0x4e, 0x57, 0x96, 0xf3, 0xb6, 0x58, 0xc5, 0xc6, 0xc6, 0xef, 0x54, 0xa0, 0xb5, + 0x17, 0x05, 0x4e, 0x6a, 0x27, 0xaf, 0xa9, 0xc9, 0xd3, 0x1a, 0x52, 0x7b, 0x91, 0x86, 0xd4, 0x67, + 0x35, 0xc4, 0xf8, 0xdd, 0x0a, 0xe8, 0x6a, 0x08, 0x0f, 0xd7, 0xbf, 0xa6, 0x0d, 0xe4, 0xc5, 0xa3, + 0x78, 0x0a, 0x3a, 0xc5, 0x3c, 0x4f, 0x35, 0x89, 0xa7, 0xae, 0xb0, 0xea, 0x6b, 0xad, 0x30, 0xe3, + 0x0f, 0x2a, 0xd0, 0xa5, 0xf0, 0xf0, 0x83, 0xd4, 0x97, 0x3a, 0xbc, 0x38, 0x42, 0xba, 0x02, 0xf5, + 0x48, 0x24, 0x59, 0xe6, 0x46, 0x47, 0x7e, 0x66, 0x33, 0xf0, 0xb6, 0xc4, 0x90, 0x13, 0x06, 0x99, + 0x60, 0x45, 0xa3, 0x78, 0x51, 0xee, 0x08, 0xc2, 0x71, 0x56, 0xa1, 0x15, 0x59, 0xe3, 0x38, 0xcb, + 0x1d, 0x91, 0x35, 0xc6, 0xa0, 0x4e, 0x2b, 0xa5, 0x41, 0x2b, 0x85, 0xca, 0xc6, 0x06, 0x9c, 0xbb, + 0x3f, 0x49, 0x44, 0xe4, 0x5b, 0xb4, 0x62, 0xd6, 0x51, 0xdf, 0x28, 0x24, 0x9c, 0x11, 0x57, 0x0a, + 0x62, 0x1c, 0x70, 0x39, 0x33, 0x4e, 0x56, 0x8c, 0x1b, 0xd0, 0x1e, 0xba, 0x9e, 0x30, 0x83, 0xe1, + 0x30, 0x16, 0x09, 0x7e, 0x5d, 0x96, 0x68, 0x5a, 0x35, 0xae, 0x6a, 0xc6, 0x8f, 0xeb, 0xd0, 0xc9, + 0x3e, 0x45, 0x99, 0x43, 0x8b, 0xa7, 0x7f, 0x09, 0x74, 0xea, 0x2d, 0x76, 0x9f, 0x09, 0xe2, 0x41, + 0x8d, 0x6b, 0x08, 0xa0, 0x54, 0x8f, 0x0d, 0x58, 0x2e, 0x7d, 0xca, 0x4c, 0x82, 0xc4, 0xf2, 0x14, + 0x1b, 0x4a, 0xf7, 0xd3, 0x25, 0x12, 0xbe, 0x84, 0x95, 0xcf, 0xa9, 0x7c, 0x80, 0xd4, 0xc8, 0xde, + 0x3c, 0x20, 0x3c, 0xc7, 0x5e, 0xc4, 0xb0, 0xef, 0xc1, 0x12, 0xce, 0x76, 0x5d, 0xae, 0x4a, 0x9a, + 0xaf, 0x34, 0xaa, 0x57, 0x8b, 0x4f, 0x2c, 0xe4, 0x19, 0xef, 0xfa, 0x53, 0x2c, 0x7c, 0x0b, 0xc0, + 0x8e, 0x04, 0x2e, 0xd8, 0xf8, 0xb1, 0x47, 0x36, 0x55, 0xe7, 0xba, 0x84, 0xec, 0x3f, 0xf6, 0xf2, + 0x99, 0xe6, 0x0e, 0x86, 0x2e, 0x67, 0x4a, 0x8a, 0x7e, 0x1b, 0xda, 0x41, 0xe4, 0x8e, 0x5c, 0x5f, + 0x86, 0xaf, 0xb5, 0x05, 0xa3, 0x05, 0x49, 0x40, 0xc1, 0x6c, 0x03, 0x9a, 0x52, 0x51, 0x17, 0xdc, + 0x60, 0x28, 0x0c, 0xe3, 0xd0, 0x3b, 0x38, 0x44, 0x03, 0x47, 0xc9, 0x99, 0x9b, 0x81, 0x47, 0x09, + 0x2d, 0xed, 0xf5, 0x5b, 0xf3, 0xd3, 0x42, 0xf9, 0xac, 0x4d, 0x13, 0xcb, 0x00, 0xf6, 0x4c, 0x0f, + 0xec, 0x26, 0x2c, 0xc5, 0x49, 0xe4, 0xda, 0x09, 0x4e, 0xd1, 0x1c, 0x07, 0x8e, 0x20, 0x2f, 0x44, + 0xe3, 0x5d, 0x09, 0xde, 0x7f, 0xec, 0xed, 0x04, 0x8e, 0xb8, 0xb8, 0x01, 0x67, 0x16, 0x74, 0xf7, + 0x4a, 0xd7, 0xb6, 0x36, 0xc0, 0x7e, 0x12, 0x09, 0x6b, 0x4c, 0xca, 0xf3, 0x0e, 0xb4, 0x92, 0x43, + 0x8f, 0xee, 0x64, 0x2b, 0x0b, 0xef, 0x64, 0x9b, 0xc9, 0x21, 0x72, 0xa9, 0xa4, 0x8e, 0x55, 0xba, + 0x1d, 0x55, 0x35, 0xfc, 0x90, 0xe7, 0x8e, 0xdd, 0x44, 0xa5, 0x5a, 0xca, 0x8a, 0xf1, 0x21, 0xe8, + 0xd4, 0x03, 0x7d, 0x23, 0xf7, 0x46, 0x2b, 0xa7, 0x7a, 0xa3, 0xc6, 0x7b, 0xa0, 0xff, 0x26, 0x0e, + 0x93, 0x1a, 0x5d, 0x85, 0x36, 0xdd, 0xdb, 0x9b, 0x87, 0x5e, 0x60, 0x1f, 0x67, 0xf7, 0xc9, 0x04, + 0xba, 0x87, 0x10, 0x03, 0x40, 0x7b, 0xe4, 0xbb, 0x81, 0xbf, 0xe1, 0x79, 0xc6, 0x1f, 0xd6, 0x41, + 0xff, 0xbe, 0x15, 0x1f, 0x91, 0x95, 0x60, 0x2b, 0xd0, 0xde, 0x15, 0xc2, 0x41, 0xc0, 0x8e, 0x15, + 0xaa, 0x9c, 0xae, 0x32, 0x88, 0x5d, 0x04, 0xed, 0xfb, 0xd2, 0xff, 0xf9, 0x4c, 0xdd, 0x94, 0xe6, + 0xf5, 0xac, 0x35, 0xe5, 0x05, 0x88, 0x2c, 0x7d, 0xa8, 0x0c, 0x62, 0xb7, 0xa0, 0x8f, 0x55, 0xca, + 0x9c, 0x42, 0x1d, 0x14, 0x9e, 0xb4, 0x10, 0x1a, 0x9f, 0x83, 0xb3, 0x5b, 0x00, 0xe8, 0x6b, 0x50, + 0xc6, 0x41, 0xbc, 0xc0, 0x47, 0x2b, 0x61, 0xd9, 0x15, 0x80, 0x4f, 0x73, 0x03, 0xab, 0xb2, 0x12, + 0x4b, 0x10, 0x76, 0x1d, 0xba, 0xaa, 0xc6, 0xc5, 0x70, 0x53, 0xdd, 0x53, 0x37, 0xf8, 0x34, 0x90, + 0xdd, 0x87, 0x65, 0xfe, 0xca, 0xf9, 0xa2, 0x73, 0x20, 0xdc, 0x3c, 0xe8, 0x76, 0xd6, 0x49, 0x43, + 0xe5, 0x52, 0xb7, 0xdc, 0x98, 0xbc, 0xb8, 0xe7, 0x79, 0x20, 0xf0, 0x55, 0x79, 0x20, 0xed, 0x97, + 0xf3, 0x40, 0x3a, 0x2f, 0xe5, 0x81, 0x18, 0x3f, 0xaf, 0x41, 0x47, 0x6d, 0xae, 0xb4, 0xf9, 0x4c, + 0x09, 0xbf, 0x72, 0xba, 0xf0, 0xab, 0x2f, 0x27, 0xfc, 0xda, 0x4b, 0x09, 0xbf, 0x7e, 0xaa, 0xf0, + 0x17, 0x8a, 0xad, 0xf1, 0xca, 0x62, 0x7b, 0x91, 0x0e, 0x5d, 0x01, 0xd8, 0xcf, 0x7d, 0xc9, 0xcc, + 0xfd, 0x2c, 0x20, 0x53, 0x62, 0xd7, 0x5e, 0x4a, 0xec, 0xbf, 0x98, 0x8e, 0xa7, 0xb1, 0x0f, 0x40, + 0xbb, 0x87, 0x94, 0xf9, 0x42, 0xee, 0x56, 0x5e, 0x95, 0xbb, 0xc6, 0xff, 0x54, 0x00, 0xf6, 0xad, + 0x71, 0x28, 0x9d, 0x0f, 0xf6, 0x5d, 0x68, 0xc7, 0x54, 0x93, 0x37, 0x36, 0xf2, 0xcd, 0x40, 0x69, + 0x77, 0x2b, 0x48, 0x55, 0x11, 0x87, 0xc6, 0x21, 0xce, 0xcb, 0xe4, 0xed, 0xcb, 0x1e, 0xf2, 0xac, + 0x8d, 0x46, 0x46, 0x40, 0x97, 0xe5, 0x37, 0xa0, 0xa7, 0x08, 0x42, 0x11, 0xd9, 0xc2, 0x97, 0x76, + 0xb6, 0xc2, 0xbb, 0x12, 0xba, 0x27, 0x81, 0xec, 0x83, 0x9c, 0xcc, 0x0e, 0xbc, 0x74, 0xbc, 0x50, + 0xdb, 0x54, 0x93, 0x4d, 0x49, 0x60, 0xac, 0x67, 0x53, 0xa1, 0x81, 0x68, 0x50, 0xc7, 0xef, 0xf5, + 0xdf, 0x60, 0x6d, 0x68, 0xa9, 0x5e, 0xfb, 0x15, 0xd6, 0x05, 0x9d, 0x52, 0x97, 0x09, 0x57, 0x35, + 0xfe, 0xe4, 0x0c, 0xb4, 0xb7, 0xfd, 0x38, 0x89, 0x52, 0x29, 0xc4, 0x22, 0x43, 0xb7, 0x41, 0x19, + 0xba, 0x2a, 0x6d, 0x47, 0x4e, 0x83, 0xd2, 0x76, 0x6e, 0x42, 0xdd, 0xf2, 0x13, 0x57, 0x39, 0x9a, + 0xa5, 0x34, 0xf0, 0x2c, 0x20, 0xc8, 0x09, 0xcf, 0x6e, 0x43, 0x4b, 0xe5, 0x8c, 0xab, 0x94, 0xcc, + 0x85, 0x09, 0xe7, 0x19, 0x0d, 0x5b, 0x03, 0xcd, 0x51, 0xc9, 0xec, 0x6a, 0x91, 0x94, 0xba, 0xce, + 0xd2, 0xdc, 0x79, 0x4e, 0xc3, 0xae, 0x41, 0xcd, 0x1a, 0xc9, 0xf5, 0x40, 0x69, 0x34, 0x19, 0x29, + 0xa5, 0x00, 0x73, 0xc4, 0x31, 0x03, 0xea, 0xe8, 0xde, 0xd2, 0x9a, 0xa0, 0x6d, 0x30, 0xa3, 0x91, + 0xa3, 0x44, 0x1c, 0xbb, 0xa3, 0x4e, 0xa1, 0x44, 0xa8, 0xcd, 0x7e, 0x37, 0xbb, 0x30, 0x92, 0xa7, + 0xd1, 0x4f, 0x55, 0x83, 0x58, 0x8c, 0x5d, 0xd9, 0x40, 0x9f, 0x6d, 0x90, 0x05, 0xdd, 0xb8, 0x16, + 0x67, 0xe1, 0xb7, 0xbb, 0xd0, 0x8e, 0x29, 0x3a, 0x24, 0x9b, 0x40, 0x96, 0x3b, 0x90, 0x37, 0xc9, + 0x43, 0x47, 0x1c, 0xe2, 0x22, 0x8c, 0x74, 0x07, 0xf4, 0xb1, 0x15, 0x1d, 0xcb, 0x46, 0xed, 0xd9, + 0xef, 0x64, 0xa1, 0x0b, 0xae, 0x8d, 0xb3, 0x20, 0xc6, 0x3a, 0x80, 0x5c, 0x58, 0xd4, 0xa2, 0x33, + 0xcb, 0xf2, 0xfc, 0xb8, 0xce, 0x75, 0x27, 0x3f, 0xb9, 0xbf, 0x0b, 0xad, 0x50, 0x9e, 0x3b, 0x28, + 0xdf, 0xac, 0xbd, 0xbe, 0x5c, 0x34, 0x50, 0x07, 0x12, 0x9e, 0x51, 0xb0, 0xef, 0x40, 0x4f, 0x26, + 0x78, 0x0c, 0x95, 0x9b, 0x4e, 0x39, 0x68, 0x53, 0xb9, 0xcc, 0x53, 0x5e, 0x3c, 0xef, 0x26, 0x53, + 0x4e, 0xfd, 0xc7, 0xd0, 0x15, 0xca, 0x8b, 0x32, 0x63, 0xdb, 0xf2, 0x07, 0x7d, 0x6a, 0x7e, 0x7e, + 0xb1, 0x93, 0xc5, 0x3b, 0xa2, 0xec, 0x12, 0xaf, 0x42, 0x53, 0x25, 0x1d, 0x2d, 0x53, 0xab, 0xd2, + 0x1b, 0x1d, 0x79, 0x47, 0xce, 0x15, 0x9e, 0xdd, 0x9b, 0xc9, 0x5e, 0x40, 0x37, 0x8a, 0x65, 0x09, + 0x45, 0x8b, 0x53, 0x12, 0xa6, 0xf2, 0x1a, 0x3e, 0x13, 0x27, 0xc8, 0xcb, 0x22, 0xeb, 0x63, 0x70, + 0x66, 0x96, 0x97, 0x79, 0xca, 0x07, 0xd7, 0xf3, 0x6c, 0x0f, 0x34, 0x48, 0xe5, 0x2c, 0x14, 0x79, + 0x91, 0x7f, 0x96, 0x9a, 0xbe, 0xb9, 0xa0, 0xa9, 0xbc, 0xcf, 0xe7, 0x4b, 0xe1, 0x4c, 0x32, 0xcb, + 0x7b, 0xa0, 0x05, 0x91, 0x43, 0xc9, 0x65, 0x83, 0x73, 0xb4, 0xe2, 0x97, 0x55, 0x8e, 0x98, 0x4c, + 0xc6, 0x27, 0x43, 0xd6, 0x0a, 0x64, 0x85, 0xdd, 0x86, 0x4e, 0x18, 0x05, 0x3f, 0x14, 0x76, 0x22, + 0x9d, 0xe5, 0xf3, 0xf3, 0x49, 0xfc, 0x0a, 0x4f, 0xbe, 0x73, 0xe1, 0x0c, 0x5f, 0x78, 0xae, 0x33, + 0xbc, 0x92, 0xb9, 0x7f, 0x83, 0xf9, 0x8c, 0x09, 0x42, 0x60, 0x2f, 0xca, 0x71, 0x7c, 0x73, 0xbe, + 0x17, 0xe5, 0x44, 0x0e, 0xa0, 0xe5, 0xc6, 0x0f, 0xdc, 0x28, 0x4e, 0x06, 0x17, 0xb3, 0x4d, 0x87, + 0xaa, 0xe8, 0x76, 0xba, 0xf1, 0x43, 0x2b, 0x4e, 0x06, 0x97, 0xb2, 0x77, 0x18, 0x58, 0x43, 0x9e, + 0xcb, 0x30, 0x01, 0xe9, 0xef, 0xe5, 0x59, 0x9e, 0xe7, 0x17, 0x81, 0x2a, 0xde, 0x43, 0xfa, 0xfb, + 0x09, 0x2c, 0xc9, 0x36, 0xc5, 0x92, 0x7c, 0x6b, 0x56, 0x27, 0xa7, 0x6e, 0x94, 0x78, 0x37, 0x9a, + 0xba, 0x60, 0xca, 0x3b, 0x40, 0x93, 0x25, 0x3b, 0xb8, 0xb2, 0xb0, 0x83, 0xdc, 0xb8, 0xc9, 0x0e, + 0xf2, 0xcb, 0x8f, 0x5b, 0xd0, 0x54, 0x99, 0x72, 0x57, 0xe7, 0x8c, 0x96, 0xca, 0x09, 0xe5, 0x8a, + 0x82, 0x7d, 0x03, 0x5a, 0x94, 0x26, 0x15, 0x84, 0x83, 0x95, 0x59, 0x25, 0x96, 0xd9, 0x50, 0xbc, + 0xe9, 0xc9, 0xac, 0xa8, 0x77, 0xa1, 0x95, 0xc5, 0x13, 0xae, 0xcd, 0x2e, 0x4c, 0xb5, 0xb7, 0xf3, + 0x8c, 0x82, 0xdd, 0x80, 0xc6, 0x18, 0x4d, 0xfa, 0xc0, 0x98, 0x35, 0x86, 0xd2, 0xd2, 0x4b, 0x2c, + 0x19, 0x22, 0x3a, 0x26, 0xc8, 0xd5, 0xf7, 0xf6, 0x9c, 0x21, 0xca, 0xcf, 0x10, 0x1c, 0xe2, 0xe2, + 0x3c, 0xf1, 0xdb, 0x70, 0xb1, 0x9c, 0x01, 0x95, 0xa5, 0x47, 0xa9, 0xf3, 0xdf, 0x75, 0xea, 0xe5, + 0xda, 0x02, 0x05, 0x9f, 0x4e, 0xa4, 0xe2, 0x17, 0xc2, 0xe7, 0x64, 0x58, 0xdd, 0xcd, 0x37, 0x4c, + 0xb4, 0x2b, 0x83, 0x1b, 0x73, 0xc3, 0xca, 0xb7, 0xdc, 0x6c, 0x1b, 0xa5, 0x9d, 0xfa, 0x23, 0xe8, + 0x0c, 0xd3, 0x67, 0xcf, 0x4e, 0x54, 0x18, 0x62, 0x70, 0x93, 0xda, 0x95, 0xce, 0xba, 0xa5, 0x7c, + 0x1e, 0xde, 0x1e, 0x96, 0x92, 0x7b, 0x2e, 0x40, 0xcb, 0xf6, 0x4d, 0xcb, 0x71, 0xa2, 0xc1, 0x3b, + 0x32, 0x9f, 0xc7, 0xf6, 0x37, 0x1c, 0x87, 0x12, 0xa3, 0x82, 0x50, 0xd0, 0x83, 0x16, 0xd3, 0x75, + 0x06, 0xab, 0x72, 0xeb, 0xce, 0x40, 0xdb, 0x0e, 0x3d, 0x95, 0xb3, 0x22, 0xcb, 0xf3, 0x84, 0x87, + 0x04, 0xdf, 0x50, 0x4f, 0xe5, 0x14, 0x68, 0xdb, 0x61, 0xd7, 0xa0, 0x33, 0xb6, 0x26, 0x66, 0x06, + 0x19, 0xdc, 0x92, 0xef, 0x90, 0xc6, 0xd6, 0x64, 0x4f, 0x81, 0x50, 0xcd, 0x65, 0x1a, 0x33, 0x29, + 0xdb, 0xbb, 0xb3, 0x6a, 0x9e, 0x47, 0x60, 0xb8, 0xee, 0xe6, 0xc1, 0x18, 0x32, 0x47, 0x64, 0x84, + 0x4d, 0x6f, 0x7d, 0xf0, 0xde, 0xbc, 0x39, 0x52, 0xa1, 0x23, 0x34, 0x47, 0x59, 0x14, 0x69, 0x1d, + 0x40, 0x5a, 0x6b, 0x12, 0xf6, 0xed, 0xd9, 0x36, 0xf9, 0x59, 0x8e, 0xcb, 0x1c, 0x5e, 0x12, 0xf5, + 0x3a, 0x00, 0x9d, 0x2a, 0x65, 0x9b, 0xb5, 0xd9, 0x36, 0xf9, 0x51, 0x8e, 0xeb, 0x4f, 0xf2, 0x53, + 0xdd, 0x1d, 0xd0, 0x53, 0x3c, 0xb4, 0x99, 0x96, 0xe7, 0x0d, 0xee, 0xcc, 0xae, 0x81, 0xec, 0x3c, + 0xc7, 0xb5, 0x54, 0x95, 0xf0, 0x23, 0x14, 0xbb, 0x26, 0x37, 0x6e, 0xf0, 0xfe, 0xec, 0x47, 0xf2, + 0x43, 0x1f, 0xd7, 0x8f, 0xf2, 0xf3, 0xdf, 0xc7, 0xd0, 0xcd, 0x42, 0xa8, 0xb2, 0xd9, 0x07, 0xb3, + 0x5b, 0x47, 0xf9, 0x3c, 0xc0, 0xb3, 0xc7, 0x60, 0xb2, 0xf1, 0x5d, 0x68, 0x4b, 0x8e, 0xcb, 0xa6, + 0xeb, 0xb3, 0x0a, 0x56, 0x38, 0x95, 0x5c, 0x8a, 0x46, 0x36, 0xbb, 0x01, 0x0d, 0x2b, 0x0c, 0xbd, + 0x93, 0xc1, 0x87, 0xb3, 0xab, 0x6a, 0x03, 0xc1, 0x5c, 0x62, 0x51, 0x0f, 0xc7, 0xa9, 0x97, 0xb8, + 0x59, 0x42, 0xf2, 0x37, 0x67, 0xf5, 0xb0, 0xf4, 0xe0, 0x81, 0xb7, 0xc7, 0xa5, 0x97, 0x19, 0xef, + 0x81, 0x16, 0x06, 0x71, 0x62, 0x3a, 0x63, 0x6f, 0x70, 0x77, 0x6e, 0xf7, 0x95, 0x59, 0xaf, 0xbc, + 0x15, 0xca, 0x82, 0x71, 0x17, 0x3a, 0x1b, 0xf4, 0x44, 0xd4, 0x8d, 0xc9, 0x94, 0xdf, 0x80, 0x7a, + 0x1e, 0x21, 0xcc, 0xf7, 0x08, 0xa2, 0x78, 0x26, 0xb6, 0xfd, 0x61, 0xc0, 0x09, 0x6d, 0xfc, 0x7d, + 0x0d, 0x9a, 0xfb, 0x41, 0x1a, 0xd9, 0xe2, 0xc5, 0xf9, 0xdc, 0x6f, 0x65, 0x2a, 0xe3, 0x17, 0xb9, + 0x6e, 0x52, 0x3b, 0x08, 0x5d, 0x0e, 0x3e, 0xd6, 0x28, 0x28, 0x93, 0x07, 0x1f, 0xcf, 0x42, 0x43, + 0x1e, 0xea, 0x65, 0x46, 0xb1, 0xac, 0xd0, 0x72, 0x49, 0xe3, 0x23, 0x27, 0x78, 0xea, 0xe3, 0x72, + 0x69, 0x50, 0x42, 0x2e, 0x64, 0xa0, 0x6d, 0x87, 0x1e, 0xc5, 0x64, 0x04, 0xb4, 0x1e, 0x65, 0x24, + 0xa8, 0x93, 0x01, 0x69, 0x55, 0x66, 0x81, 0xcd, 0xd6, 0x73, 0x02, 0x9b, 0x57, 0xa0, 0xee, 0x67, + 0x99, 0xac, 0x39, 0x9e, 0x9e, 0x23, 0x12, 0x9c, 0xdd, 0x82, 0x3c, 0x09, 0x5d, 0xf9, 0x6b, 0xcf, + 0x4f, 0x52, 0x5f, 0x07, 0x3d, 0x7f, 0x60, 0x9c, 0x7b, 0x6a, 0xc5, 0x93, 0xe3, 0x83, 0xac, 0xc4, + 0x0b, 0xb2, 0x05, 0x11, 0xd1, 0x30, 0x0a, 0x0e, 0x55, 0xf0, 0xaa, 0xfd, 0x2a, 0x11, 0xd1, 0x3d, + 0x6c, 0x97, 0xc5, 0x79, 0xdd, 0xd8, 0xb4, 0x03, 0x3f, 0x4e, 0xd4, 0x2b, 0x81, 0x96, 0x1b, 0x6f, + 0x62, 0xd5, 0xf8, 0xdb, 0x0a, 0x68, 0x38, 0x3b, 0x94, 0x31, 0x63, 0x50, 0x1f, 0xdb, 0x61, 0xaa, + 0xfc, 0x75, 0x2a, 0xab, 0x07, 0xc4, 0x52, 0x7a, 0xea, 0x01, 0x31, 0xf1, 0xb6, 0x26, 0xc3, 0x95, + 0x58, 0x96, 0x4f, 0x13, 0x4f, 0xbc, 0xc0, 0x72, 0x94, 0xc4, 0xb2, 0x2a, 0x7b, 0x0f, 0x98, 0x7c, + 0x3b, 0x37, 0x09, 0x2d, 0xdf, 0x51, 0x2f, 0x5a, 0x55, 0x0a, 0x58, 0x9f, 0x1e, 0xd1, 0x11, 0x42, + 0x3e, 0x67, 0x65, 0xe7, 0xa0, 0x69, 0xfb, 0xa6, 0xed, 0x27, 0xea, 0x5c, 0xda, 0xb0, 0xfd, 0x4d, + 0x3f, 0x51, 0x60, 0x37, 0x3f, 0x8e, 0x36, 0x6c, 0x7f, 0xdb, 0x99, 0x18, 0x7f, 0x5e, 0x81, 0xe5, + 0xbd, 0x28, 0xb0, 0x45, 0x1c, 0x3f, 0x44, 0x47, 0xc2, 0x22, 0xb7, 0x90, 0x41, 0x9d, 0x22, 0x9a, + 0xf2, 0x55, 0x20, 0x95, 0x51, 0x13, 0x65, 0xa8, 0x28, 0x3f, 0x43, 0xd5, 0xb8, 0x4e, 0x10, 0x3a, + 0x42, 0xe5, 0x68, 0x6a, 0x58, 0x2b, 0xa1, 0x29, 0x16, 0x7a, 0x03, 0x7a, 0xc5, 0x9b, 0x11, 0xea, + 0x41, 0x3d, 0x07, 0xce, 0xa1, 0xd4, 0xcb, 0x55, 0x68, 0x47, 0xc2, 0x42, 0x57, 0x8b, 0xba, 0x69, + 0x10, 0x0d, 0x48, 0x10, 0xf6, 0x63, 0x1c, 0x41, 0x7f, 0x2f, 0x12, 0xa1, 0x15, 0x09, 0xb4, 0xde, + 0x63, 0xe2, 0xf8, 0x79, 0x68, 0x7a, 0xc2, 0x1f, 0x25, 0x47, 0x6a, 0xbc, 0xaa, 0x96, 0x3f, 0x05, + 0xaf, 0x96, 0x9e, 0x82, 0x23, 0xe7, 0x23, 0x61, 0xa9, 0x17, 0xe3, 0x54, 0xc6, 0x95, 0xe2, 0xa7, + 0x9e, 0x8a, 0xb2, 0x6a, 0x5c, 0x56, 0x8c, 0x3f, 0xab, 0x41, 0x5b, 0x71, 0x86, 0xbe, 0x22, 0x65, + 0x58, 0xc9, 0x65, 0xd8, 0x87, 0x5a, 0xfc, 0xd8, 0x53, 0x42, 0xc5, 0x22, 0xfb, 0x10, 0x6a, 0x9e, + 0x3b, 0x56, 0x87, 0xb0, 0x4b, 0x53, 0x7b, 0xc1, 0x34, 0x7f, 0xd5, 0x59, 0x1a, 0xa9, 0xd9, 0x25, + 0xb2, 0xd5, 0x13, 0x13, 0x55, 0x4e, 0xf1, 0x04, 0xed, 0xf2, 0x04, 0xf5, 0x1a, 0x99, 0x6a, 0xd9, + 0x94, 0x76, 0x9c, 0x2d, 0xd6, 0x2e, 0xd7, 0x15, 0x64, 0xdb, 0x61, 0xdf, 0x04, 0x2d, 0xf6, 0xad, + 0x30, 0x3e, 0x0a, 0x12, 0x75, 0xe8, 0x62, 0x6b, 0xc9, 0xc4, 0x5f, 0xdb, 0xdc, 0x3d, 0x98, 0xf8, + 0xfb, 0x0a, 0xa3, 0x3e, 0x96, 0x53, 0xb2, 0xef, 0x40, 0x27, 0x16, 0x71, 0x2c, 0x1f, 0xef, 0x0c, + 0x03, 0xb5, 0x88, 0xcf, 0x95, 0x0f, 0x4c, 0x84, 0xc5, 0x59, 0xab, 0xc6, 0xed, 0xb8, 0x00, 0xb1, + 0xef, 0x43, 0x2f, 0x6b, 0xef, 0x05, 0xa3, 0x91, 0xc8, 0x9e, 0x67, 0x5c, 0x9a, 0xeb, 0xe1, 0x21, + 0xa1, 0x4b, 0xfd, 0x74, 0xe3, 0x32, 0x82, 0x7d, 0x0f, 0x7a, 0xa1, 0x14, 0xa6, 0xa9, 0xae, 0x00, + 0xa4, 0x31, 0xb8, 0x38, 0xe5, 0xba, 0x4c, 0x09, 0xbb, 0x48, 0xed, 0x2f, 0xe0, 0xb1, 0xf1, 0x5f, + 0x15, 0x68, 0x97, 0x46, 0x4d, 0x0f, 0xf4, 0x63, 0x11, 0x65, 0xd7, 0x01, 0x58, 0x46, 0xd8, 0x51, + 0xa0, 0xde, 0xb5, 0xea, 0x9c, 0xca, 0x08, 0x8b, 0x02, 0x75, 0x3f, 0xa4, 0x73, 0x2a, 0xa3, 0x01, + 0x54, 0xe7, 0x5f, 0xf9, 0x2c, 0x90, 0x84, 0x52, 0xe7, 0x9d, 0x02, 0xb8, 0x4d, 0xd1, 0x2d, 0x54, + 0xa7, 0x43, 0x2b, 0xce, 0x2e, 0x28, 0xf2, 0x3a, 0x2e, 0xe4, 0x27, 0x22, 0xc2, 0xb1, 0x28, 0xdb, + 0x99, 0x55, 0x51, 0xd6, 0x64, 0x93, 0x9e, 0x05, 0xbe, 0xbc, 0x03, 0xee, 0x70, 0x0d, 0x01, 0x3f, + 0x08, 0x7c, 0x6a, 0xa6, 0x24, 0x4b, 0xfc, 0xd4, 0x79, 0x56, 0x45, 0xcb, 0xf3, 0x38, 0x15, 0xe8, + 0xde, 0x39, 0xf4, 0x00, 0x54, 0xe7, 0x2d, 0xaa, 0x6f, 0x3b, 0xc6, 0xbf, 0x55, 0x60, 0x79, 0x8e, + 0xd9, 0xe8, 0x4d, 0x21, 0xa3, 0xb3, 0x17, 0x17, 0x1d, 0xde, 0xc4, 0xea, 0xb6, 0x43, 0x88, 0x64, + 0x4c, 0xca, 0x54, 0x55, 0x88, 0x64, 0x8c, 0x9a, 0x74, 0x0e, 0x9a, 0xc9, 0x84, 0x66, 0x2b, 0x17, + 0x46, 0x23, 0x99, 0xe0, 0x34, 0x37, 0x40, 0xf7, 0x82, 0x91, 0xe9, 0x89, 0x27, 0xc2, 0x23, 0x3e, + 0xf4, 0xd6, 0xaf, 0x9f, 0x22, 0xe5, 0xb5, 0x87, 0xc1, 0xe8, 0x21, 0xd2, 0x72, 0xcd, 0x53, 0x25, + 0xe3, 0x53, 0xd0, 0x32, 0x28, 0xd3, 0xa1, 0xb1, 0x25, 0x0e, 0xd3, 0x51, 0xff, 0x0d, 0xa6, 0x41, + 0x1d, 0x5b, 0xf4, 0x2b, 0x58, 0xfa, 0xc2, 0x8a, 0xfc, 0x7e, 0x15, 0xd1, 0xf7, 0xa3, 0x28, 0x88, + 0xfa, 0x35, 0x2c, 0xee, 0x59, 0xbe, 0x6b, 0xf7, 0xeb, 0x58, 0x7c, 0x60, 0x25, 0x96, 0xd7, 0x6f, + 0x18, 0x7f, 0xd1, 0x00, 0x6d, 0x4f, 0x7d, 0x9d, 0x6d, 0x41, 0x37, 0xff, 0x47, 0xc2, 0xe2, 0xc0, + 0xd0, 0xde, 0x6c, 0x81, 0x02, 0x43, 0x9d, 0xb0, 0x54, 0x9b, 0xfd, 0xd3, 0x42, 0x75, 0xee, 0x4f, + 0x0b, 0x97, 0xa1, 0xf6, 0x38, 0x3a, 0x99, 0xbe, 0xc2, 0xdb, 0xf3, 0x2c, 0x9f, 0x23, 0x98, 0x7d, + 0x00, 0x6d, 0x94, 0xbb, 0x19, 0xd3, 0x76, 0xae, 0x82, 0x2a, 0xe5, 0xff, 0x59, 0x10, 0x9c, 0x03, + 0x12, 0xa9, 0x2d, 0x7f, 0x0d, 0x34, 0xfb, 0xc8, 0xf5, 0x9c, 0x48, 0xf8, 0x2a, 0x52, 0xcd, 0xe6, + 0x87, 0xcc, 0x73, 0x1a, 0xf6, 0x5d, 0x7a, 0x83, 0x90, 0x05, 0x83, 0xca, 0x29, 0x50, 0xe7, 0xa6, + 0xce, 0xdb, 0x19, 0x05, 0x5f, 0x2a, 0x91, 0xd3, 0xce, 0x55, 0x3c, 0x60, 0x6b, 0x95, 0x1f, 0xb0, + 0xc9, 0xd7, 0xf7, 0xb4, 0xe1, 0x68, 0xf9, 0xa9, 0x0f, 0xf7, 0x9b, 0x9b, 0x6a, 0xf7, 0x9e, 0x8b, + 0xa4, 0x64, 0x7b, 0x9c, 0xda, 0xc5, 0xaf, 0x43, 0x0f, 0xbd, 0x02, 0x53, 0x3a, 0x13, 0x68, 0x4a, + 0x40, 0x3d, 0xa0, 0x4d, 0xe3, 0xa3, 0x2d, 0x74, 0x27, 0x50, 0x19, 0x6f, 0x40, 0x2f, 0x9b, 0x8b, + 0x7a, 0x41, 0x21, 0x33, 0x3f, 0xba, 0x19, 0x54, 0x3e, 0xa0, 0x58, 0x83, 0x33, 0xf6, 0x91, 0xe5, + 0xfb, 0xc2, 0x33, 0x0f, 0xd3, 0xe1, 0x30, 0xdb, 0x01, 0x3a, 0x74, 0xd3, 0xb9, 0xac, 0x50, 0xf7, + 0x08, 0x43, 0x1b, 0x8a, 0x01, 0x5d, 0xdf, 0xf5, 0xe4, 0xab, 0x43, 0xda, 0xed, 0xba, 0x44, 0xd9, + 0xf6, 0x5d, 0x8f, 0x82, 0xc8, 0xb8, 0xe7, 0x7d, 0x02, 0xfd, 0x34, 0x75, 0x9d, 0xd8, 0x4c, 0x82, + 0xec, 0xc7, 0x05, 0x74, 0x5f, 0x3d, 0xe5, 0xa5, 0x3e, 0x4a, 0x5d, 0xe7, 0x20, 0x50, 0xbf, 0x2e, + 0xe8, 0x12, 0x7d, 0x56, 0x35, 0x3e, 0x81, 0x4e, 0x59, 0x77, 0x50, 0x17, 0xe9, 0xf8, 0xd6, 0x7f, + 0x83, 0x01, 0x34, 0x77, 0x83, 0x68, 0x6c, 0x79, 0xfd, 0x0a, 0x96, 0xe5, 0xb3, 0xce, 0x7e, 0x95, + 0x75, 0x40, 0xcb, 0xce, 0x15, 0xfd, 0x9a, 0xf1, 0x31, 0x68, 0xd9, 0x9f, 0x18, 0xe8, 0x09, 0x7c, + 0xe0, 0x08, 0xe9, 0x55, 0x49, 0xcb, 0xa4, 0x21, 0x80, 0x3c, 0xaa, 0xec, 0x97, 0x22, 0xd5, 0xe2, + 0x97, 0x22, 0xc6, 0x6f, 0x40, 0xa7, 0x3c, 0xb8, 0x2c, 0xee, 0x57, 0x29, 0xe2, 0x7e, 0x0b, 0x5a, + 0xd1, 0x45, 0x5d, 0x14, 0x8c, 0xcd, 0x92, 0x83, 0xa1, 0x21, 0x00, 0x3f, 0x63, 0xfc, 0x5e, 0x05, + 0x1a, 0xe4, 0x2a, 0xd3, 0xd6, 0x82, 0x85, 0x62, 0xed, 0x34, 0xb8, 0x4e, 0x10, 0x9a, 0x69, 0xf9, + 0xc2, 0xbb, 0xfa, 0xfc, 0x0b, 0xef, 0xda, 0xf4, 0x85, 0xf7, 0x4b, 0x66, 0x44, 0xdd, 0x7a, 0x0c, + 0x4d, 0xf9, 0x17, 0x17, 0xb6, 0x0c, 0xdd, 0x47, 0xfe, 0xb1, 0x1f, 0x3c, 0xf5, 0x25, 0xa0, 0xff, + 0x06, 0x3b, 0x03, 0x4b, 0x19, 0xd3, 0xd5, 0xef, 0x62, 0xfa, 0x15, 0xd6, 0x87, 0x0e, 0x89, 0x35, + 0x83, 0x54, 0xd9, 0x65, 0x18, 0xa8, 0xcd, 0x61, 0x2b, 0xf0, 0xc5, 0x6e, 0x90, 0xb8, 0xc3, 0x93, + 0x0c, 0x5b, 0x63, 0x4b, 0xd0, 0xde, 0x4f, 0x82, 0x70, 0x5f, 0xf8, 0x8e, 0xeb, 0x8f, 0xfa, 0xf5, + 0x5b, 0x0f, 0xa0, 0x29, 0x7f, 0x2e, 0x53, 0xfa, 0xa4, 0x04, 0xf4, 0xdf, 0x40, 0xea, 0x2f, 0x2c, + 0x37, 0x71, 0xfd, 0xd1, 0xae, 0x98, 0x24, 0xd2, 0x28, 0x3d, 0xb4, 0xe2, 0xa4, 0x5f, 0x65, 0x3d, + 0x00, 0xd5, 0xeb, 0x7d, 0xdf, 0xe9, 0xd7, 0xee, 0x6d, 0xfe, 0xe4, 0x67, 0x57, 0x2a, 0xff, 0xf0, + 0xb3, 0x2b, 0x95, 0x7f, 0xfe, 0xd9, 0x95, 0x37, 0xfe, 0xf8, 0x5f, 0xae, 0x54, 0x7e, 0xf0, 0x41, + 0xe9, 0xd7, 0x39, 0x63, 0x2b, 0x89, 0xdc, 0x89, 0xbc, 0xea, 0xcc, 0x2a, 0xbe, 0xb8, 0x13, 0x1e, + 0x8f, 0xee, 0x84, 0x87, 0x77, 0x32, 0x9d, 0x3b, 0x6c, 0xd2, 0x1f, 0x71, 0x3e, 0xfc, 0xdf, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x0a, 0xdf, 0x97, 0x1e, 0x90, 0x47, 0x00, 0x00, } func (m *Message) Marshal() (dAtA []byte, err error) { @@ -9478,7 +9493,7 @@ func (m *DedupJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintPipeline(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x6a + dAtA[i] = 0x7a } } if len(m.UpdateColIdxList) > 0 { @@ -9498,7 +9513,7 @@ func (m *DedupJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], dAtA72[:j71]) i = encodeVarintPipeline(dAtA, i, uint64(j71)) i-- - dAtA[i] = 0x62 + dAtA[i] = 0x72 } if len(m.RightTypes) > 0 { for iNdEx := len(m.RightTypes) - 1; iNdEx >= 0; iNdEx-- { @@ -9511,7 +9526,7 @@ func (m *DedupJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintPipeline(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x5a + dAtA[i] = 0x6a } } if len(m.LeftTypes) > 0 { @@ -9525,7 +9540,7 @@ func (m *DedupJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintPipeline(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x52 + dAtA[i] = 0x62 } } if len(m.DedupColTypes) > 0 { @@ -9539,7 +9554,7 @@ func (m *DedupJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintPipeline(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x4a + dAtA[i] = 0x5a } } if len(m.DedupColName) > 0 { @@ -9547,22 +9562,22 @@ func (m *DedupJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.DedupColName) i = encodeVarintPipeline(dAtA, i, uint64(len(m.DedupColName))) i-- - dAtA[i] = 0x42 + dAtA[i] = 0x52 } if m.OnDuplicateAction != 0 { i = encodeVarintPipeline(dAtA, i, uint64(m.OnDuplicateAction)) i-- - dAtA[i] = 0x38 + dAtA[i] = 0x48 } if m.ShuffleIdx != 0 { i = encodeVarintPipeline(dAtA, i, uint64(m.ShuffleIdx)) i-- - dAtA[i] = 0x30 + dAtA[i] = 0x40 } if m.JoinMapTag != 0 { i = encodeVarintPipeline(dAtA, i, uint64(m.JoinMapTag)) i-- - dAtA[i] = 0x28 + dAtA[i] = 0x38 } if m.IsShuffle { i-- @@ -9572,7 +9587,7 @@ func (m *DedupJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0 } i-- - dAtA[i] = 0x20 + dAtA[i] = 0x30 } if len(m.RuntimeFilterBuildList) > 0 { for iNdEx := len(m.RuntimeFilterBuildList) - 1; iNdEx >= 0; iNdEx-- { @@ -9585,7 +9600,7 @@ func (m *DedupJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintPipeline(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x2a } } if len(m.RightCond) > 0 { @@ -9599,7 +9614,7 @@ func (m *DedupJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintPipeline(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x22 } } if len(m.LeftCond) > 0 { @@ -9613,9 +9628,47 @@ func (m *DedupJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintPipeline(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x1a } } + if len(m.ColList) > 0 { + dAtA74 := make([]byte, len(m.ColList)*10) + var j73 int + for _, num1 := range m.ColList { + num := uint64(num1) + for num >= 1<<7 { + dAtA74[j73] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j73++ + } + dAtA74[j73] = uint8(num) + j73++ + } + i -= j73 + copy(dAtA[i:], dAtA74[:j73]) + i = encodeVarintPipeline(dAtA, i, uint64(j73)) + i-- + dAtA[i] = 0x12 + } + if len(m.RelList) > 0 { + dAtA76 := make([]byte, len(m.RelList)*10) + var j75 int + for _, num1 := range m.RelList { + num := uint64(num1) + for num >= 1<<7 { + dAtA76[j75] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j75++ + } + dAtA76[j75] = uint8(num) + j75++ + } + i -= j75 + copy(dAtA[i:], dAtA76[:j75]) + i = encodeVarintPipeline(dAtA, i, uint64(j75)) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } @@ -9659,40 +9712,40 @@ func (m *Product) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x18 } if len(m.ColList) > 0 { - dAtA74 := make([]byte, len(m.ColList)*10) - var j73 int + dAtA78 := make([]byte, len(m.ColList)*10) + var j77 int for _, num1 := range m.ColList { num := uint64(num1) for num >= 1<<7 { - dAtA74[j73] = uint8(uint64(num)&0x7f | 0x80) + dAtA78[j77] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j73++ + j77++ } - dAtA74[j73] = uint8(num) - j73++ + dAtA78[j77] = uint8(num) + j77++ } - i -= j73 - copy(dAtA[i:], dAtA74[:j73]) - i = encodeVarintPipeline(dAtA, i, uint64(j73)) + i -= j77 + copy(dAtA[i:], dAtA78[:j77]) + i = encodeVarintPipeline(dAtA, i, uint64(j77)) i-- dAtA[i] = 0x12 } if len(m.RelList) > 0 { - dAtA76 := make([]byte, len(m.RelList)*10) - var j75 int + dAtA80 := make([]byte, len(m.RelList)*10) + var j79 int for _, num1 := range m.RelList { num := uint64(num1) for num >= 1<<7 { - dAtA76[j75] = uint8(uint64(num)&0x7f | 0x80) + dAtA80[j79] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j75++ + j79++ } - dAtA76[j75] = uint8(num) - j75++ + dAtA80[j79] = uint8(num) + j79++ } - i -= j75 - copy(dAtA[i:], dAtA76[:j75]) - i = encodeVarintPipeline(dAtA, i, uint64(j75)) + i -= j79 + copy(dAtA[i:], dAtA80[:j79]) + i = encodeVarintPipeline(dAtA, i, uint64(j79)) i-- dAtA[i] = 0xa } @@ -9741,40 +9794,40 @@ func (m *ProductL2) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x1a } if len(m.ColList) > 0 { - dAtA79 := make([]byte, len(m.ColList)*10) - var j78 int + dAtA83 := make([]byte, len(m.ColList)*10) + var j82 int for _, num1 := range m.ColList { num := uint64(num1) for num >= 1<<7 { - dAtA79[j78] = uint8(uint64(num)&0x7f | 0x80) + dAtA83[j82] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j78++ + j82++ } - dAtA79[j78] = uint8(num) - j78++ + dAtA83[j82] = uint8(num) + j82++ } - i -= j78 - copy(dAtA[i:], dAtA79[:j78]) - i = encodeVarintPipeline(dAtA, i, uint64(j78)) + i -= j82 + copy(dAtA[i:], dAtA83[:j82]) + i = encodeVarintPipeline(dAtA, i, uint64(j82)) i-- dAtA[i] = 0x12 } if len(m.RelList) > 0 { - dAtA81 := make([]byte, len(m.RelList)*10) - var j80 int + dAtA85 := make([]byte, len(m.RelList)*10) + var j84 int for _, num1 := range m.RelList { num := uint64(num1) for num >= 1<<7 { - dAtA81[j80] = uint8(uint64(num)&0x7f | 0x80) + dAtA85[j84] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j80++ + j84++ } - dAtA81[j80] = uint8(num) - j80++ + dAtA85[j84] = uint8(num) + j84++ } - i -= j80 - copy(dAtA[i:], dAtA81[:j80]) - i = encodeVarintPipeline(dAtA, i, uint64(j80)) + i -= j84 + copy(dAtA[i:], dAtA85[:j84]) + i = encodeVarintPipeline(dAtA, i, uint64(j84)) i-- dAtA[i] = 0xa } @@ -9820,21 +9873,21 @@ func (m *IndexJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.Result) > 0 { - dAtA83 := make([]byte, len(m.Result)*10) - var j82 int + dAtA87 := make([]byte, len(m.Result)*10) + var j86 int for _, num1 := range m.Result { num := uint64(num1) for num >= 1<<7 { - dAtA83[j82] = uint8(uint64(num)&0x7f | 0x80) + dAtA87[j86] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j82++ + j86++ } - dAtA83[j82] = uint8(num) - j82++ + dAtA87[j86] = uint8(num) + j86++ } - i -= j82 - copy(dAtA[i:], dAtA83[:j82]) - i = encodeVarintPipeline(dAtA, i, uint64(j82)) + i -= j86 + copy(dAtA[i:], dAtA87[:j86]) + i = encodeVarintPipeline(dAtA, i, uint64(j86)) i-- dAtA[i] = 0xa } @@ -9983,21 +10036,21 @@ func (m *FileOffset) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Offset) > 0 { - dAtA85 := make([]byte, len(m.Offset)*10) - var j84 int + dAtA89 := make([]byte, len(m.Offset)*10) + var j88 int for _, num1 := range m.Offset { num := uint64(num1) for num >= 1<<7 { - dAtA85[j84] = uint8(uint64(num)&0x7f | 0x80) + dAtA89[j88] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j84++ + j88++ } - dAtA85[j84] = uint8(num) - j84++ + dAtA89[j88] = uint8(num) + j88++ } - i -= j84 - copy(dAtA[i:], dAtA85[:j84]) - i = encodeVarintPipeline(dAtA, i, uint64(j84)) + i -= j88 + copy(dAtA[i:], dAtA89[:j88]) + i = encodeVarintPipeline(dAtA, i, uint64(j88)) i-- dAtA[i] = 0xa } @@ -10140,21 +10193,21 @@ func (m *ExternalScan) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.FileSize) > 0 { - dAtA88 := make([]byte, len(m.FileSize)*10) - var j87 int + dAtA92 := make([]byte, len(m.FileSize)*10) + var j91 int for _, num1 := range m.FileSize { num := uint64(num1) for num >= 1<<7 { - dAtA88[j87] = uint8(uint64(num)&0x7f | 0x80) + dAtA92[j91] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j87++ + j91++ } - dAtA88[j87] = uint8(num) - j87++ + dAtA92[j91] = uint8(num) + j91++ } - i -= j87 - copy(dAtA[i:], dAtA88[:j87]) - i = encodeVarintPipeline(dAtA, i, uint64(j87)) + i -= j91 + copy(dAtA[i:], dAtA92[:j91]) + i = encodeVarintPipeline(dAtA, i, uint64(j91)) i-- dAtA[i] = 0x12 } @@ -12021,40 +12074,40 @@ func (m *Pipeline) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.NilBatchCnt) > 0 { - dAtA145 := make([]byte, len(m.NilBatchCnt)*10) - var j144 int + dAtA149 := make([]byte, len(m.NilBatchCnt)*10) + var j148 int for _, num1 := range m.NilBatchCnt { num := uint64(num1) for num >= 1<<7 { - dAtA145[j144] = uint8(uint64(num)&0x7f | 0x80) + dAtA149[j148] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j144++ + j148++ } - dAtA145[j144] = uint8(num) - j144++ + dAtA149[j148] = uint8(num) + j148++ } - i -= j144 - copy(dAtA[i:], dAtA145[:j144]) - i = encodeVarintPipeline(dAtA, i, uint64(j144)) + i -= j148 + copy(dAtA[i:], dAtA149[:j148]) + i = encodeVarintPipeline(dAtA, i, uint64(j148)) i-- dAtA[i] = 0x6a } if len(m.ChannelBufferSize) > 0 { - dAtA147 := make([]byte, len(m.ChannelBufferSize)*10) - var j146 int + dAtA151 := make([]byte, len(m.ChannelBufferSize)*10) + var j150 int for _, num1 := range m.ChannelBufferSize { num := uint64(num1) for num >= 1<<7 { - dAtA147[j146] = uint8(uint64(num)&0x7f | 0x80) + dAtA151[j150] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j146++ + j150++ } - dAtA147[j146] = uint8(num) - j146++ + dAtA151[j150] = uint8(num) + j150++ } - i -= j146 - copy(dAtA[i:], dAtA147[:j146]) - i = encodeVarintPipeline(dAtA, i, uint64(j146)) + i -= j150 + copy(dAtA[i:], dAtA151[:j150]) + i = encodeVarintPipeline(dAtA, i, uint64(j150)) i-- dAtA[i] = 0x62 } @@ -12291,40 +12344,40 @@ func (m *Apply) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.ColList) > 0 { - dAtA152 := make([]byte, len(m.ColList)*10) - var j151 int + dAtA156 := make([]byte, len(m.ColList)*10) + var j155 int for _, num1 := range m.ColList { num := uint64(num1) for num >= 1<<7 { - dAtA152[j151] = uint8(uint64(num)&0x7f | 0x80) + dAtA156[j155] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j151++ + j155++ } - dAtA152[j151] = uint8(num) - j151++ + dAtA156[j155] = uint8(num) + j155++ } - i -= j151 - copy(dAtA[i:], dAtA152[:j151]) - i = encodeVarintPipeline(dAtA, i, uint64(j151)) + i -= j155 + copy(dAtA[i:], dAtA156[:j155]) + i = encodeVarintPipeline(dAtA, i, uint64(j155)) i-- dAtA[i] = 0x1a } if len(m.RelList) > 0 { - dAtA154 := make([]byte, len(m.RelList)*10) - var j153 int + dAtA158 := make([]byte, len(m.RelList)*10) + var j157 int for _, num1 := range m.RelList { num := uint64(num1) for num >= 1<<7 { - dAtA154[j153] = uint8(uint64(num)&0x7f | 0x80) + dAtA158[j157] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j153++ + j157++ } - dAtA154[j153] = uint8(num) - j153++ + dAtA158[j157] = uint8(num) + j157++ } - i -= j153 - copy(dAtA[i:], dAtA154[:j153]) - i = encodeVarintPipeline(dAtA, i, uint64(j153)) + i -= j157 + copy(dAtA[i:], dAtA158[:j157]) + i = encodeVarintPipeline(dAtA, i, uint64(j157)) i-- dAtA[i] = 0x12 } @@ -13674,6 +13727,20 @@ func (m *DedupJoin) ProtoSize() (n int) { } var l int _ = l + if len(m.RelList) > 0 { + l = 0 + for _, e := range m.RelList { + l += sovPipeline(uint64(e)) + } + n += 1 + sovPipeline(uint64(l)) + l + } + if len(m.ColList) > 0 { + l = 0 + for _, e := range m.ColList { + l += sovPipeline(uint64(e)) + } + n += 1 + sovPipeline(uint64(l)) + l + } if len(m.LeftCond) > 0 { for _, e := range m.LeftCond { l = e.ProtoSize() @@ -23697,6 +23764,158 @@ func (m *DedupJoin) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType == 0 { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.RelList = append(m.RelList, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthPipeline + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.RelList) == 0 { + m.RelList = make([]int32, 0, elementCount) + } + for iNdEx < postIndex { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.RelList = append(m.RelList, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field RelList", wireType) + } + case 2: + if wireType == 0 { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ColList = append(m.ColList, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthPipeline + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.ColList) == 0 { + m.ColList = make([]int32, 0, elementCount) + } + for iNdEx < postIndex { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ColList = append(m.ColList, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field ColList", wireType) + } + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field LeftCond", wireType) } @@ -23730,7 +23949,7 @@ func (m *DedupJoin) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 2: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field RightCond", wireType) } @@ -23764,7 +23983,7 @@ func (m *DedupJoin) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field RuntimeFilterBuildList", wireType) } @@ -23798,7 +24017,7 @@ func (m *DedupJoin) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 6: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field IsShuffle", wireType) } @@ -23818,7 +24037,7 @@ func (m *DedupJoin) Unmarshal(dAtA []byte) error { } } m.IsShuffle = bool(v != 0) - case 5: + case 7: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field JoinMapTag", wireType) } @@ -23837,7 +24056,7 @@ func (m *DedupJoin) Unmarshal(dAtA []byte) error { break } } - case 6: + case 8: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field ShuffleIdx", wireType) } @@ -23856,7 +24075,7 @@ func (m *DedupJoin) Unmarshal(dAtA []byte) error { break } } - case 7: + case 9: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field OnDuplicateAction", wireType) } @@ -23875,7 +24094,7 @@ func (m *DedupJoin) Unmarshal(dAtA []byte) error { break } } - case 8: + case 10: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field DedupColName", wireType) } @@ -23907,7 +24126,7 @@ func (m *DedupJoin) Unmarshal(dAtA []byte) error { } m.DedupColName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 9: + case 11: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field DedupColTypes", wireType) } @@ -23941,7 +24160,7 @@ func (m *DedupJoin) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 10: + case 12: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field LeftTypes", wireType) } @@ -23975,7 +24194,7 @@ func (m *DedupJoin) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 11: + case 13: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field RightTypes", wireType) } @@ -24009,7 +24228,7 @@ func (m *DedupJoin) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 12: + case 14: if wireType == 0 { var v int32 for shift := uint(0); ; shift += 7 { @@ -24085,7 +24304,7 @@ func (m *DedupJoin) Unmarshal(dAtA []byte) error { } else { return fmt.Errorf("proto: wrong wireType = %d for field UpdateColIdxList", wireType) } - case 13: + case 15: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field UpdateColExprList", wireType) } diff --git a/pkg/sql/compile/operator.go b/pkg/sql/compile/operator.go index aa8c63b09b1a7..369419e0133b0 100644 --- a/pkg/sql/compile/operator.go +++ b/pkg/sql/compile/operator.go @@ -560,13 +560,13 @@ func dupOperator(sourceOp vm.Operator, index int, maxParallel int) vm.Operator { op.Channel = t.Channel op.NumCPU = uint64(maxParallel) op.IsMerger = (index == 0) - op.Result = append(op.Result, t.Result...) + op.Result = t.Result op.LeftTypes = t.LeftTypes - op.RightTypes = append(op.RightTypes, t.RightTypes...) - op.Conditions = append(op.Conditions, t.Conditions...) + op.RightTypes = t.RightTypes + op.Conditions = t.Conditions op.IsShuffle = t.IsShuffle op.ShuffleIdx = t.ShuffleIdx - op.RuntimeFilterSpecs = append(op.RuntimeFilterSpecs, t.RuntimeFilterSpecs...) + op.RuntimeFilterSpecs = t.RuntimeFilterSpecs op.JoinMapTag = t.JoinMapTag op.OnDuplicateAction = t.OnDuplicateAction op.DedupColName = t.DedupColName diff --git a/pkg/sql/compile/remoterun.go b/pkg/sql/compile/remoterun.go index a34ca43872576..bb67382751f9c 100644 --- a/pkg/sql/compile/remoterun.go +++ b/pkg/sql/compile/remoterun.go @@ -809,7 +809,10 @@ func convertToPipelineInstruction(op vm.Operator, proc *process.Process, ctx *sc RuntimeFilterSpec: t.RuntimeFilterSpec, } case *dedupjoin.DedupJoin: + relList, colList := getRelColList(t.Result) in.DedupJoin = &pipeline.DedupJoin{ + RelList: relList, + ColList: colList, LeftCond: t.Conditions[0], RightCond: t.Conditions[1], RuntimeFilterBuildList: t.RuntimeFilterSpecs, @@ -1341,6 +1344,9 @@ func convertToVmOperator(opr *pipeline.Instruction, ctx *scopeContext, eng engin case vm.DedupJoin: arg := dedupjoin.NewArgument() t := opr.GetDedupJoin() + arg.Result = convertToResultPos(t.RelList, t.ColList) + arg.LeftTypes = convertToTypes(t.LeftTypes) + arg.RightTypes = convertToTypes(t.RightTypes) arg.Conditions = [][]*plan.Expr{t.LeftCond, t.RightCond} arg.RuntimeFilterSpecs = t.RuntimeFilterBuildList arg.IsShuffle = t.IsShuffle @@ -1349,8 +1355,6 @@ func convertToVmOperator(opr *pipeline.Instruction, ctx *scopeContext, eng engin arg.OnDuplicateAction = t.OnDuplicateAction arg.DedupColName = t.DedupColName arg.DedupColTypes = t.DedupColTypes - arg.LeftTypes = convertToTypes(t.LeftTypes) - arg.RightTypes = convertToTypes(t.RightTypes) arg.UpdateColIdxList = t.UpdateColIdxList arg.UpdateColExprList = t.UpdateColExprList op = arg diff --git a/proto/pipeline.proto b/proto/pipeline.proto index eb10a0dea9396..a17098cd72a99 100644 --- a/proto/pipeline.proto +++ b/proto/pipeline.proto @@ -356,19 +356,21 @@ message MarkJoin { } message DedupJoin { - repeated plan.Expr left_cond = 1; - repeated plan.Expr right_cond = 2; - repeated plan.RuntimeFilterSpec runtime_filter_build_list = 3; - bool is_shuffle = 4; - int32 join_map_tag = 5; - int32 shuffle_idx = 6; - plan.Node.OnDuplicateAction on_duplicate_action = 7; - string dedup_col_name = 8; - repeated plan.Type dedup_col_types = 9 [(gogoproto.nullable) = false]; - repeated plan.Type left_types = 10 [(gogoproto.nullable) = false]; - repeated plan.Type right_types = 11 [(gogoproto.nullable) = false]; - repeated int32 update_col_idx_list = 12; - repeated plan.Expr update_col_expr_list = 13; + repeated int32 rel_list = 1; + repeated int32 col_list = 2; + repeated plan.Expr left_cond = 3; + repeated plan.Expr right_cond = 4; + repeated plan.RuntimeFilterSpec runtime_filter_build_list = 5; + bool is_shuffle = 6; + int32 join_map_tag = 7; + int32 shuffle_idx = 8; + plan.Node.OnDuplicateAction on_duplicate_action = 9; + string dedup_col_name = 10; + repeated plan.Type dedup_col_types = 11 [(gogoproto.nullable) = false]; + repeated plan.Type left_types = 12 [(gogoproto.nullable) = false]; + repeated plan.Type right_types = 13 [(gogoproto.nullable) = false]; + repeated int32 update_col_idx_list = 14; + repeated plan.Expr update_col_expr_list = 15; } message Product { diff --git a/test/distributed/cases/dml/insert/insert_ignore.result b/test/distributed/cases/dml/insert/insert_ignore.result index 71d282317e258..408aa702f79f6 100644 --- a/test/distributed/cases/dml/insert/insert_ignore.result +++ b/test/distributed/cases/dml/insert/insert_ignore.result @@ -128,3 +128,12 @@ c1 c2 45 45 55 55 222 222 +create table insert_ignore_09(c1 int primary key, c2 int); +insert into insert_ignore_09 values(20,45),(21,55),(1,45),(6,22),(5,1),(1000,222),(99999,19); +insert ignore into insert_ignore_09 select result, result from generate_series(1,10000000) g; +select count(*) from insert_ignore_09; +count(*) +10000000 +select count(*) from insert_ignore_09 where c1 != c2; +count(*) +7 diff --git a/test/distributed/cases/dml/insert/insert_ignore.sql b/test/distributed/cases/dml/insert/insert_ignore.sql index 7184ba8a78170..aa7f5be5801f1 100644 --- a/test/distributed/cases/dml/insert/insert_ignore.sql +++ b/test/distributed/cases/dml/insert/insert_ignore.sql @@ -69,3 +69,9 @@ insert into insert_ignore_08 values(20,45),(21,55),(1,45),(6,22),(5,1),(1000,222 insert ignore into insert_ignore_08 select * from insert_ignore_07; select count(*) from insert_ignore_08; select * from insert_ignore_08 where c2 in (45,55,22,1,222,19); + +create table insert_ignore_09(c1 int primary key, c2 int); +insert into insert_ignore_09 values(20,45),(21,55),(1,45),(6,22),(5,1),(1000,222),(99999,19); +insert ignore into insert_ignore_09 select result, result from generate_series(1,10000000) g; +select count(*) from insert_ignore_09; +select count(*) from insert_ignore_09 where c1 != c2; From d9f9ff1cbeaf20830643f57b7781a6a79ea10c55 Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Fri, 29 Nov 2024 12:10:10 +0800 Subject: [PATCH 07/18] add ut --- pkg/sql/compile/remoterun_test.go | 52 +++++++++++++++---------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/pkg/sql/compile/remoterun_test.go b/pkg/sql/compile/remoterun_test.go index d4f75a3a029ed..e033102d5a39a 100644 --- a/pkg/sql/compile/remoterun_test.go +++ b/pkg/sql/compile/remoterun_test.go @@ -19,45 +19,33 @@ import ( "testing" "time" + "github.com/golang/mock/gomock" + "github.com/google/uuid" + "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/common/morpc" - "github.com/matrixorigin/matrixone/pkg/pb/txn" - "github.com/matrixorigin/matrixone/pkg/sql/colexec/connector" - "github.com/matrixorigin/matrixone/pkg/sql/colexec/value_scan" - "github.com/matrixorigin/matrixone/pkg/testutil" - "github.com/matrixorigin/matrixone/pkg/txn/client" - - "github.com/matrixorigin/matrixone/pkg/sql/colexec" - - "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/common/reuse" "github.com/matrixorigin/matrixone/pkg/container/batch" "github.com/matrixorigin/matrixone/pkg/container/types" "github.com/matrixorigin/matrixone/pkg/container/vector" "github.com/matrixorigin/matrixone/pkg/defines" - "github.com/matrixorigin/matrixone/pkg/sql/colexec/aggexec" - "github.com/matrixorigin/matrixone/pkg/sql/colexec/apply" - "github.com/matrixorigin/matrixone/pkg/sql/colexec/hashbuild" - "github.com/matrixorigin/matrixone/pkg/sql/colexec/indexbuild" - "github.com/matrixorigin/matrixone/pkg/sql/colexec/postdml" - "github.com/matrixorigin/matrixone/pkg/sql/colexec/shufflebuild" - - "github.com/matrixorigin/matrixone/pkg/common/mpool" - "github.com/matrixorigin/matrixone/pkg/common/reuse" - - "github.com/golang/mock/gomock" - "github.com/google/uuid" - "github.com/stretchr/testify/require" - - "github.com/matrixorigin/matrixone/pkg/sql/colexec/source" - mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" "github.com/matrixorigin/matrixone/pkg/pb/pipeline" + "github.com/matrixorigin/matrixone/pkg/pb/txn" + "github.com/matrixorigin/matrixone/pkg/sql/colexec" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/aggexec" "github.com/matrixorigin/matrixone/pkg/sql/colexec/anti" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/apply" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/connector" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/dedupjoin" "github.com/matrixorigin/matrixone/pkg/sql/colexec/deletion" "github.com/matrixorigin/matrixone/pkg/sql/colexec/dispatch" "github.com/matrixorigin/matrixone/pkg/sql/colexec/external" "github.com/matrixorigin/matrixone/pkg/sql/colexec/filter" "github.com/matrixorigin/matrixone/pkg/sql/colexec/group" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/hashbuild" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/indexbuild" "github.com/matrixorigin/matrixone/pkg/sql/colexec/insert" "github.com/matrixorigin/matrixone/pkg/sql/colexec/intersect" "github.com/matrixorigin/matrixone/pkg/sql/colexec/intersectall" @@ -75,6 +63,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/sql/colexec/offset" "github.com/matrixorigin/matrixone/pkg/sql/colexec/onduplicatekey" "github.com/matrixorigin/matrixone/pkg/sql/colexec/order" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/postdml" "github.com/matrixorigin/matrixone/pkg/sql/colexec/preinsert" "github.com/matrixorigin/matrixone/pkg/sql/colexec/preinsertunique" "github.com/matrixorigin/matrixone/pkg/sql/colexec/product" @@ -84,12 +73,18 @@ import ( "github.com/matrixorigin/matrixone/pkg/sql/colexec/rightsemi" "github.com/matrixorigin/matrixone/pkg/sql/colexec/semi" "github.com/matrixorigin/matrixone/pkg/sql/colexec/shuffle" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/shufflebuild" "github.com/matrixorigin/matrixone/pkg/sql/colexec/single" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/source" "github.com/matrixorigin/matrixone/pkg/sql/colexec/table_function" "github.com/matrixorigin/matrixone/pkg/sql/colexec/top" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/value_scan" "github.com/matrixorigin/matrixone/pkg/sql/plan" + "github.com/matrixorigin/matrixone/pkg/testutil" + "github.com/matrixorigin/matrixone/pkg/txn/client" "github.com/matrixorigin/matrixone/pkg/vm" "github.com/matrixorigin/matrixone/pkg/vm/process" + "github.com/stretchr/testify/require" ) func Test_EncodeProcessInfo(t *testing.T) { @@ -245,7 +240,11 @@ func Test_convertToPipelineInstruction(t *testing.T) { &source.Source{}, &apply.Apply{TableFunction: &table_function.TableFunction{}}, &postdml.PostDml{ - PostDmlCtx: &postdml.PostDmlCtx{FullText: &postdml.PostDmlFullTextCtx{}}}, + PostDmlCtx: &postdml.PostDmlCtx{ + FullText: &postdml.PostDmlFullTextCtx{}, + }, + }, + &dedupjoin.DedupJoin{}, } ctx := &scopeContext{ id: 1, @@ -321,6 +320,7 @@ func Test_convertToVmInstruction(t *testing.T) { {Op: int32(vm.IndexBuild), IndexBuild: &pipeline.Indexbuild{}}, {Op: int32(vm.Apply), Apply: &pipeline.Apply{}, TableFunction: &pipeline.TableFunction{}}, {Op: int32(vm.PostDml), PostDml: &pipeline.PostDml{}}, + {Op: int32(vm.DedupJoin), PostDml: &pipeline.DedupJoin{}}, } for _, instruction := range instructions { _, err := convertToVmOperator(instruction, ctx, nil) From 049600cbd9e0a22502c36e382dac050812990f89 Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Fri, 29 Nov 2024 12:23:29 +0800 Subject: [PATCH 08/18] fix --- pkg/sql/compile/remoterun_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/sql/compile/remoterun_test.go b/pkg/sql/compile/remoterun_test.go index e033102d5a39a..580eb72a87022 100644 --- a/pkg/sql/compile/remoterun_test.go +++ b/pkg/sql/compile/remoterun_test.go @@ -320,7 +320,7 @@ func Test_convertToVmInstruction(t *testing.T) { {Op: int32(vm.IndexBuild), IndexBuild: &pipeline.Indexbuild{}}, {Op: int32(vm.Apply), Apply: &pipeline.Apply{}, TableFunction: &pipeline.TableFunction{}}, {Op: int32(vm.PostDml), PostDml: &pipeline.PostDml{}}, - {Op: int32(vm.DedupJoin), PostDml: &pipeline.DedupJoin{}}, + {Op: int32(vm.DedupJoin), DedupJoin: &pipeline.DedupJoin{}}, } for _, instruction := range instructions { _, err := convertToVmOperator(instruction, ctx, nil) From 0332d984849aabf825f90cbc99c42db715c80e30 Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Fri, 29 Nov 2024 12:33:46 +0800 Subject: [PATCH 09/18] fix ut --- .../cases/dml/insert/insert_duplicate.result | 26 +++++++++---------- .../cases/dml/insert/insert_duplicate.sql | 16 ++++++------ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/test/distributed/cases/dml/insert/insert_duplicate.result b/test/distributed/cases/dml/insert/insert_duplicate.result index a9365a744f034..7383cfe2fbace 100644 --- a/test/distributed/cases/dml/insert/insert_duplicate.result +++ b/test/distributed/cases/dml/insert/insert_duplicate.result @@ -392,16 +392,16 @@ SELECT * FROM `serial_numbers` WHERE `biz_type` = 4 and `namespace` = '202409111 id biz_type namespace sn 100001 4 2024091117 1 drop table if exists indup_11; -create table indup_11(a int, b int, c int, primary key(a, b)); -insert into indup_11(a, b) select result, result from generate_series(1, 100000) g; -insert into indup_11 values(1, 1, 1); -Duplicate entry '(1,1)' for key '(a,b)' -insert ignore into indup_11 values(1, 1, 1); -insert into indup_11 values(1, 1, 1) on duplicate key update c = a + b; -select * from indup_11 where c is not null; -a b c -1 1 2 -insert into indup_11 values(1, 1, 1), (1, 1, 2), (2, 2, 3) on duplicate key update c = c + 10; -select * from indup_11 where c is not null; -a b c -1 1 22 +create table indup_11(a int primary key, b int); +insert into indup_11(a) select result from generate_series(1, 100000) g; +insert into indup_11 values(1, 1); +Duplicate entry '1' for key 'a' +insert ignore into indup_11 values(1, 1); +insert into indup_11 values(1, 1) on duplicate key update b = a + 10; +select * from indup_11 where b is not null; +a b +1 11 +insert into indup_11 values(1, 1), (1, 1), (2, 2) on duplicate key update b = b + 10; +select * from indup_11 where b is not null; +a b +1 31 diff --git a/test/distributed/cases/dml/insert/insert_duplicate.sql b/test/distributed/cases/dml/insert/insert_duplicate.sql index c1cb13a80e710..0c4e2a2eaffbf 100644 --- a/test/distributed/cases/dml/insert/insert_duplicate.sql +++ b/test/distributed/cases/dml/insert/insert_duplicate.sql @@ -235,11 +235,11 @@ SELECT * FROM `serial_numbers` WHERE `biz_type` = 4 ; SELECT * FROM `serial_numbers` WHERE `biz_type` = 4 and `namespace` = '2024091117'; drop table if exists indup_11; -create table indup_11(a int, b int, c int, primary key(a, b)); -insert into indup_11(a, b) select result, result from generate_series(1, 100000) g; -insert into indup_11 values(1, 1, 1); -insert ignore into indup_11 values(1, 1, 1); -insert into indup_11 values(1, 1, 1) on duplicate key update c = a + b; -select * from indup_11 where c is not null; -insert into indup_11 values(1, 1, 1), (1, 1, 2), (2, 2, 3) on duplicate key update c = c + 10; -select * from indup_11 where c is not null; \ No newline at end of file +create table indup_11(a int primary key, b int); +insert into indup_11(a) select result from generate_series(1, 100000) g; +insert into indup_11 values(1, 1); +insert ignore into indup_11 values(1, 1); +insert into indup_11 values(1, 1) on duplicate key update b = a + 10; +select * from indup_11 where b is not null; +insert into indup_11 values(1, 1), (1, 1), (2, 2) on duplicate key update b = b + 10; +select * from indup_11 where b is not null; \ No newline at end of file From 3e70343a30a7ccc20f6b89dd07c91cefcc9c9021 Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Fri, 29 Nov 2024 12:23:29 +0800 Subject: [PATCH 10/18] fix --- pkg/sql/compile/remoterun_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/sql/compile/remoterun_test.go b/pkg/sql/compile/remoterun_test.go index e033102d5a39a..ad59815b88268 100644 --- a/pkg/sql/compile/remoterun_test.go +++ b/pkg/sql/compile/remoterun_test.go @@ -244,7 +244,9 @@ func Test_convertToPipelineInstruction(t *testing.T) { FullText: &postdml.PostDmlFullTextCtx{}, }, }, - &dedupjoin.DedupJoin{}, + &dedupjoin.DedupJoin{ + Conditions: [][]*plan.Expr{nil, nil}, + }, } ctx := &scopeContext{ id: 1, @@ -320,7 +322,7 @@ func Test_convertToVmInstruction(t *testing.T) { {Op: int32(vm.IndexBuild), IndexBuild: &pipeline.Indexbuild{}}, {Op: int32(vm.Apply), Apply: &pipeline.Apply{}, TableFunction: &pipeline.TableFunction{}}, {Op: int32(vm.PostDml), PostDml: &pipeline.PostDml{}}, - {Op: int32(vm.DedupJoin), PostDml: &pipeline.DedupJoin{}}, + {Op: int32(vm.DedupJoin), DedupJoin: &pipeline.DedupJoin{}}, } for _, instruction := range instructions { _, err := convertToVmOperator(instruction, ctx, nil) From 880b0b3dcf671105a28538d46b52a5d35492219d Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Fri, 29 Nov 2024 18:10:20 +0800 Subject: [PATCH 11/18] don't use off-heap memory --- pkg/sql/colexec/dedupjoin/join.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pkg/sql/colexec/dedupjoin/join.go b/pkg/sql/colexec/dedupjoin/join.go index a32af4abda1fd..14d9e5fb68b19 100644 --- a/pkg/sql/colexec/dedupjoin/join.go +++ b/pkg/sql/colexec/dedupjoin/join.go @@ -199,14 +199,14 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { //ap.ctr.buf = ctr.batches ap.ctr.buf = make([]*batch.Batch, len(ctr.batches)) for i := range ap.ctr.buf { - ap.ctr.buf[i] = batch.NewOffHeapWithSize(len(ap.Result)) + ap.ctr.buf[i] = batch.NewWithSize(len(ap.Result)) batSize := ctr.batches[i].Vecs[0].Length() for j, rp := range ap.Result { if rp.Rel == 1 { ap.ctr.buf[i].SetVector(int32(j), ctr.batches[i].Vecs[rp.Pos]) ctr.batches[i].Vecs[rp.Pos] = nil } else { - ap.ctr.buf[i].Vecs[j] = vector.NewOffHeapVecWithType(ap.LeftTypes[rp.Pos]) + ap.ctr.buf[i].Vecs[j] = vector.NewVec(ap.LeftTypes[rp.Pos]) if err := vector.AppendMultiFixed(ap.ctr.buf[i].Vecs[j], 0, true, batSize, proc.Mp()); err != nil { return err } @@ -242,10 +242,10 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { newSels = sels[i*colexec.DefaultBatchSize:] } - ap.ctr.buf[i] = batch.NewOffHeapWithSize(len(ap.Result)) + ap.ctr.buf[i] = batch.NewWithSize(len(ap.Result)) for j, rp := range ap.Result { if rp.Rel == 1 { - ap.ctr.buf[i].Vecs[j] = vector.NewOffHeapVecWithType(ap.RightTypes[rp.Pos]) + ap.ctr.buf[i].Vecs[j] = vector.NewVec(ap.RightTypes[rp.Pos]) for _, sel := range newSels { idx1, idx2 := sel/colexec.DefaultBatchSize, sel%colexec.DefaultBatchSize if err := ap.ctr.buf[i].Vecs[j].UnionOne(ctr.batches[idx1].Vecs[rp.Pos], int64(idx2), proc.Mp()); err != nil { @@ -253,7 +253,7 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { } } } else { - ap.ctr.buf[i].Vecs[j] = vector.NewOffHeapVecWithType(ap.LeftTypes[rp.Pos]) + ap.ctr.buf[i].Vecs[j] = vector.NewVec(ap.LeftTypes[rp.Pos]) if err := vector.AppendMultiFixed(ap.ctr.buf[i].Vecs[j], 0, true, len(newSels), proc.Mp()); err != nil { return err } @@ -280,10 +280,10 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { // batSize = len(sels) - fillCnt // } // - // ap.ctr.buf[batIdx] = batch.NewOffHeapWithSize(len(ap.Result)) + // ap.ctr.buf[batIdx] = batch.NewWithSize(len(ap.Result)) // for i, rp := range ap.Result { // if rp.Rel == 1 { - // ap.ctr.buf[batIdx].Vecs[i] = vector.NewOffHeapVecWithType(ap.RightTypes[rp.Pos]) + // ap.ctr.buf[batIdx].Vecs[i] = vector.NewVec(ap.RightTypes[rp.Pos]) // for _, sel := range sels[fillCnt : fillCnt+batSize] { // idx1, idx2 := sel/colexec.DefaultBatchSize, sel%colexec.DefaultBatchSize // if err := ap.ctr.buf[batIdx].Vecs[i].UnionOne(ctr.batches[idx1].Vecs[rp.Pos], int64(idx2), proc.Mp()); err != nil { @@ -291,7 +291,7 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { // } // } // } else { - // ap.ctr.buf[batIdx].Vecs[i] = vector.NewOffHeapVecWithType(ap.LeftTypes[rp.Pos]) + // ap.ctr.buf[batIdx].Vecs[i] = vector.NewVec(ap.LeftTypes[rp.Pos]) // if err := vector.AppendMultiFixed(ap.ctr.buf[batIdx].Vecs[i], 0, true, batSize, proc.Mp()); err != nil { // return err // } @@ -316,12 +316,12 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { } if rowIdx == 0 { - ap.ctr.buf[batIdx] = batch.NewOffHeapWithSize(len(ap.Result)) + ap.ctr.buf[batIdx] = batch.NewWithSize(len(ap.Result)) for i, rp := range ap.Result { if rp.Rel == 1 { - ap.ctr.buf[batIdx].Vecs[i] = vector.NewOffHeapVecWithType(ap.RightTypes[rp.Pos]) + ap.ctr.buf[batIdx].Vecs[i] = vector.NewVec(ap.RightTypes[rp.Pos]) } else { - ap.ctr.buf[batIdx].Vecs[i] = vector.NewOffHeapVecWithType(ap.LeftTypes[rp.Pos]) + ap.ctr.buf[batIdx].Vecs[i] = vector.NewVec(ap.LeftTypes[rp.Pos]) } } } @@ -626,13 +626,13 @@ func (dedupJoin *DedupJoin) resetRBat() { if ctr.rbat != nil { ctr.rbat.CleanOnlyData() } else { - ctr.rbat = batch.NewOffHeapWithSize(len(dedupJoin.Result)) + ctr.rbat = batch.NewWithSize(len(dedupJoin.Result)) for i, rp := range dedupJoin.Result { if rp.Rel == 0 { - ctr.rbat.Vecs[i] = vector.NewOffHeapVecWithType(dedupJoin.LeftTypes[rp.Pos]) + ctr.rbat.Vecs[i] = vector.NewVec(dedupJoin.LeftTypes[rp.Pos]) } else { - ctr.rbat.Vecs[i] = vector.NewOffHeapVecWithType(dedupJoin.RightTypes[rp.Pos]) + ctr.rbat.Vecs[i] = vector.NewVec(dedupJoin.RightTypes[rp.Pos]) } } } From d385dbf6a00045bf7d5f2efce6de313271237447 Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Fri, 29 Nov 2024 19:29:36 +0800 Subject: [PATCH 12/18] fix --- pkg/sql/colexec/dedupjoin/join.go | 4 ++ pkg/sql/colexec/dedupjoin/join_test.go | 46 ------------------- .../cases/dml/insert/insert_duplicate.result | 18 ++++---- .../cases/dml/insert/insert_duplicate.sql | 10 ++-- 4 files changed, 19 insertions(+), 59 deletions(-) diff --git a/pkg/sql/colexec/dedupjoin/join.go b/pkg/sql/colexec/dedupjoin/join.go index 14d9e5fb68b19..49f6e54d7e64e 100644 --- a/pkg/sql/colexec/dedupjoin/join.go +++ b/pkg/sql/colexec/dedupjoin/join.go @@ -346,6 +346,10 @@ func (ctr *container) finalize(ap *DedupJoin, proc *process.Process) error { return err } + if ctr.joinBat2 == nil { + ctr.joinBat2, ctr.cfs2 = colexec.NewJoinBatch(ctr.batches[0], proc.Mp()) + } + for _, sel := range sels[1:] { idx1, idx2 = sel/colexec.DefaultBatchSize, sel%colexec.DefaultBatchSize err = colexec.SetJoinBatchValues(ctr.joinBat2, ctr.batches[idx1], int64(idx2), 1, ctr.cfs2) diff --git a/pkg/sql/colexec/dedupjoin/join_test.go b/pkg/sql/colexec/dedupjoin/join_test.go index a43967b250725..2c57de20287fe 100644 --- a/pkg/sql/colexec/dedupjoin/join_test.go +++ b/pkg/sql/colexec/dedupjoin/join_test.go @@ -153,52 +153,6 @@ func TestDedupJoin(t *testing.T) { } } -/* - func BenchmarkJoin(b *testing.B) { - for i := 0; i < b.N; i++ { - tcs = []joinTestCase{ - newTestCase([]bool{false}, []types.Type{types.T_int8.ToType()}, []int32{0}, - [][]*plan.Expr{ - { - newExpr(0, types.T_int8.ToType()), - }, - { - newExpr(0, types.T_int8.ToType()), - }, - }), - newTestCase([]bool{true}, []types.Type{types.T_int8.ToType()}, []int32{0}, - [][]*plan.Expr{ - { - newExpr(0, types.T_int8.ToType()), - }, - { - newExpr(0, types.T_int8.ToType()), - }, - }), - } - t := new(testing.T) - for _, tc := range tcs { - bats := hashBuild(t, tc) - err := tc.arg.Prepare(tc.proc) - require.NoError(t, err) - tc.proc.Reg.MergeReceivers[0].Ch <- testutil.NewRegMsg(newBatch(tc.types, tc.proc, Rows)) - tc.proc.Reg.MergeReceivers[0].Ch <- testutil.NewRegMsg(batch.EmptyBatch) - tc.proc.Reg.MergeReceivers[0].Ch <- testutil.NewRegMsg(newBatch(tc.types, tc.proc, Rows)) - tc.proc.Reg.MergeReceivers[0].Ch <- testutil.NewRegMsg(newBatch(tc.types, tc.proc, Rows)) - tc.proc.Reg.MergeReceivers[0].Ch <- testutil.NewRegMsg(newBatch(tc.types, tc.proc, Rows)) - tc.proc.Reg.MergeReceivers[0].Ch <- nil - tc.proc.Reg.MergeReceivers[1].Ch <- testutil.NewRegMsg(bats[0]) - tc.proc.Reg.MergeReceivers[1].Ch <- testutil.NewRegMsg(bats[1]) - for { - ok, err := tc.arg.Call(tc.proc) - if ok.Status == vm.ExecStop || err != nil { - break - } - } - } - } - } -*/ func newExpr(pos int32, typ types.Type) *plan.Expr { return &plan.Expr{ Typ: plan.Type{ diff --git a/test/distributed/cases/dml/insert/insert_duplicate.result b/test/distributed/cases/dml/insert/insert_duplicate.result index 7383cfe2fbace..85afe8042a90f 100644 --- a/test/distributed/cases/dml/insert/insert_duplicate.result +++ b/test/distributed/cases/dml/insert/insert_duplicate.result @@ -393,15 +393,17 @@ id biz_type namespace sn 100001 4 2024091117 1 drop table if exists indup_11; create table indup_11(a int primary key, b int); -insert into indup_11(a) select result from generate_series(1, 100000) g; +insert into indup_11 values(1, 1), (1, 1), (2, 2) on duplicate key update b = b + 10; +select * from indup_11 where b; +a b +1 11 +2 2 +insert ignore into indup_11(a) select result from generate_series(1, 100000) g; insert into indup_11 values(1, 1); Duplicate entry '1' for key 'a' insert ignore into indup_11 values(1, 1); -insert into indup_11 values(1, 1) on duplicate key update b = a + 10; -select * from indup_11 where b is not null; -a b -1 11 -insert into indup_11 values(1, 1), (1, 1), (2, 2) on duplicate key update b = b + 10; -select * from indup_11 where b is not null; +insert into indup_11 values(1, 1) on duplicate key update b = a + 100; +select * from indup_11 where b is not null order by a; a b -1 31 +1 101 +2 2 diff --git a/test/distributed/cases/dml/insert/insert_duplicate.sql b/test/distributed/cases/dml/insert/insert_duplicate.sql index 0c4e2a2eaffbf..a52b0177d2e1e 100644 --- a/test/distributed/cases/dml/insert/insert_duplicate.sql +++ b/test/distributed/cases/dml/insert/insert_duplicate.sql @@ -236,10 +236,10 @@ SELECT * FROM `serial_numbers` WHERE `biz_type` = 4 and `namespace` = '202409111 drop table if exists indup_11; create table indup_11(a int primary key, b int); -insert into indup_11(a) select result from generate_series(1, 100000) g; +insert into indup_11 values(1, 1), (1, 1), (2, 2) on duplicate key update b = b + 10; +select * from indup_11 where b; +insert ignore into indup_11(a) select result from generate_series(1, 100000) g; insert into indup_11 values(1, 1); insert ignore into indup_11 values(1, 1); -insert into indup_11 values(1, 1) on duplicate key update b = a + 10; -select * from indup_11 where b is not null; -insert into indup_11 values(1, 1), (1, 1), (2, 2) on duplicate key update b = b + 10; -select * from indup_11 where b is not null; \ No newline at end of file +insert into indup_11 values(1, 1) on duplicate key update b = a + 100; +select * from indup_11 where b is not null order by a; From 1d1d62113398d3b06920a3bf0375c861ec843712 Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Tue, 3 Dec 2024 10:32:51 +0800 Subject: [PATCH 13/18] fix a hung --- pkg/sql/colexec/dedupjoin/join.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/sql/colexec/dedupjoin/join.go b/pkg/sql/colexec/dedupjoin/join.go index 49f6e54d7e64e..808e11ba215d1 100644 --- a/pkg/sql/colexec/dedupjoin/join.go +++ b/pkg/sql/colexec/dedupjoin/join.go @@ -484,9 +484,9 @@ func (ctr *container) probe(bat *batch.Batch, ap *DedupJoin, proc *process.Proce } ctr.matched.Add(0) + ctr.rbat.AddRowCount(1) } - ctr.rbat.AddRowCount(1) result.Batch = ctr.rbat ap.ctr.lastPos = 0 From 2d476ebac4c164743c585ab95da8a5bee60ff655 Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Tue, 3 Dec 2024 11:51:34 +0800 Subject: [PATCH 14/18] fix memory reuse --- pkg/sql/colexec/hashmap_util/hashmap_util.go | 28 +++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/pkg/sql/colexec/hashmap_util/hashmap_util.go b/pkg/sql/colexec/hashmap_util/hashmap_util.go index 2537a533fd1f3..252dda42d1ac0 100644 --- a/pkg/sql/colexec/hashmap_util/hashmap_util.go +++ b/pkg/sql/colexec/hashmap_util/hashmap_util.go @@ -190,9 +190,14 @@ func (hb *HashmapBuilder) BuildHashmap(hashOnPK bool, needAllocateSels bool, nee } if hb.IsDedup && hb.InputBatchRowCount == 1 && needUniqueVec { - hb.UniqueJoinKeys = make([]*vector.Vector, len(hb.executor)) + if len(hb.UniqueJoinKeys) == 0 { + hb.UniqueJoinKeys = make([]*vector.Vector, len(hb.executor)) + for j, vec := range hb.vecs[0] { + hb.UniqueJoinKeys[j] = vector.NewVec(*vec.GetType()) + } + } + for i, vec := range hb.vecs[0] { - hb.UniqueJoinKeys[i] = vector.NewVec(*vec.GetType()) err = hb.UniqueJoinKeys[i].UnionOne(vec, 0, proc.Mp()) if err != nil { return err @@ -241,7 +246,7 @@ func (hb *HashmapBuilder) BuildHashmap(hashOnPK bool, needAllocateSels bool, nee var ( cardinality uint64 - sels []int32 + newSels []int64 ) vOld := uint64(0) @@ -349,25 +354,22 @@ func (hb *HashmapBuilder) BuildHashmap(hashOnPK bool, needAllocateSels bool, nee } } } else { - if sels == nil { - sels = make([]int32, hashmap.UnitLimit) + if newSels == nil { + newSels = make([]int64, hashmap.UnitLimit) } - sels = sels[:0] + newSels = newSels[:0] for j, v := range vals[:n] { if v > cardinality { - sels = append(sels, int32(i+j)) + newSels = append(newSels, int64(vecIdx2+j)) cardinality = v } } for j, vec := range hb.vecs[vecIdx1] { - for _, sel := range sels { - _, idx2 := sel/colexec.DefaultBatchSize, sel%colexec.DefaultBatchSize - err = hb.UniqueJoinKeys[j].UnionOne(vec, int64(idx2), proc.Mp()) - if err != nil { - return err - } + err = hb.UniqueJoinKeys[j].Union(vec, newSels, proc.Mp()) + if err != nil { + return err } } } From dd960bb7e230a3bfedbf598c00fa859413dd133b Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Wed, 4 Dec 2024 11:41:29 +0800 Subject: [PATCH 15/18] temp fix --- pkg/sql/compile/scope.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/sql/compile/scope.go b/pkg/sql/compile/scope.go index 02c484666c4e3..4e68a8059ee73 100644 --- a/pkg/sql/compile/scope.go +++ b/pkg/sql/compile/scope.go @@ -567,10 +567,10 @@ func (s *Scope) handleBlockList(c *Compile, runtimeInExprList []*plan.Expr) erro if col == nil { panic("only support col in runtime filter's left child!") } - pkPos := s.DataSource.TableDef.Name2ColIndex[s.DataSource.TableDef.Pkey.PkeyColName] - if pkPos != col.ColPos { - appendNotPkFilter = append(appendNotPkFilter, plan2.DeepCopyExpr(runtimeInExprList[i])) - } + //pkPos := s.DataSource.TableDef.Name2ColIndex[s.DataSource.TableDef.Pkey.PkeyColName] + //if pkPos != col.ColPos { + appendNotPkFilter = append(appendNotPkFilter, plan2.DeepCopyExpr(runtimeInExprList[i])) + //} } // reset filter From 87350b4a22b392d80f29d1696fb3c9f38ea0263e Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Wed, 4 Dec 2024 15:35:04 +0800 Subject: [PATCH 16/18] fix runtime filter bug --- pkg/sql/plan/build_constraint_util.go | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/pkg/sql/plan/build_constraint_util.go b/pkg/sql/plan/build_constraint_util.go index 3906bbb130907..0ff39d1ef36e7 100644 --- a/pkg/sql/plan/build_constraint_util.go +++ b/pkg/sql/plan/build_constraint_util.go @@ -1464,16 +1464,6 @@ func appendPrimaryConstraintPlan( } if needCheck && useFuzzyFilter { - rfTag := builder.genNewMsgTag() - probeExpr := &plan.Expr{ - Typ: pkTyp, - Expr: &plan.Expr_Col{ - Col: &plan.ColRef{ - Name: tableDef.Pkey.PkeyColName, - ColPos: int32(pkPos), - }, - }, - } // sink_scan sinkScanNode := &Node{ NodeType: plan.Node_SINK_SCAN, @@ -1516,6 +1506,17 @@ func appendPrimaryConstraintPlan( scanTableDef.Partition.PartitionExpression = partitionExpr } + rfTag := builder.genNewMsgTag() + probeExpr := &plan.Expr{ + Typ: pkTyp, + Expr: &plan.Expr_Col{ + Col: &plan.ColRef{ + Name: tableDef.Pkey.PkeyColName, + ColPos: int32(len(scanTableDef.Cols) - 1), + }, + }, + } + scanNode := &plan.Node{ NodeType: plan.Node_TABLE_SCAN, Stats: &plan.Stats{}, From 03010fc49af090ab60f6addb53a5087dd99cb1ca Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Wed, 4 Dec 2024 17:14:12 +0800 Subject: [PATCH 17/18] fix sca --- pkg/sql/compile/scope.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/sql/compile/scope.go b/pkg/sql/compile/scope.go index 4e68a8059ee73..fde7e4db6546f 100644 --- a/pkg/sql/compile/scope.go +++ b/pkg/sql/compile/scope.go @@ -560,7 +560,7 @@ func buildScanParallelRun(s *Scope, c *Compile) (*Scope, error) { } func (s *Scope) handleBlockList(c *Compile, runtimeInExprList []*plan.Expr) error { - var appendNotPkFilter []*plan.Expr + appendNotPkFilter := make([]*plan.Expr, 0, len(runtimeInExprList)) for i := range runtimeInExprList { fn := runtimeInExprList[i].GetF() col := fn.Args[0].GetCol() From 4d05087e8a3ae1645f269cea03026e797e3bb915 Mon Sep 17 00:00:00 2001 From: bRong Njam Date: Sun, 8 Dec 2024 04:02:48 +0800 Subject: [PATCH 18/18] delete temp fix --- pkg/sql/compile/scope.go | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/pkg/sql/compile/scope.go b/pkg/sql/compile/scope.go index fde7e4db6546f..b498067ababcd 100644 --- a/pkg/sql/compile/scope.go +++ b/pkg/sql/compile/scope.go @@ -21,24 +21,15 @@ import ( "sync" "time" - "github.com/matrixorigin/matrixone/pkg/logutil" - - "github.com/matrixorigin/matrixone/pkg/sql/colexec/group" - - "github.com/matrixorigin/matrixone/pkg/sql/colexec/mergegroup" - - "github.com/matrixorigin/matrixone/pkg/fileservice" - "github.com/matrixorigin/matrixone/pkg/objectio" - - "github.com/panjf2000/ants/v2" - "go.uber.org/zap" - "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/cnservice/cnclient" "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/common/reuse" "github.com/matrixorigin/matrixone/pkg/common/runtime" "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/fileservice" + "github.com/matrixorigin/matrixone/pkg/logutil" + "github.com/matrixorigin/matrixone/pkg/objectio" pbpipeline "github.com/matrixorigin/matrixone/pkg/pb/pipeline" "github.com/matrixorigin/matrixone/pkg/pb/plan" "github.com/matrixorigin/matrixone/pkg/pb/timestamp" @@ -46,6 +37,8 @@ import ( "github.com/matrixorigin/matrixone/pkg/sql/colexec" "github.com/matrixorigin/matrixone/pkg/sql/colexec/dispatch" "github.com/matrixorigin/matrixone/pkg/sql/colexec/filter" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/group" + "github.com/matrixorigin/matrixone/pkg/sql/colexec/mergegroup" "github.com/matrixorigin/matrixone/pkg/sql/colexec/output" "github.com/matrixorigin/matrixone/pkg/sql/colexec/table_scan" plan2 "github.com/matrixorigin/matrixone/pkg/sql/plan" @@ -57,6 +50,8 @@ import ( "github.com/matrixorigin/matrixone/pkg/vm/message" "github.com/matrixorigin/matrixone/pkg/vm/pipeline" "github.com/matrixorigin/matrixone/pkg/vm/process" + "github.com/panjf2000/ants/v2" + "go.uber.org/zap" ) func newScope(magic magicType) *Scope { @@ -560,17 +555,17 @@ func buildScanParallelRun(s *Scope, c *Compile) (*Scope, error) { } func (s *Scope) handleBlockList(c *Compile, runtimeInExprList []*plan.Expr) error { - appendNotPkFilter := make([]*plan.Expr, 0, len(runtimeInExprList)) + var appendNotPkFilter []*plan.Expr for i := range runtimeInExprList { fn := runtimeInExprList[i].GetF() col := fn.Args[0].GetCol() if col == nil { panic("only support col in runtime filter's left child!") } - //pkPos := s.DataSource.TableDef.Name2ColIndex[s.DataSource.TableDef.Pkey.PkeyColName] - //if pkPos != col.ColPos { - appendNotPkFilter = append(appendNotPkFilter, plan2.DeepCopyExpr(runtimeInExprList[i])) - //} + pkPos := s.DataSource.TableDef.Name2ColIndex[s.DataSource.TableDef.Pkey.PkeyColName] + if pkPos != col.ColPos { + appendNotPkFilter = append(appendNotPkFilter, plan2.DeepCopyExpr(runtimeInExprList[i])) + } } // reset filter