diff --git a/pkg/frontend/txn.go b/pkg/frontend/txn.go index 5c8c339a40d6f..c4bf497640958 100644 --- a/pkg/frontend/txn.go +++ b/pkg/frontend/txn.go @@ -18,6 +18,7 @@ import ( "context" "errors" "sync" + "time" "github.com/google/uuid" "go.uber.org/zap" @@ -432,6 +433,15 @@ func (th *TxnHandler) createTxnOpUnsafe(execCtx *ExecCtx) error { } } + // Attach session-level lock_wait_timeout to the txn so the lock service + // uses it instead of the global config. + if varVal, err := execCtx.ses.GetSessionSysVar("lock_wait_timeout"); err == nil { + if seconds, ok := varVal.(int64); ok && seconds > 0 { + opts = append(opts, + txnclient.WithTxnLockWaitTimeout(time.Duration(seconds)*time.Second)) + } + } + tempCtx, tempCancel := context.WithTimeoutCause(th.txnCtx, pu.SV.CreateTxnOpTimeout.Duration, moerr.CauseCreateTxnOpUnsafe) defer tempCancel() diff --git a/pkg/lockservice/lock_table_local.go b/pkg/lockservice/lock_table_local.go index f51cf3a4befff..5ee1cd506677d 100644 --- a/pkg/lockservice/lock_table_local.go +++ b/pkg/lockservice/lock_table_local.go @@ -17,6 +17,7 @@ package lockservice import ( "bytes" "context" + "errors" "fmt" "sync" "time" @@ -102,6 +103,9 @@ func (l *localLockTable) doLock( var oldOffset int var err error table := l.bind.Table + // Session-level SET lock_wait_timeout takes highest priority (passed via + // pb.LockOptions). The budget only counts time actually spent waiting. + leftTimeout := time.Duration(c.opts.LockWaitTimeout) * time.Second for { // blocked used for async callback, waiter is created, and added to wait list. // So only need wait notify. @@ -163,12 +167,40 @@ func (l *localLockTable) doLock( l.options.beforeWait(c)() } - v := c.w.wait(c.ctx, l.logger) + waitCtx := c.ctx + var cancel context.CancelFunc + if leftTimeout > 0 { + waitCtx, cancel = context.WithTimeoutCause(c.ctx, leftTimeout, ErrLockTimeout) + } + waitStart := time.Now() + v := c.w.wait(waitCtx, l.logger) + lockWaitTimeoutHit := leftTimeout > 0 && + errors.Is(v.err, context.DeadlineExceeded) && + context.Cause(waitCtx) == ErrLockTimeout + if cancel != nil { + cancel() + } if l.options.afterWait != nil { l.options.afterWait(c)() } + // Update the remaining lock_wait_timeout budget using only wait time. + if leftTimeout > 0 { + waited := time.Since(waitStart) + if waited < leftTimeout { + leftTimeout -= waited + } else { + leftTimeout = 0 + } + if lockWaitTimeoutHit { + // lock_wait_timeout expired: return ErrLockTimeout directly + // (not errors.Join) so upper layers can recognize it via + // moerr.IsMoErrCode(err, moerr.ErrInvalidState). + v.err = ErrLockTimeout + } + } + c.txn.Lock() logLocalLockWaitOnResult(l.logger, c.txn, table, c.rows[c.idx], c.opts, c.w, v) @@ -534,6 +566,9 @@ func (l *localLockTable) handleLockConflictLocked( if c.opts.Policy == pb.WaitPolicy_FastFail { return ErrLockConflict } + if c.opts.async && !c.lockWaitDeadline.IsZero() && !time.Now().Before(c.lockWaitDeadline) { + return ErrLockTimeout + } if c.opts.Granularity == pb.Granularity_Range { l.closeRangeLastWaiterLocked(c) diff --git a/pkg/lockservice/lock_table_remote.go b/pkg/lockservice/lock_table_remote.go index 7a4d657474dec..56f97a2297271 100644 --- a/pkg/lockservice/lock_table_remote.go +++ b/pkg/lockservice/lock_table_remote.go @@ -38,6 +38,17 @@ var ( remoteRetryMaxBackoff = 5 * time.Second ) +const ( + // lockRpcSlack is the extra budget added to the RPC deadline beyond + // LockWaitTimeout. The lock-table owner starts its own wait budget only + // after receiving the RPC, so the client-side RPC deadline must outlive the + // server-side wait timer for the owner to observe and return ErrLockTimeout. + // Without this slack, the client deadline can fire before the owner returns + // ErrLockTimeout, causing the client to see a retryable connectivity error + // instead of a lock-timeout result. + lockRpcSlack = 30 * time.Second +) + // remoteLockTable the lock corresponding to the Table is managed by a remote LockTable. // And the remoteLockTable acts as a proxy for this LockTable locally. type remoteLockTable struct { @@ -97,7 +108,26 @@ func (l *remoteLockTable) lock( // rpc maybe wait too long, to avoid deadlock, we need unlock txn, and lock again // after rpc completed txn.Unlock() - resp, err := l.client.Send(ctx, req) + + // When session-level lock_wait_timeout is set, bound the RPC by that + // timeout plus slack so the lock-table owner has enough time to observe + // and return ErrLockTimeout before the client-side RPC deadline fires. + // Without a session timeout, use the caller context as-is. + var rpcCtx context.Context + var rpcCancel context.CancelFunc + if d := time.Duration(opts.LockWaitTimeout) * time.Second; d > 0 { + lockRpcTimeout := d + lockRpcSlack + rpcCtx, rpcCancel = context.WithTimeout(ctx, lockRpcTimeout) + } else { + rpcCtx = ctx + } + defer func() { + if rpcCancel != nil { + rpcCancel() + } + }() + resp, err := l.client.Send(rpcCtx, req) + txn.Lock() // txn closed @@ -455,7 +485,8 @@ func skipTrackLockOnError(ctx context.Context, err error) bool { } func retryRemoteLockError(err error) bool { - if e, ok := err.(net.Error); ok && e.Timeout() { + var netErr net.Error + if errors.As(err, &netErr) && netErr.Timeout() { return true } if errors.Is(err, io.EOF) || diff --git a/pkg/lockservice/service_remote_test.go b/pkg/lockservice/service_remote_test.go index 70f26fc3b9fa1..caa0e20ee5b82 100644 --- a/pkg/lockservice/service_remote_test.go +++ b/pkg/lockservice/service_remote_test.go @@ -780,3 +780,114 @@ func checkBind( l := s.tableGroups.get(0, bind.Table) assert.Equal(t, bind, l.getBind()) } + +// TestRemoteLockWaitTimeout_PrecisionIndependentOfLazyCheck verifies that +// the async lock_wait_timeout fires at the waiter's own deadline, NOT on +// the coarse defaultLazyCheckDuration tick. It temporarily sets the +// global lazy-check interval to 10s, so without the precise AfterFunc +// timer the test would timeout or take >10s. +func TestRemoteLockWaitTimeout_PrecisionIndependentOfLazyCheck(t *testing.T) { + // Force the lazy-check interval to 10s so any enforcement that relies + // only on the periodic check() tick would take ≥10s. + orig := defaultLazyCheckDuration.Load().(time.Duration) + defaultLazyCheckDuration.Store(10 * time.Second) + defer defaultLazyCheckDuration.Store(orig) + + runLockServiceTests( + t, + []string{"s1", "s2"}, + func(alloc *lockTableAllocator, s []*service) { + tableID := uint64(10) + l1 := s[0] // lock-table owner + l2 := s[1] // remote CN + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + txn1 := []byte("txn1") + txn2 := []byte("txn2") + row1 := []byte{1} + + // txn1 holds the lock. + mustAddTestLock(t, ctx, l1, tableID, txn1, [][]byte{row1}, pb.Granularity_Row) + + // txn2 on remote CN requests with 1-second timeout. + // With the check tick at 10s, a coarse-tick-only approach + // would need >10s. The precise AfterFunc timer must fire at ~1s. + start := time.Now() + _, err := l2.Lock( + ctx, tableID, [][]byte{row1}, txn2, + pb.LockOptions{ + Granularity: pb.Granularity_Row, + Mode: pb.LockMode_Exclusive, + Policy: pb.WaitPolicy_Wait, + LockWaitTimeout: 1, + }) + elapsed := time.Since(start) + + require.Error(t, err) + require.True(t, moerr.IsMoErrCode(err, moerr.ErrInvalidState), + "expected lock-timeout, got %v", err) + // Must fire well before the 10s coarse tick. + require.Less(t, elapsed, 3*time.Second, + "precise timer should fire at ~1s, elapsed=%v", elapsed) + }, + ) +} + +// TestRemoteLockWaitTimeout_ReturnsLockTimeout ensures that in a multi-CN +// deployment, when txn2 on a remote CN waits on a lock held by txn1 on the +// lock-table owner CN, txn2 receives ErrLockTimeout (lock timeout) after +// LockWaitTimeout elapses, NOT a retryable connectivity/backend error. +// +// Before the fix, the client-side RPC deadline was set to exactly +// LockWaitTimeout. The lock-table owner started its own wait budget only +// after receiving the RPC, so the client deadline could fire before the +// owner returned ErrLockTimeout. When that happened the client saw a +// retryable error instead of lock-timeout. +func TestRemoteLockWaitTimeout_ReturnsLockTimeout(t *testing.T) { + runLockServiceTests( + t, + []string{"s1", "s2"}, + func(alloc *lockTableAllocator, s []*service) { + tableID := uint64(10) + l1 := s[0] // lock-table owner + l2 := s[1] // remote CN + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + + txn1 := []byte("txn1") + txn2 := []byte("txn2") + row1 := []byte{1} + + // txn1 acquires and holds the lock on the owner. + mustAddTestLock(t, ctx, l1, tableID, txn1, [][]byte{row1}, pb.Granularity_Row) + + // txn2 on the remote CN tries to lock the same row with a 1-second + // LockWaitTimeout. + opt := pb.LockOptions{ + Granularity: pb.Granularity_Row, + Mode: pb.LockMode_Exclusive, + Policy: pb.WaitPolicy_Wait, + LockWaitTimeout: 1, // 1 second + } + + start := time.Now() + _, err := l2.Lock(ctx, tableID, [][]byte{row1}, txn2, opt) + elapsed := time.Since(start) + + require.Error(t, err) + // Must receive lock-timeout, not connectivity/backend error. + require.True(t, moerr.IsMoErrCode(err, moerr.ErrInvalidState), + "expected ErrLockTimeout (InvalidState), got %v", err) + require.Contains(t, err.Error(), "lock timeout", + "expected lock timeout message, got %v", err) + require.GreaterOrEqual(t, elapsed, time.Second, + "should have waited at least LockWaitTimeout") + // With the lazy check interval at 50ms in tests, the async timeout + // should be detected very close to LockWaitTimeout. Allow a + // generous upper bound to absorb scheduling jitter. + require.Less(t, elapsed, 5*time.Second, + "should not wait beyond LockWaitTimeout + check interval") + }, + ) +} diff --git a/pkg/lockservice/service_test.go b/pkg/lockservice/service_test.go index 7130a5fd44b5d..9913b0ccfe07f 100644 --- a/pkg/lockservice/service_test.go +++ b/pkg/lockservice/service_test.go @@ -4485,6 +4485,162 @@ func TestHandleBindChangedConcurrently(t *testing.T) { ) } +func TestLockWaitTimeout(t *testing.T) { + runLockServiceTests( + t, + []string{"s1"}, + func(alloc *lockTableAllocator, s []*service) { + l := s[0] + + option := pb.LockOptions{ + Granularity: pb.Granularity_Row, + Mode: pb.LockMode_Exclusive, + Policy: pb.WaitPolicy_Wait, + } + + // Use a long-lived context so it doesn't interfere with LockWaitTimeout. + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + // txn1 acquires and holds the lock. + _, err := l.Lock(ctx, 0, [][]byte{{1}}, []byte("txn1"), option) + require.NoError(t, err) + + // txn2 tries to lock the same row with a 1-second LockWaitTimeout. + option2 := option + option2.LockWaitTimeout = 1 // 1 second + + start := time.Now() + _, err = l.Lock(ctx, 0, [][]byte{{1}}, []byte("txn2"), option2) + elapsed := time.Since(start) + + // Should time out after ~1 second, not immediately and not indefinitely. + require.Error(t, err) + require.True(t, moerr.IsMoErrCode(err, moerr.ErrInvalidState), + "expected lock-timeout error (ErrInvalidState), got %v", err) + require.Contains(t, err.Error(), "lock timeout") + require.GreaterOrEqual(t, elapsed, time.Second) + require.Less(t, elapsed, 3*time.Second) + }, + ) +} + +func TestLockWaitTimeoutDefaultNoTimeout(t *testing.T) { + runLockServiceTests( + t, + []string{"s1"}, + func(alloc *lockTableAllocator, s []*service) { + l := s[0] + + option := pb.LockOptions{ + Granularity: pb.Granularity_Row, + Mode: pb.LockMode_Exclusive, + Policy: pb.WaitPolicy_Wait, + } + + // Short context to bound the test. + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + + // txn1 holds the lock. + _, err := l.Lock(ctx, 0, [][]byte{{1}}, []byte("txn1"), option) + require.NoError(t, err) + + // txn2 tries to lock the same row WITHOUT LockWaitTimeout. + // Should be blocked until ctx expires (no internal/default timeout interception). + option2 := option + option2.LockWaitTimeout = 0 // no session/internal timeout; rely on caller context deadline + start := time.Now() + _, err = l.Lock(ctx, 0, [][]byte{{1}}, []byte("txn2"), option2) + elapsed := time.Since(start) + + // Should have waited for the context timeout (~2s), not failed immediately. + require.Error(t, err) + require.GreaterOrEqual(t, elapsed, time.Second) + }, + ) +} + +func TestLockWaitTimeoutSucceedsWhenHolderReleases(t *testing.T) { + runLockServiceTests( + t, + []string{"s1"}, + func(alloc *lockTableAllocator, s []*service) { + l := s[0] + + option := pb.LockOptions{ + Granularity: pb.Granularity_Row, + Mode: pb.LockMode_Exclusive, + Policy: pb.WaitPolicy_Wait, + } + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + // txn1 holds the lock briefly then releases. + _, err := l.Lock(ctx, 0, [][]byte{{1}}, []byte("txn1"), option) + require.NoError(t, err) + + option2 := option + option2.LockWaitTimeout = 3 // 3 seconds, more than enough + + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + time.Sleep(200 * time.Millisecond) + require.NoError(t, l.Unlock(ctx, []byte("txn1"), timestamp.Timestamp{})) + }() + + start := time.Now() + _, err = l.Lock(ctx, 0, [][]byte{{1}}, []byte("txn2"), option2) + elapsed := time.Since(start) + + wg.Wait() + require.NoError(t, err) + require.GreaterOrEqual(t, elapsed, 200*time.Millisecond) + require.Less(t, elapsed, 2*time.Second) // well within LockWaitTimeout + }, + ) +} + +func TestLockWaitTimeoutZeroMeansFallbackToContext(t *testing.T) { + runLockServiceTests( + t, + []string{"s1"}, + func(alloc *lockTableAllocator, s []*service) { + l := s[0] + + option := pb.LockOptions{ + Granularity: pb.Granularity_Row, + Mode: pb.LockMode_Exclusive, + Policy: pb.WaitPolicy_Wait, + } + + // Short context to trigger fast timeout. + ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) + defer cancel() + + // txn1 holds the lock. + _, err := l.Lock(ctx, 0, [][]byte{{1}}, []byte("txn1"), option) + require.NoError(t, err) + + // txn2 with LockWaitTimeout=0 should wait for context expiry (500ms), + // NOT the default 5-minute configLockWaitTimeout. + option2 := option + option2.LockWaitTimeout = 0 + start := time.Now() + _, err = l.Lock(ctx, 0, [][]byte{{1}}, []byte("txn2"), option2) + elapsed := time.Since(start) + + require.Error(t, err) + // Should have completed near the context deadline, not after 5 minutes. + require.GreaterOrEqual(t, elapsed, 300*time.Millisecond) + require.Less(t, elapsed, 2*time.Second) + }, + ) +} + func BenchmarkWithoutConflict(b *testing.B) { runBenchmark(b, "1-table", 1) runBenchmark(b, "unlimited-table", 32) diff --git a/pkg/lockservice/types.go b/pkg/lockservice/types.go index a4e43ac49b2d7..b91cd0b9bb26e 100644 --- a/pkg/lockservice/types.go +++ b/pkg/lockservice/types.go @@ -42,6 +42,8 @@ var ( ErrLockTableNotFound = moerr.NewLockTableNotFoundNoCtx() // ErrLockConflict lock option conflict ErrLockConflict = moerr.NewLockConflictNoCtx() + // ErrLockTimeout lock table timeout + ErrLockTimeout = moerr.NewInvalidStateNoCtx("lock timeout") ) // Option lockservice option diff --git a/pkg/lockservice/waiter.go b/pkg/lockservice/waiter.go index 615d3eecfc8e1..93b800bffeda9 100644 --- a/pkg/lockservice/waiter.go +++ b/pkg/lockservice/waiter.go @@ -78,7 +78,7 @@ func newWaiter() *waiter { return w } -func (w waiter) TypeName() string { +func (w *waiter) TypeName() string { return "lockservice.wait" } @@ -97,6 +97,14 @@ type waiter struct { waitAt atomic.Value enableChecker bool + // lockWaitTimeout is the session-level SET lock_wait_timeout value. + // A zero value means no session-level timeout is enforced here; in that + // case waiting relies on the context or other external cancellation. + // Set in waiterEvents.add() from the lockContext and checked in + // waiterEvents.check() to enforce timeouts on the async (remote) lock path. + lockWaitTimeout time.Duration + lockWaitTimer atomic.Pointer[time.Timer] + // just used for testing beforeSwapStatusAdjustFunc func() } @@ -130,6 +138,7 @@ func (w *waiter) close( info string, logger *log.MOLogger, ) { + w.stopLockWaitTimer() if w.enableChecker { logCloseWaiter(logger, info, w.txn.TxnID, w) } @@ -272,6 +281,7 @@ func (w *waiter) notify( // if status changed, notify and timeout are concurrently issued, need // retry. if w.casStatus(status, notified, logger) { + w.stopLockWaitTimer() w.mustSendNotification(value, logger) return true } @@ -283,6 +293,12 @@ func (w *waiter) startWait() { w.waitAt.Store(time.Now()) } +func (w *waiter) stopLockWaitTimer() { + if timer := w.lockWaitTimer.Swap(nil); timer != nil { + timer.Stop() + } +} + func (w *waiter) reset() { notifies := len(w.c) if notifies > 0 { @@ -297,6 +313,8 @@ func (w *waiter) reset() { w.conflictKey.Store(nil) w.lt.Store(nil) w.setStatus(ready) + w.lockWaitTimeout = 0 + w.stopLockWaitTimer() } type notifyValue struct { diff --git a/pkg/lockservice/waiter_events.go b/pkg/lockservice/waiter_events.go index 3a26614e4ef29..3bc009460a3a2 100644 --- a/pkg/lockservice/waiter_events.go +++ b/pkg/lockservice/waiter_events.go @@ -54,6 +54,7 @@ type lockContext struct { createAt time.Time closed bool rangeLastWaitKey []byte + lockWaitDeadline time.Time } func (l *localLockTable) newLockContext( @@ -72,6 +73,9 @@ func (l *localLockTable) newLockContext( c.cb = cb c.result = pb.Result{LockedOn: bind} c.createAt = time.Now() + if opts.async && opts.LockWaitTimeout > 0 { + c.lockWaitDeadline = c.createAt.Add(time.Duration(opts.LockWaitTimeout) * time.Second) + } return c } @@ -95,6 +99,13 @@ func (c *lockContext) doLock() { c.lockFunc(c, true) } +func (c *lockContext) getLockWaitTimeout() time.Duration { + if c.lockWaitDeadline.IsZero() { + return time.Duration(c.opts.LockWaitTimeout) * time.Second + } + return time.Until(c.lockWaitDeadline) +} + type event struct { c *lockContext eventC chan *lockContext @@ -119,6 +130,13 @@ type waiterEvents struct { unlock func(ctx context.Context, txnID []byte, commitTS timestamp.Timestamp, mutations ...pb.ExtraMutation) error stopper *stopper.Stopper + // checkC wakes the handle loop to run check() at a waiter's + // lockWaitTimeout boundary. checkPending coalesces concurrent timer + // callbacks so at least one prompt check runs without queueing one + // signal per waiter. + checkC chan struct{} + checkPending atomic.Bool + mu struct { sync.RWMutex blockedWaiters []*waiter @@ -142,6 +160,7 @@ func newWaiterEvents( unlock: unlock, eventC: make(chan *lockContext, 10000), checkOrphanC: make(chan checkOrphan, 64), + checkC: make(chan struct{}, 1), stopper: stopper.NewStopper("waiter-events", stopper.WithLogger(logger.RawLogger())), } } @@ -171,8 +190,27 @@ func (mw *waiterEvents) add(c *lockContext) { c: c, } } + // The sync path enforces LockWaitTimeout via context.WithTimeoutCause in + // doLock. waiterEvents owns timeout notifications only for async waits. + c.w.lockWaitTimeout = 0 + if c.opts.async { + // Propagate the remaining session-level lock_wait_timeout to the waiter + // so the check loop enforces one budget across async re-queue cycles. + c.w.lockWaitTimeout = c.getLockWaitTimeout() + if c.w.lockWaitTimeout <= 0 && !c.lockWaitDeadline.IsZero() { + c.w.lockWaitTimeout = time.Nanosecond + } + } c.w.startWait() mw.addToLazyCheckDeadlockC(c.w) + + // Schedule a precise timer for every positive timeout so async lock waits + // do not overshoot the configured deadline by a lazy-check interval. + c.w.stopLockWaitTimer() + if c.w.lockWaitTimeout > 0 { + d := c.w.lockWaitTimeout + c.w.lockWaitTimer.Store(time.AfterFunc(d, mw.wakeCheck)) + } } func (mw *waiterEvents) addToLazyCheckDeadlockC(w *waiter) { @@ -182,6 +220,18 @@ func (mw *waiterEvents) addToLazyCheckDeadlockC(w *waiter) { mw.mu.blockedWaiters = append(mw.mu.blockedWaiters, w) } +func (mw *waiterEvents) wakeCheck() { + if !mw.checkPending.CompareAndSwap(false, true) { + return + } + select { + case mw.checkC <- struct{}{}: + default: + // A wake-up is already queued; keep checkPending set so later timers + // coalesce until the handle loop consumes the signal and runs check(). + } +} + func (mw *waiterEvents) handle(ctx context.Context) { timeout := defaultLazyCheckDuration.Load().(time.Duration) timer := time.NewTimer(timeout) @@ -198,6 +248,12 @@ func (mw *waiterEvents) handle(ctx context.Context) { txn.Unlock() case v := <-mw.checkOrphanC: mw.checkOrphan(v) + case <-mw.checkC: + mw.checkPending.Store(false) + // Precise timer fired for at least one waiter's lockWaitTimeout. + // Run check() immediately instead of waiting for the + // next coarse lazy-check tick. + mw.check(timeout) case <-timer.C: mw.check(timeout) timer.Reset(timeout) @@ -224,6 +280,21 @@ func (mw *waiterEvents) check(timeout time.Duration) { wait := now.Sub(w.waitAt.Load().(time.Time)) mw.addToOrphanCheck(w, wait) + + // enforce session-level lock_wait_timeout on the async (remote) path. + // The sync path enforces this via context.WithTimeoutCause in doLock; + // this gives the async path equivalent timeout enforcement. + if w.lockWaitTimeout > 0 && wait >= w.lockWaitTimeout { + mw.logger.Debug("lock wait timeout elapsed, notifying waiter", + zap.String("txn", w.String()), + zap.Duration("wait", wait), + zap.Duration("timeout", w.lockWaitTimeout)) + w.notify(notifyValue{err: ErrLockTimeout}, mw.logger) + w.close("waiterEvents check timeout", mw.logger) + mw.mu.blockedWaiters[i] = nil + continue + } + if wait >= timeout { mw.addToDeadlockCheck(w) } diff --git a/pkg/pb/lock/lock.go b/pkg/pb/lock/lock.go index ec5bbc01383da..12e35c0551f20 100644 --- a/pkg/pb/lock/lock.go +++ b/pkg/pb/lock/lock.go @@ -136,6 +136,13 @@ func (m LockOptions) WithWaitPolicy(policy WaitPolicy) LockOptions { return m } +// WithLockWaitTimeout sets the lock wait timeout in seconds. 0 disables +// lock-wait-timeout enforcement and relies on the caller context instead. +func (m LockOptions) WithLockWaitTimeout(seconds int64) LockOptions { + m.LockWaitTimeout = seconds + return m +} + // WrapError wrapper error to TxnError func (m *Response) WrapError(err error) { me := moerr.ConvertGoError(context.TODO(), err).(*moerr.Error) diff --git a/pkg/pb/lock/lock.pb.go b/pkg/pb/lock/lock.pb.go index f28dbf10d3cec..6e29fe36ff625 100644 --- a/pkg/pb/lock/lock.pb.go +++ b/pkg/pb/lock/lock.pb.go @@ -268,6 +268,8 @@ type LockOptions struct { Group uint32 `protobuf:"varint,7,opt,name=Group,proto3" json:"Group,omitempty"` Sharding Sharding `protobuf:"varint,8,opt,name=Sharding,proto3,enum=lock.Sharding" json:"Sharding,omitempty"` SnapShotTs timestamp.Timestamp `protobuf:"bytes,9,opt,name=SnapShotTs,proto3" json:"SnapShotTs"` + LockWaitTimeout int64 `protobuf:"varint,10,opt,name=LockWaitTimeout,proto3" json:"LockWaitTimeout,omitempty"` + LockWaitDeadline int64 `protobuf:"varint,11,opt,name=LockWaitDeadline,proto3" json:"LockWaitDeadline,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -369,6 +371,20 @@ func (m *LockOptions) GetSnapShotTs() timestamp.Timestamp { return timestamp.Timestamp{} } +func (m *LockOptions) GetLockWaitTimeout() int64 { + if m != nil { + return m.LockWaitTimeout + } + return 0 +} + +func (m *LockOptions) GetLockWaitDeadline() int64 { + if m != nil { + return m.LockWaitDeadline + } + return 0 +} + // LockTable describes which CN manages a Table's Locks. type LockTable struct { // Table table id @@ -3007,144 +3023,146 @@ func init() { func init() { proto.RegisterFile("lock.proto", fileDescriptor_164ad2988c7acaf1) } var fileDescriptor_164ad2988c7acaf1 = []byte{ - // 2182 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x59, 0xdb, 0x72, 0xdb, 0xc8, - 0xd1, 0x16, 0x48, 0x8a, 0x87, 0x26, 0x29, 0x41, 0xa3, 0x83, 0x21, 0xfd, 0xbb, 0x32, 0x7f, 0x44, - 0x5b, 0xc5, 0x95, 0xb3, 0x56, 0x2c, 0xc7, 0xbb, 0x1b, 0x6f, 0xe2, 0x8a, 0x4c, 0x59, 0xb2, 0xd6, - 0x96, 0xb5, 0x19, 0xd2, 0x4e, 0x55, 0xee, 0x20, 0x72, 0x2c, 0xa1, 0x44, 0x01, 0x0c, 0x38, 0x94, - 0xa8, 0x07, 0x48, 0x55, 0x9e, 0x20, 0xd7, 0xb9, 0xcc, 0x4d, 0xde, 0x63, 0x2f, 0xb7, 0x6a, 0xef, - 0x53, 0x89, 0xf3, 0x04, 0x49, 0xe5, 0x01, 0x52, 0x73, 0x00, 0x30, 0x83, 0x03, 0xb9, 0x9b, 0x3b, - 0x4c, 0x77, 0xcf, 0xd7, 0x33, 0x8d, 0xc6, 0x37, 0xdd, 0x03, 0x80, 0xa1, 0xdf, 0xbf, 0x7a, 0x38, - 0x0a, 0x7c, 0xea, 0xa3, 0x12, 0x7b, 0xde, 0xfa, 0xec, 0xc2, 0xa5, 0x97, 0x93, 0xf3, 0x87, 0x7d, - 0xff, 0x7a, 0xef, 0xc2, 0xbf, 0xf0, 0xf7, 0xb8, 0xf2, 0x7c, 0xf2, 0x9e, 0x8f, 0xf8, 0x80, 0x3f, - 0x89, 0x49, 0x5b, 0xcb, 0xd4, 0xbd, 0x26, 0x63, 0xea, 0x5c, 0x8f, 0x84, 0xc0, 0xfe, 0x4f, 0x01, - 0xea, 0xaf, 0xfd, 0xfe, 0xd5, 0xd9, 0x88, 0xba, 0xbe, 0x37, 0x46, 0x8f, 0xa1, 0x7e, 0x1c, 0x38, - 0xde, 0x64, 0xe8, 0x04, 0x2e, 0xbd, 0xb3, 0x8c, 0x96, 0xd1, 0x5e, 0xda, 0x5f, 0x79, 0xc8, 0xfd, - 0x2a, 0x0a, 0xac, 0x5a, 0x21, 0x1b, 0x4a, 0xa7, 0xfe, 0x80, 0x58, 0x05, 0x6e, 0xbd, 0x24, 0xac, - 0x19, 0x2a, 0x93, 0x62, 0xae, 0x43, 0x6d, 0x28, 0x7f, 0xe3, 0x0f, 0xdd, 0xfe, 0x9d, 0x55, 0xe4, - 0x56, 0xa6, 0xb0, 0xfa, 0xad, 0xe3, 0x52, 0x21, 0xc7, 0x52, 0x8f, 0x3e, 0x82, 0xda, 0x91, 0x1f, - 0xdc, 0x3a, 0xc1, 0xa0, 0xe7, 0x5b, 0xa5, 0x96, 0xd1, 0xae, 0xe1, 0x58, 0x80, 0xda, 0xb0, 0xdc, - 0x73, 0xce, 0x87, 0xe4, 0x90, 0xbc, 0xef, 0x5c, 0x3a, 0xde, 0x05, 0x19, 0x58, 0x8b, 0x2d, 0xa3, - 0x5d, 0xc5, 0x49, 0x31, 0xc3, 0xc1, 0x84, 0x06, 0x77, 0xcc, 0x85, 0x55, 0x6e, 0x19, 0xed, 0x22, - 0x8e, 0x05, 0x68, 0x0d, 0x16, 0x8f, 0x03, 0x7f, 0x32, 0xb2, 0x2a, 0x2d, 0xa3, 0xdd, 0xc4, 0x62, - 0x80, 0x76, 0xa1, 0xda, 0xbd, 0x74, 0x82, 0x81, 0xeb, 0x5d, 0x58, 0x55, 0x75, 0x37, 0xa1, 0x14, - 0x47, 0x7a, 0xf4, 0x14, 0xa0, 0xeb, 0x39, 0xa3, 0xee, 0xa5, 0x4f, 0x7b, 0x63, 0xab, 0xd6, 0x32, - 0xda, 0xf5, 0xfd, 0xb5, 0x87, 0x71, 0x80, 0x7b, 0xe1, 0xd3, 0xf3, 0xd2, 0xb7, 0x7f, 0xbb, 0xbf, - 0x80, 0x15, 0x6b, 0xfb, 0x7b, 0x03, 0x6a, 0x2c, 0x40, 0x7c, 0xcd, 0x6c, 0x2d, 0xfc, 0x81, 0x87, - 0xbb, 0x84, 0xc5, 0x80, 0xad, 0xbf, 0x4b, 0x82, 0x1b, 0xb7, 0x4f, 0x4e, 0x0e, 0x79, 0x68, 0x6b, - 0x38, 0x16, 0x20, 0x0b, 0x2a, 0xef, 0x48, 0x30, 0x76, 0x7d, 0x8f, 0x07, 0xb4, 0x84, 0xc3, 0x21, - 0x43, 0x7b, 0xe7, 0x0c, 0xdd, 0x01, 0x8f, 0x5d, 0x15, 0x8b, 0x41, 0xbc, 0xdf, 0xc5, 0xbc, 0xfd, - 0x96, 0xe7, 0xec, 0xb7, 0x05, 0xf5, 0xb3, 0xc0, 0xbd, 0x70, 0x3d, 0xb1, 0xd6, 0x0a, 0xf7, 0xaa, - 0x8a, 0xec, 0xef, 0x01, 0x2a, 0x98, 0xfc, 0x7e, 0x42, 0xc6, 0x54, 0x44, 0x9f, 0x3f, 0x9e, 0x1c, - 0xca, 0x7d, 0xc5, 0x02, 0xf4, 0x58, 0xd9, 0x3e, 0xdf, 0x5b, 0x7d, 0x7f, 0x39, 0x4e, 0x1b, 0x2e, - 0x96, 0x51, 0x53, 0xc2, 0xb4, 0x03, 0xe5, 0x53, 0x42, 0x2f, 0xfd, 0x81, 0x4c, 0xa1, 0x86, 0x98, - 0x21, 0x64, 0x58, 0xea, 0xd0, 0x03, 0x28, 0xb1, 0x29, 0x7c, 0xf7, 0xf5, 0x30, 0x75, 0x99, 0x44, - 0x7a, 0x97, 0xb8, 0xdc, 0x08, 0x3d, 0x82, 0xf2, 0x5b, 0x8f, 0x59, 0xf0, 0xb0, 0xd4, 0xf7, 0x57, - 0x85, 0xb9, 0x90, 0xe9, 0x13, 0xa4, 0x21, 0xfa, 0x15, 0xc0, 0x31, 0xa1, 0xbd, 0xa9, 0xc7, 0xbd, - 0x94, 0xf9, 0xb4, 0x7b, 0xf2, 0x03, 0x89, 0xe4, 0xfa, 0x54, 0x65, 0x02, 0x3a, 0x81, 0xa5, 0x63, - 0x42, 0x59, 0x0a, 0xba, 0xde, 0xc5, 0x6b, 0x77, 0x4c, 0x79, 0x20, 0xeb, 0xfb, 0xff, 0x17, 0x41, - 0x28, 0x3a, 0x1d, 0x26, 0x31, 0x11, 0xfd, 0x1c, 0x2a, 0xc7, 0x84, 0x3e, 0x77, 0xbd, 0x01, 0xcf, - 0x55, 0x96, 0x7d, 0x21, 0x06, 0x13, 0xea, 0x93, 0x43, 0x53, 0x84, 0x61, 0xe5, 0x15, 0x21, 0xa3, - 0x38, 0xce, 0x6c, 0xbe, 0xc8, 0xde, 0x6d, 0x31, 0x3f, 0xa5, 0xd6, 0x91, 0xd2, 0xd3, 0xd9, 0xa6, - 0x98, 0x10, 0x93, 0x6b, 0x9f, 0x12, 0x1e, 0x17, 0x50, 0x37, 0xa5, 0xeb, 0x12, 0x9b, 0xd2, 0x95, - 0xe8, 0x35, 0x2c, 0xf3, 0x84, 0x75, 0x28, 0x91, 0xc9, 0x6e, 0xd5, 0x39, 0xd6, 0x47, 0x02, 0x2b, - 0xa1, 0xd4, 0xc1, 0x92, 0x53, 0x51, 0x07, 0x1a, 0x1d, 0xc7, 0xf3, 0x7c, 0xda, 0xf1, 0xaf, 0xaf, - 0x5d, 0x6a, 0x35, 0x38, 0xd4, 0xa6, 0x80, 0x52, 0x35, 0x3a, 0x8e, 0x36, 0x89, 0x81, 0x1c, 0x13, - 0x7a, 0xd0, 0xa7, 0xee, 0x0d, 0xe9, 0x4d, 0x3d, 0xab, 0xa9, 0x82, 0xa8, 0x9a, 0x04, 0x88, 0xaa, - 0x62, 0x61, 0xef, 0x12, 0x8a, 0x19, 0x23, 0x04, 0x34, 0xdc, 0xd9, 0x92, 0x1a, 0xf6, 0x94, 0x3a, - 0x11, 0xf6, 0x94, 0x9e, 0x61, 0x76, 0x1c, 0x2f, 0x81, 0xb9, 0xac, 0x62, 0xa6, 0xd4, 0x09, 0xcc, - 0x94, 0x1e, 0xbd, 0x05, 0x84, 0xc9, 0xb5, 0xe3, 0x7a, 0xbd, 0xa9, 0x77, 0xe2, 0x85, 0xa0, 0x26, - 0x07, 0xbd, 0x2f, 0x40, 0xd3, 0x7a, 0x1d, 0x35, 0x03, 0x00, 0xfd, 0x1a, 0xea, 0x9d, 0x4b, 0xd2, - 0xbf, 0x3a, 0x0b, 0x46, 0x97, 0x8e, 0x67, 0xad, 0x70, 0x3c, 0x4b, 0x2e, 0x32, 0x56, 0xe8, 0x40, - 0xea, 0x14, 0x96, 0x18, 0x98, 0x8c, 0x27, 0xd7, 0xe4, 0xc4, 0xbb, 0x61, 0x6f, 0xb9, 0xf3, 0xc6, - 0x42, 0x6a, 0x62, 0x24, 0x94, 0x89, 0xc4, 0x48, 0x68, 0xd1, 0x11, 0x34, 0x8f, 0x09, 0x65, 0x19, - 0xf7, 0xd2, 0x1f, 0x0e, 0x48, 0x60, 0xad, 0x72, 0xac, 0xad, 0xe8, 0xa5, 0xc6, 0x2a, 0x1d, 0x49, - 0x9f, 0x86, 0x1c, 0xd8, 0x38, 0x38, 0xf7, 0x03, 0x2a, 0x32, 0xf8, 0x90, 0x38, 0x03, 0x06, 0xc0, - 0xb2, 0x64, 0x8d, 0x03, 0xfe, 0x44, 0x00, 0x66, 0xdb, 0xe8, 0xc8, 0x39, 0x40, 0xf6, 0xbf, 0x00, - 0xaa, 0x98, 0x8c, 0x47, 0xbe, 0x37, 0x26, 0x73, 0x68, 0x35, 0x66, 0xc8, 0xc2, 0x0c, 0x86, 0x5c, - 0x83, 0xc5, 0x17, 0x41, 0xe0, 0x07, 0x9c, 0x46, 0x1b, 0x58, 0x0c, 0xd0, 0xa7, 0x50, 0x79, 0x43, - 0x6e, 0x39, 0x1b, 0x94, 0x32, 0x09, 0x19, 0x87, 0x7a, 0xf4, 0x53, 0x49, 0xb1, 0x82, 0x33, 0x91, - 0x4a, 0xb1, 0x62, 0x99, 0x1a, 0xc7, 0xee, 0x47, 0x1c, 0x5b, 0x56, 0x59, 0x2a, 0xe4, 0x58, 0x6d, - 0x46, 0x48, 0xb2, 0xcf, 0x34, 0x92, 0xad, 0xa8, 0xd9, 0xa2, 0x92, 0xac, 0x36, 0x57, 0x65, 0xd9, - 0xaf, 0x53, 0x2c, 0x5b, 0x55, 0x73, 0x25, 0xc9, 0xb2, 0x1a, 0x4e, 0x92, 0x66, 0x9f, 0xc4, 0x34, - 0x2b, 0x68, 0x72, 0x3d, 0x41, 0xb3, 0xda, 0xec, 0x88, 0x67, 0xbb, 0x59, 0x3c, 0x0b, 0xea, 0x77, - 0x94, 0xc1, 0xb3, 0x1a, 0x54, 0x06, 0xd1, 0x7e, 0x9d, 0x22, 0x5a, 0x8d, 0x1c, 0x93, 0x44, 0xab, - 0xef, 0x2b, 0xc1, 0xb4, 0xa7, 0x69, 0xa6, 0x15, 0xf4, 0xf8, 0x71, 0x0e, 0xd3, 0x6a, 0x68, 0x29, - 0xaa, 0x3d, 0x4c, 0x50, 0x6d, 0x53, 0xfd, 0xa0, 0x74, 0xaa, 0xd5, 0x80, 0x74, 0xae, 0x3d, 0x4c, - 0x70, 0xed, 0x52, 0xe2, 0xb3, 0x54, 0xb8, 0x56, 0x47, 0xd1, 0xc8, 0xb6, 0x9b, 0x45, 0xb6, 0xcb, - 0x6a, 0xec, 0x33, 0xc8, 0x56, 0x8f, 0x7d, 0x9a, 0x6d, 0xbb, 0x59, 0x6c, 0xab, 0x11, 0x63, 0x06, - 0xdb, 0xea, 0xa0, 0x69, 0xba, 0x7d, 0x97, 0x49, 0xb7, 0x82, 0x1e, 0x5b, 0xf9, 0x74, 0xab, 0xc1, - 0x66, 0xf1, 0xed, 0x81, 0xce, 0xb7, 0x48, 0x3b, 0xf7, 0x54, 0xbe, 0xd5, 0x90, 0x34, 0xc2, 0x3d, - 0x4d, 0x13, 0xee, 0xaa, 0x9a, 0x1f, 0x29, 0xc2, 0xd5, 0xf3, 0x23, 0xc9, 0xb8, 0xe7, 0x73, 0x98, - 0x72, 0x67, 0x36, 0x53, 0x6a, 0xe0, 0x39, 0x48, 0xe8, 0x38, 0xc9, 0xea, 0xeb, 0x89, 0xda, 0x4a, - 0x65, 0x75, 0x0d, 0x51, 0x9f, 0x67, 0xff, 0xd1, 0x10, 0x6d, 0x51, 0x58, 0xcd, 0xb2, 0x0a, 0x7d, - 0xea, 0x49, 0xca, 0x6d, 0x60, 0x31, 0x98, 0x53, 0xa1, 0x23, 0x28, 0x61, 0xff, 0x76, 0x6c, 0x15, - 0x5b, 0xc5, 0x76, 0x03, 0xf3, 0x67, 0xf4, 0x08, 0x2a, 0xb2, 0xd3, 0x4a, 0xd7, 0xa7, 0x52, 0x11, - 0xf2, 0x88, 0x1c, 0xda, 0x4f, 0xa1, 0xa1, 0x7e, 0xcc, 0x68, 0x17, 0xca, 0x2c, 0xb4, 0x43, 0xca, - 0xd7, 0x52, 0x0f, 0x39, 0x5e, 0xc8, 0x42, 0x1a, 0x15, 0x23, 0xfb, 0x2b, 0x58, 0x49, 0xd5, 0xa4, - 0x39, 0x7b, 0x31, 0xa1, 0x88, 0xfd, 0x5b, 0xbe, 0x8b, 0x06, 0x66, 0x8f, 0xb6, 0x03, 0x28, 0xcd, - 0xb5, 0xb2, 0xbb, 0x98, 0x88, 0x5e, 0x65, 0x11, 0x8b, 0x01, 0x7a, 0x02, 0x75, 0x95, 0x6c, 0x0b, - 0xad, 0x62, 0xbb, 0xbe, 0xdf, 0x8c, 0x5b, 0xbc, 0xde, 0xd4, 0x0b, 0x53, 0x4c, 0xb1, 0xb3, 0x7b, - 0xb0, 0x96, 0x75, 0xd4, 0x86, 0x8b, 0x31, 0xa2, 0xc5, 0x68, 0x8d, 0x4a, 0x61, 0x76, 0xa3, 0x62, - 0x1f, 0xc2, 0x7a, 0xe6, 0xab, 0x46, 0x0f, 0xa0, 0x2c, 0xf3, 0x42, 0x84, 0x2e, 0x73, 0x81, 0xd2, - 0xc4, 0x7e, 0xc6, 0x51, 0xd2, 0xc5, 0x38, 0xfa, 0x04, 0x8a, 0x2c, 0x6b, 0x67, 0x40, 0x30, 0xbd, - 0x7d, 0x06, 0x1b, 0xd9, 0xc7, 0x4c, 0x32, 0x58, 0xc6, 0x0f, 0x0c, 0x56, 0x1f, 0x2a, 0x52, 0x9b, - 0x9f, 0x8e, 0x9d, 0x80, 0x38, 0x94, 0x0c, 0xce, 0xbc, 0x30, 0x1d, 0x23, 0x01, 0xda, 0x81, 0x26, - 0x9b, 0x4e, 0x82, 0x83, 0xc1, 0x20, 0x20, 0xe3, 0x31, 0x3f, 0xfd, 0x6b, 0x58, 0x17, 0xda, 0x7f, - 0x32, 0xa0, 0xa9, 0x75, 0x3f, 0x39, 0xbe, 0x3e, 0x87, 0xaa, 0x60, 0xec, 0x5e, 0x57, 0xf6, 0x6f, - 0xb3, 0x5a, 0xdf, 0xc8, 0x16, 0x7d, 0x01, 0xb5, 0xd3, 0x09, 0x75, 0xc4, 0x27, 0x50, 0xe4, 0x3b, - 0x97, 0x3d, 0xd7, 0x8b, 0x29, 0x0d, 0x9c, 0x50, 0x17, 0x36, 0x7f, 0x91, 0xad, 0x6d, 0xc2, 0x92, - 0x5e, 0x31, 0xd8, 0x7f, 0x31, 0xf8, 0x21, 0xaf, 0x34, 0x28, 0xfa, 0x07, 0x69, 0x24, 0x3f, 0xc8, - 0xa8, 0xcd, 0x2e, 0xa8, 0x6d, 0x76, 0xd4, 0x18, 0x17, 0xf3, 0x1a, 0xe3, 0xd2, 0x8f, 0x6b, 0x8c, - 0x17, 0xd3, 0x8d, 0xf1, 0x11, 0x2c, 0x27, 0xaa, 0x85, 0xff, 0xa9, 0x03, 0xb6, 0xff, 0x6a, 0x80, - 0x95, 0xd7, 0x9d, 0xcd, 0xd9, 0xfc, 0x0e, 0x94, 0xbb, 0xd4, 0xa1, 0x93, 0xb1, 0x5e, 0x1a, 0x0a, - 0x19, 0x96, 0x3a, 0xb4, 0x01, 0x65, 0xfe, 0x7e, 0x43, 0xd6, 0x92, 0x23, 0xf4, 0x04, 0x20, 0xf2, - 0xc9, 0xa8, 0xab, 0x98, 0xbf, 0x5c, 0xc5, 0xd0, 0xfe, 0x0d, 0x6c, 0xe6, 0x16, 0x39, 0x68, 0x09, - 0x0a, 0x67, 0xaf, 0xf8, 0x42, 0xab, 0xb8, 0x70, 0xf6, 0xea, 0x87, 0xad, 0xd0, 0xfe, 0x12, 0xac, - 0xbc, 0x46, 0x69, 0x76, 0x04, 0xec, 0x07, 0xb0, 0x99, 0x7b, 0xea, 0x27, 0x17, 0xc3, 0xdc, 0xe4, - 0xf5, 0x4e, 0xf3, 0xdd, 0xe4, 0xd6, 0x01, 0x29, 0x37, 0xbf, 0x80, 0xcd, 0xdc, 0x6e, 0x6a, 0x8e, - 0x9f, 0xa7, 0xb0, 0x95, 0x5f, 0x19, 0x88, 0x3e, 0x41, 0x6a, 0x25, 0x55, 0xc7, 0x02, 0xfb, 0x09, - 0xac, 0x67, 0xf6, 0xe4, 0x73, 0x5c, 0xb6, 0x61, 0x23, 0xbb, 0xc2, 0x4c, 0xed, 0xeb, 0x73, 0xd8, - 0xc8, 0x6e, 0xd4, 0xe7, 0x78, 0xf8, 0x14, 0xee, 0xe5, 0x94, 0x9d, 0x29, 0x17, 0x47, 0xf0, 0xf1, - 0xcc, 0xae, 0x8a, 0xf1, 0x34, 0x9d, 0xc3, 0xd3, 0x74, 0xea, 0xd9, 0x3f, 0x83, 0xed, 0xd9, 0x35, - 0x47, 0xca, 0x33, 0x86, 0xd5, 0x8c, 0xab, 0x03, 0xf4, 0x15, 0x34, 0x45, 0xe5, 0xc4, 0x8e, 0xcc, - 0x98, 0xd8, 0xe5, 0x67, 0x12, 0xa9, 0xc2, 0x82, 0x43, 0xb3, 0xb5, 0x7f, 0x09, 0x6b, 0x59, 0x35, - 0x32, 0x63, 0x6d, 0x21, 0x61, 0xc7, 0x80, 0x78, 0x97, 0xec, 0xbb, 0xd4, 0x85, 0xf6, 0x63, 0x58, - 0xcd, 0xb8, 0x87, 0x98, 0x13, 0xeb, 0x67, 0xfc, 0xf0, 0x4d, 0x15, 0xd4, 0xf1, 0xfd, 0xa1, 0xa1, - 0xde, 0x1f, 0x9a, 0xe2, 0xd4, 0x2b, 0x70, 0xf7, 0xfc, 0x80, 0x3b, 0x04, 0x94, 0xee, 0xdc, 0xe7, - 0xb0, 0x50, 0x84, 0x62, 0x84, 0x28, 0x9f, 0xc1, 0x6a, 0x46, 0x3d, 0xca, 0x88, 0x48, 0x96, 0xae, - 0x62, 0x15, 0x72, 0x64, 0x7f, 0x01, 0xb5, 0x28, 0x70, 0xc8, 0x82, 0x4a, 0x58, 0x31, 0x0b, 0x4f, - 0xe1, 0x30, 0x63, 0xb5, 0x7f, 0x28, 0x86, 0x75, 0x13, 0x7a, 0x04, 0x55, 0x96, 0xbc, 0xfc, 0x98, - 0x34, 0x66, 0x31, 0x6f, 0x64, 0xc6, 0x28, 0xfe, 0xa5, 0x33, 0xee, 0xf8, 0xde, 0xfb, 0xa1, 0xdb, - 0xa7, 0x7c, 0xfd, 0x55, 0xac, 0x8a, 0xd8, 0x8b, 0x7a, 0xe9, 0x8c, 0xbf, 0x09, 0xc8, 0x8d, 0xec, - 0x7f, 0x8a, 0xdc, 0x46, 0x17, 0xa2, 0x2f, 0xa1, 0x16, 0x9d, 0x8d, 0xb2, 0x02, 0x9c, 0x75, 0x6e, - 0xc6, 0xc6, 0x3f, 0xe2, 0xde, 0xbb, 0x05, 0xf5, 0x70, 0x55, 0xaf, 0xc8, 0x1d, 0x6f, 0xba, 0x1b, - 0x58, 0x15, 0xa9, 0x16, 0x2c, 0x4a, 0x15, 0xdd, 0x82, 0x45, 0x76, 0x1b, 0x80, 0xad, 0x5a, 0xd4, - 0x06, 0xbc, 0x77, 0x6e, 0x60, 0x45, 0xc2, 0x22, 0x2f, 0x9e, 0xc4, 0xc5, 0x77, 0x13, 0x87, 0x43, - 0x36, 0xf3, 0x0d, 0xb9, 0x65, 0x81, 0x3b, 0x18, 0x88, 0x7e, 0xb7, 0x8a, 0x15, 0x89, 0xdd, 0x85, - 0xa6, 0x76, 0xd2, 0xb3, 0x57, 0x75, 0x45, 0xee, 0xc2, 0x5a, 0xef, 0x8a, 0xdc, 0xb1, 0xc2, 0x79, - 0x7c, 0xe5, 0x8e, 0x64, 0x94, 0xf9, 0x33, 0x4b, 0xab, 0x80, 0x8c, 0x86, 0x4e, 0x9f, 0xf4, 0x7c, - 0x79, 0x6f, 0x11, 0x0b, 0x18, 0xdd, 0x64, 0x5f, 0xff, 0xcc, 0xf9, 0x04, 0x36, 0xe1, 0x5e, 0x4e, - 0x17, 0xb3, 0xfb, 0xff, 0xda, 0x8f, 0x10, 0x54, 0xe1, 0x15, 0xa9, 0xb9, 0x80, 0x6a, 0xb0, 0x88, - 0x59, 0x9c, 0x4d, 0x63, 0xf7, 0x13, 0x91, 0x47, 0xfc, 0xf7, 0x46, 0x13, 0x6a, 0x2f, 0xa6, 0xfd, - 0xe1, 0x64, 0xec, 0xde, 0x10, 0x73, 0x01, 0x01, 0x94, 0x59, 0x79, 0x40, 0x06, 0xa6, 0xb1, 0xbb, - 0x03, 0x10, 0xff, 0xe5, 0x40, 0x55, 0x28, 0xb1, 0x91, 0xb9, 0x80, 0x1a, 0x50, 0x3d, 0x72, 0xc6, - 0xf4, 0xc8, 0x71, 0x87, 0xa6, 0xb1, 0x7b, 0x3f, 0x2e, 0x38, 0x98, 0xcd, 0x1b, 0xdf, 0x23, 0xc2, - 0xdb, 0xf3, 0x3b, 0xe6, 0xd8, 0xd8, 0xfd, 0x77, 0x21, 0xbc, 0xdc, 0x61, 0x7a, 0xe6, 0x58, 0xf8, - 0x11, 0x55, 0x91, 0x69, 0xa0, 0x25, 0xf5, 0xce, 0xc4, 0x2c, 0x20, 0x94, 0xbc, 0x03, 0x31, 0x8b, - 0x4c, 0xa6, 0x33, 0xb8, 0x59, 0x42, 0xf5, 0xe8, 0x7e, 0xc3, 0x5c, 0x44, 0xeb, 0x19, 0xb7, 0x16, - 0x66, 0x19, 0x2d, 0x43, 0x5d, 0xfe, 0x82, 0xe1, 0x93, 0x2a, 0x68, 0x05, 0x9a, 0x52, 0x20, 0xfd, - 0x57, 0xd1, 0x6a, 0xea, 0x3e, 0xc1, 0xac, 0x21, 0x53, 0xbf, 0x15, 0x30, 0x81, 0x49, 0x54, 0xda, - 0x31, 0xeb, 0xcc, 0x67, 0xea, 0x60, 0x36, 0x1b, 0x68, 0x23, 0xab, 0x35, 0x36, 0x9b, 0xcc, 0x3c, - 0x75, 0xc0, 0x9a, 0x4b, 0x6c, 0x89, 0x0a, 0x91, 0x98, 0xcb, 0x6c, 0x3d, 0x89, 0x97, 0x6b, 0x9a, - 0x68, 0x2b, 0xaf, 0x0b, 0x35, 0x57, 0xd8, 0x9e, 0xb4, 0xbe, 0xc1, 0x44, 0xbb, 0x24, 0xac, 0x49, - 0xc4, 0x22, 0xb9, 0x2f, 0x66, 0xf0, 0xc2, 0x63, 0xc1, 0x31, 0x17, 0xd8, 0x22, 0x15, 0xb1, 0x0c, - 0xb6, 0x69, 0x28, 0xe6, 0x6f, 0xf9, 0xfb, 0xe8, 0x4e, 0xfa, 0x7d, 0xb3, 0xa0, 0x88, 0xe3, 0x2d, - 0x98, 0xc5, 0xe7, 0x9d, 0xef, 0xfe, 0xb1, 0x6d, 0x7c, 0xfb, 0x61, 0xdb, 0xf8, 0xee, 0xc3, 0xb6, - 0xf1, 0xf7, 0x0f, 0xdb, 0x0b, 0x7f, 0xfe, 0xe7, 0xb6, 0xf1, 0x3b, 0xf5, 0xdf, 0xde, 0xb5, 0x43, - 0x03, 0x77, 0xea, 0xf3, 0x9a, 0x32, 0x1c, 0x78, 0x64, 0x6f, 0x74, 0x75, 0xb1, 0x37, 0x3a, 0xdf, - 0x63, 0x7b, 0x38, 0x2f, 0xf3, 0x3f, 0x7a, 0x8f, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x91, 0xd7, - 0xe0, 0x62, 0x25, 0x1c, 0x00, 0x00, + // 2215 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x59, 0xdb, 0x72, 0x1b, 0xc7, + 0xd1, 0xe6, 0x02, 0x20, 0x0e, 0x0d, 0x80, 0x5c, 0x0e, 0x0f, 0x5a, 0xf2, 0xb7, 0x29, 0xfc, 0x1b, + 0xba, 0x0a, 0xa6, 0x62, 0x31, 0xa2, 0x22, 0xdb, 0x91, 0x13, 0x55, 0x28, 0x50, 0xa4, 0x68, 0x89, + 0xa2, 0x33, 0x80, 0x94, 0xaa, 0xdc, 0x2d, 0x81, 0x11, 0xb9, 0x45, 0x70, 0x17, 0x59, 0x2c, 0x48, + 0xf0, 0x01, 0x52, 0x95, 0x27, 0xc8, 0x75, 0x2e, 0x73, 0x93, 0xf7, 0x70, 0xe5, 0xca, 0x55, 0xbe, + 0x4f, 0x25, 0xca, 0x13, 0x24, 0x4f, 0x90, 0xea, 0x99, 0x3d, 0xcc, 0xec, 0x01, 0xb0, 0x73, 0xb7, + 0xd3, 0xdd, 0xf3, 0xf5, 0x4c, 0xcf, 0xcc, 0x37, 0xdd, 0xb3, 0x00, 0x43, 0xb7, 0x7f, 0xf5, 0x70, + 0xe4, 0xb9, 0xbe, 0x4b, 0x4a, 0xf8, 0xbd, 0xf5, 0xd9, 0x85, 0xed, 0x5f, 0x4e, 0xce, 0x1f, 0xf6, + 0xdd, 0xeb, 0xbd, 0x0b, 0xf7, 0xc2, 0xdd, 0xe3, 0xca, 0xf3, 0xc9, 0x7b, 0xde, 0xe2, 0x0d, 0xfe, + 0x25, 0x3a, 0x6d, 0x2d, 0xfb, 0xf6, 0x35, 0x1b, 0xfb, 0xd6, 0xf5, 0x48, 0x08, 0xcc, 0xbf, 0x15, + 0xa1, 0xfe, 0xda, 0xed, 0x5f, 0x9d, 0x8d, 0x7c, 0xdb, 0x75, 0xc6, 0xe4, 0x31, 0xd4, 0x8f, 0x3d, + 0xcb, 0x99, 0x0c, 0x2d, 0xcf, 0xf6, 0xef, 0x0c, 0xad, 0xa5, 0xb5, 0x97, 0xf6, 0x57, 0x1e, 0x72, + 0xbf, 0x92, 0x82, 0xca, 0x56, 0xc4, 0x84, 0xd2, 0xa9, 0x3b, 0x60, 0x46, 0x81, 0x5b, 0x2f, 0x09, + 0x6b, 0x44, 0x45, 0x29, 0xe5, 0x3a, 0xd2, 0x86, 0xf2, 0x37, 0xee, 0xd0, 0xee, 0xdf, 0x19, 0x45, + 0x6e, 0xa5, 0x0b, 0xab, 0xdf, 0x5a, 0xb6, 0x2f, 0xe4, 0x34, 0xd0, 0x93, 0x8f, 0xa0, 0x76, 0xe4, + 0x7a, 0xb7, 0x96, 0x37, 0xe8, 0xb9, 0x46, 0xa9, 0xa5, 0xb5, 0x6b, 0x34, 0x16, 0x90, 0x36, 0x2c, + 0xf7, 0xac, 0xf3, 0x21, 0x3b, 0x64, 0xef, 0x3b, 0x97, 0x96, 0x73, 0xc1, 0x06, 0xc6, 0x62, 0x4b, + 0x6b, 0x57, 0x69, 0x52, 0x8c, 0x38, 0x94, 0xf9, 0xde, 0x1d, 0xba, 0x30, 0xca, 0x2d, 0xad, 0x5d, + 0xa4, 0xb1, 0x80, 0xac, 0xc1, 0xe2, 0xb1, 0xe7, 0x4e, 0x46, 0x46, 0xa5, 0xa5, 0xb5, 0x9b, 0x54, + 0x34, 0xc8, 0x2e, 0x54, 0xbb, 0x97, 0x96, 0x37, 0xb0, 0x9d, 0x0b, 0xa3, 0x2a, 0xcf, 0x26, 0x94, + 0xd2, 0x48, 0x4f, 0x9e, 0x02, 0x74, 0x1d, 0x6b, 0xd4, 0xbd, 0x74, 0xfd, 0xde, 0xd8, 0xa8, 0xb5, + 0xb4, 0x76, 0x7d, 0x7f, 0xed, 0x61, 0x1c, 0xe0, 0x5e, 0xf8, 0xf5, 0xbc, 0xf4, 0xed, 0xdf, 0xef, + 0x2f, 0x50, 0xc9, 0x1a, 0x67, 0x81, 0xf1, 0xc1, 0x91, 0xa0, 0x99, 0x3b, 0xf1, 0x0d, 0xe0, 0x23, + 0x4c, 0x8a, 0xc9, 0x2e, 0xe8, 0xa1, 0xe8, 0x90, 0x59, 0x83, 0xa1, 0xed, 0x30, 0xa3, 0xce, 0x4d, + 0x53, 0x72, 0xf3, 0x7b, 0x0d, 0x6a, 0x28, 0xe4, 0x91, 0xc0, 0x19, 0xf2, 0x0f, 0xbe, 0x88, 0x25, + 0x2a, 0x1a, 0x18, 0x95, 0x2e, 0xf3, 0x6e, 0xec, 0x3e, 0x3b, 0x39, 0xe4, 0x0b, 0x56, 0xa3, 0xb1, + 0x80, 0x18, 0x50, 0x79, 0xc7, 0xbc, 0xb1, 0xed, 0x3a, 0x7c, 0x99, 0x4a, 0x34, 0x6c, 0x22, 0xda, + 0x3b, 0x6b, 0x68, 0x0f, 0xf8, 0x8a, 0x54, 0xa9, 0x68, 0xc4, 0x51, 0x5c, 0xcc, 0x8b, 0x62, 0x79, + 0x4e, 0x14, 0x5b, 0x50, 0x3f, 0xf3, 0xec, 0x0b, 0xdb, 0x11, 0x63, 0xad, 0x70, 0xaf, 0xb2, 0xc8, + 0xfc, 0x1e, 0xa0, 0x42, 0xd9, 0xef, 0x27, 0x6c, 0xec, 0x8b, 0x35, 0xe5, 0x9f, 0x27, 0x87, 0xc1, + 0xbc, 0x62, 0x01, 0x79, 0x2c, 0x4d, 0x9f, 0xcf, 0xad, 0xbe, 0xbf, 0x1c, 0x6f, 0x46, 0x2e, 0x0e, + 0xd6, 0x42, 0x0a, 0xd3, 0x0e, 0x94, 0x4f, 0x99, 0x7f, 0xe9, 0x0e, 0x82, 0x8d, 0xd9, 0x10, 0x3d, + 0x84, 0x8c, 0x06, 0x3a, 0xf2, 0x00, 0x4a, 0xd8, 0x85, 0xcf, 0xbe, 0x1e, 0x1e, 0x08, 0x94, 0x04, + 0xde, 0x03, 0x5c, 0x6e, 0x44, 0x1e, 0x41, 0xf9, 0xad, 0x83, 0x16, 0x3c, 0x2c, 0xf5, 0xfd, 0x55, + 0x61, 0x2e, 0x64, 0x6a, 0x87, 0xc0, 0x90, 0xfc, 0x0a, 0xe0, 0x98, 0xf9, 0xbd, 0xa9, 0xc3, 0xbd, + 0x94, 0x79, 0xb7, 0x7b, 0xc1, 0xb1, 0x8b, 0xe4, 0x6a, 0x57, 0xa9, 0x03, 0x39, 0x81, 0xa5, 0x63, + 0xe6, 0xe3, 0x66, 0xb0, 0x9d, 0x8b, 0xd7, 0xf6, 0xd8, 0xe7, 0x81, 0xac, 0xef, 0xff, 0x5f, 0x04, + 0x21, 0xe9, 0x54, 0x98, 0x44, 0x47, 0xf2, 0x73, 0xa8, 0x1c, 0x33, 0xff, 0xb9, 0xed, 0x0c, 0xf8, + 0x09, 0xc0, 0x3d, 0x1d, 0x62, 0xa0, 0x50, 0xed, 0x1c, 0x9a, 0x12, 0x0a, 0x2b, 0xaf, 0x18, 0x1b, + 0xc5, 0x71, 0xc6, 0xfe, 0xe2, 0x4c, 0x6c, 0x8b, 0xfe, 0x29, 0xb5, 0x8a, 0x94, 0xee, 0x8e, 0x93, + 0x42, 0x21, 0x65, 0xd7, 0xae, 0xcf, 0x78, 0x5c, 0x40, 0x9e, 0x94, 0xaa, 0x4b, 0x4c, 0x4a, 0x55, + 0x92, 0xd7, 0xb0, 0xcc, 0x37, 0xac, 0xe5, 0xb3, 0x60, 0xb3, 0xf3, 0x43, 0x54, 0xdf, 0xff, 0x48, + 0x60, 0x25, 0x94, 0x2a, 0x58, 0xb2, 0x2b, 0xe9, 0x40, 0xa3, 0x63, 0x39, 0x8e, 0xeb, 0x77, 0xdc, + 0xeb, 0x6b, 0xdb, 0x37, 0x1a, 0x1c, 0x6a, 0x53, 0x40, 0xc9, 0x1a, 0x15, 0x47, 0xe9, 0x84, 0x20, + 0xc7, 0xcc, 0x3f, 0xe8, 0xfb, 0xf6, 0x0d, 0xeb, 0x4d, 0x1d, 0xa3, 0x29, 0x83, 0xc8, 0x9a, 0x04, + 0x88, 0xac, 0xc2, 0xb0, 0x77, 0x99, 0x4f, 0x91, 0x67, 0x3c, 0x3f, 0x9c, 0xd9, 0x92, 0x1c, 0xf6, + 0x94, 0x3a, 0x11, 0xf6, 0x94, 0x1e, 0x31, 0x3b, 0x96, 0x93, 0xc0, 0x5c, 0x96, 0x31, 0x53, 0xea, + 0x04, 0x66, 0x4a, 0x4f, 0xde, 0x02, 0xa1, 0xec, 0xda, 0xb2, 0x9d, 0xde, 0xd4, 0x39, 0x71, 0x42, + 0x50, 0x9d, 0x83, 0xde, 0x17, 0xa0, 0x69, 0xbd, 0x8a, 0x9a, 0x01, 0x40, 0x7e, 0x0d, 0xf5, 0xce, + 0x25, 0xeb, 0x5f, 0x9d, 0x79, 0xa3, 0x4b, 0xcb, 0x31, 0x56, 0x38, 0x9e, 0x11, 0x0c, 0x32, 0x56, + 0xa8, 0x40, 0x72, 0x17, 0xdc, 0x18, 0x94, 0x8d, 0x27, 0xd7, 0xec, 0xc4, 0xb9, 0xc1, 0x55, 0xee, + 0xbc, 0x31, 0x88, 0xbc, 0x31, 0x12, 0xca, 0xc4, 0xc6, 0x48, 0x68, 0xc9, 0x11, 0x34, 0x8f, 0x99, + 0x8f, 0x3b, 0xee, 0xa5, 0x3b, 0x1c, 0x30, 0xcf, 0x58, 0xe5, 0x58, 0x5b, 0xd1, 0xa2, 0xc6, 0x2a, + 0x15, 0x49, 0xed, 0x46, 0x2c, 0xd8, 0x38, 0x38, 0x77, 0x3d, 0x5f, 0xec, 0x60, 0xce, 0xef, 0x78, + 0x32, 0xa6, 0x8e, 0xb1, 0xc6, 0x01, 0x7f, 0x22, 0x00, 0xb3, 0x6d, 0x54, 0xe4, 0x1c, 0x20, 0xf3, + 0xdf, 0x00, 0x55, 0xca, 0xc6, 0x23, 0xd7, 0x19, 0xb3, 0x39, 0xb4, 0x1a, 0x33, 0x64, 0x61, 0x06, + 0x43, 0xae, 0xc1, 0xe2, 0x0b, 0xcf, 0x73, 0x3d, 0x4e, 0xa3, 0x0d, 0x2a, 0x1a, 0xe4, 0x53, 0xa8, + 0xbc, 0x61, 0xb7, 0x9c, 0x0d, 0x4a, 0x99, 0x84, 0x4c, 0x43, 0x3d, 0xf9, 0x69, 0x40, 0xb1, 0x82, + 0x33, 0x89, 0x4c, 0xb1, 0x62, 0x98, 0x0a, 0xc7, 0xee, 0x47, 0x1c, 0x5b, 0x96, 0x59, 0x2a, 0xe4, + 0x58, 0xa5, 0x47, 0x48, 0xb2, 0xcf, 0x14, 0x92, 0xad, 0xc8, 0xbb, 0x45, 0x26, 0x59, 0xa5, 0xaf, + 0xcc, 0xb2, 0x5f, 0xa7, 0x58, 0xb6, 0x2a, 0xef, 0x95, 0x24, 0xcb, 0x2a, 0x38, 0x49, 0x9a, 0x7d, + 0x12, 0xd3, 0xac, 0xa0, 0xc9, 0xf5, 0x04, 0xcd, 0x2a, 0xbd, 0x23, 0x9e, 0xed, 0x66, 0xf1, 0x2c, + 0xc8, 0xe7, 0x28, 0x83, 0x67, 0x15, 0xa8, 0x0c, 0xa2, 0xfd, 0x3a, 0x45, 0xb4, 0x0a, 0x39, 0x26, + 0x89, 0x56, 0x9d, 0x57, 0x82, 0x69, 0x4f, 0xd3, 0x4c, 0x2b, 0xe8, 0xf1, 0xe3, 0x1c, 0xa6, 0x55, + 0xd0, 0x52, 0x54, 0x7b, 0x98, 0xa0, 0xda, 0xa6, 0x7c, 0xa0, 0x54, 0xaa, 0x55, 0x80, 0x54, 0xae, + 0x3d, 0x4c, 0x70, 0xed, 0x52, 0xe2, 0x58, 0x4a, 0x5c, 0xab, 0xa2, 0x28, 0x64, 0xdb, 0xcd, 0x22, + 0xdb, 0x65, 0x39, 0xf6, 0x19, 0x64, 0xab, 0xc6, 0x3e, 0xcd, 0xb6, 0xdd, 0x2c, 0xb6, 0x55, 0x88, + 0x31, 0x83, 0x6d, 0x55, 0xd0, 0x34, 0xdd, 0xbe, 0xcb, 0xa4, 0x5b, 0x41, 0x8f, 0xad, 0x7c, 0xba, + 0x55, 0x60, 0xb3, 0xf8, 0xf6, 0x40, 0xe5, 0x5b, 0xa2, 0xdc, 0x7b, 0x32, 0xdf, 0x2a, 0x48, 0x0a, + 0xe1, 0x9e, 0xa6, 0x09, 0x77, 0x55, 0xde, 0x1f, 0x29, 0xc2, 0x55, 0xf7, 0x47, 0x92, 0x71, 0xcf, + 0xe7, 0x30, 0xe5, 0xce, 0x6c, 0xa6, 0x54, 0xc0, 0x73, 0x90, 0xc8, 0x71, 0x92, 0xd5, 0xd7, 0x13, + 0xb9, 0x95, 0xcc, 0xea, 0x0a, 0xa2, 0xda, 0xcf, 0xfc, 0xa3, 0x26, 0x8a, 0xad, 0x30, 0x9b, 0xc5, + 0x0c, 0x7d, 0xea, 0x04, 0x94, 0xdb, 0xa0, 0xa2, 0x31, 0x27, 0x43, 0x27, 0x50, 0xa2, 0xee, 0xed, + 0xd8, 0x28, 0xb6, 0x8a, 0xed, 0x06, 0xe5, 0xdf, 0xe4, 0x11, 0x54, 0x82, 0xfa, 0x2d, 0x9d, 0x9f, + 0x06, 0x8a, 0x90, 0x47, 0x82, 0xa6, 0xf9, 0x14, 0x1a, 0xf2, 0x61, 0x26, 0xbb, 0x50, 0xc6, 0xd0, + 0x0e, 0x7d, 0x3e, 0x96, 0x7a, 0xc8, 0xf1, 0x42, 0x16, 0xd2, 0xa8, 0x68, 0x99, 0x5f, 0xc1, 0x4a, + 0x2a, 0x27, 0xcd, 0x99, 0x8b, 0x0e, 0x45, 0xea, 0xde, 0xf2, 0x59, 0x34, 0x28, 0x7e, 0x9a, 0x16, + 0x90, 0x34, 0xd7, 0x06, 0xd5, 0xc5, 0x44, 0xd4, 0x2a, 0x8b, 0x54, 0x34, 0xc8, 0x13, 0xa8, 0xcb, + 0x64, 0x5b, 0x68, 0x15, 0xdb, 0xf5, 0xfd, 0x66, 0x5c, 0x38, 0xf6, 0xa6, 0x4e, 0xb8, 0xc5, 0x24, + 0x3b, 0xb3, 0x07, 0x6b, 0x59, 0x57, 0x6d, 0x38, 0x18, 0x2d, 0x1a, 0x8c, 0x52, 0xa8, 0x14, 0x66, + 0x17, 0x2a, 0xe6, 0x21, 0xac, 0x67, 0x2e, 0x35, 0x79, 0x00, 0xe5, 0x60, 0x5f, 0x88, 0xd0, 0x65, + 0x0e, 0x30, 0x30, 0x31, 0x9f, 0x71, 0x94, 0x74, 0x32, 0x4e, 0x3e, 0x81, 0x22, 0xee, 0xda, 0x19, + 0x10, 0xa8, 0x37, 0xcf, 0x60, 0x23, 0xfb, 0x9a, 0x49, 0x06, 0x4b, 0xfb, 0x81, 0xc1, 0xea, 0x43, + 0x25, 0xd0, 0xe6, 0x6f, 0xc7, 0x8e, 0xc7, 0x2c, 0x9f, 0x0d, 0xce, 0x9c, 0x70, 0x3b, 0x46, 0x02, + 0xb2, 0x03, 0x4d, 0xec, 0xce, 0xbc, 0x83, 0xc1, 0xc0, 0x63, 0xe3, 0x31, 0xbf, 0xfd, 0x6b, 0x54, + 0x15, 0x9a, 0x7f, 0xd2, 0xa0, 0xa9, 0x54, 0x3f, 0x39, 0xbe, 0x3e, 0x87, 0xaa, 0x60, 0xec, 0x5e, + 0x37, 0xa8, 0xdf, 0x66, 0x15, 0xd4, 0x91, 0x2d, 0xf9, 0x02, 0x6a, 0xa7, 0x13, 0xdf, 0x12, 0x47, + 0xa0, 0xc8, 0x67, 0x1e, 0xd4, 0x5c, 0x2f, 0xa6, 0xbe, 0x67, 0x85, 0xba, 0xb0, 0xf8, 0x8b, 0x6c, + 0x4d, 0x1d, 0x96, 0xd4, 0x8c, 0xc1, 0xfc, 0x8b, 0xc6, 0x2f, 0x79, 0xa9, 0x40, 0x51, 0x0f, 0xa4, + 0x96, 0x3c, 0x90, 0x51, 0x99, 0x5d, 0x90, 0xcb, 0xec, 0xa8, 0x30, 0x2e, 0xe6, 0x15, 0xc6, 0xa5, + 0x1f, 0x57, 0x18, 0x2f, 0xa6, 0x0b, 0xe3, 0x23, 0x58, 0x4e, 0x64, 0x0b, 0xff, 0x53, 0x05, 0x6c, + 0xfe, 0x55, 0x03, 0x23, 0xaf, 0x3a, 0x9b, 0x33, 0xf9, 0x1d, 0x28, 0x77, 0x7d, 0xcb, 0x9f, 0x8c, + 0xd5, 0xd4, 0x50, 0xc8, 0x68, 0xa0, 0x23, 0x1b, 0x50, 0xe6, 0xeb, 0x1b, 0xb2, 0x56, 0xd0, 0x22, + 0x4f, 0x00, 0x22, 0x9f, 0x48, 0x5d, 0xc5, 0xfc, 0xe1, 0x4a, 0x86, 0xe6, 0x6f, 0x60, 0x33, 0x37, + 0xc9, 0x21, 0x4b, 0x50, 0x38, 0x7b, 0xc5, 0x07, 0x5a, 0xa5, 0x85, 0xb3, 0x57, 0x3f, 0x6c, 0x84, + 0xe6, 0x97, 0x60, 0xe4, 0x15, 0x4a, 0xb3, 0x23, 0x60, 0x3e, 0x80, 0xcd, 0xdc, 0x5b, 0x3f, 0x39, + 0x18, 0x74, 0x93, 0x57, 0x3b, 0xcd, 0x77, 0x93, 0x9b, 0x07, 0xa4, 0xdc, 0xfc, 0x02, 0x36, 0x73, + 0xab, 0xa9, 0x39, 0x7e, 0x9e, 0xc2, 0x56, 0x7e, 0x66, 0x20, 0xea, 0x84, 0x40, 0x1b, 0x50, 0x75, + 0x2c, 0x30, 0x9f, 0xc0, 0x7a, 0x66, 0x4d, 0x3e, 0xc7, 0x65, 0x1b, 0x36, 0xb2, 0x33, 0xcc, 0xd4, + 0xbc, 0x3e, 0x87, 0x8d, 0xec, 0x42, 0x7d, 0x8e, 0x87, 0x4f, 0xe1, 0x5e, 0x4e, 0xda, 0x99, 0x72, + 0x71, 0x04, 0x1f, 0xcf, 0xac, 0xaa, 0x90, 0xa7, 0xfd, 0x39, 0x3c, 0xed, 0x4f, 0x1d, 0xf3, 0x67, + 0xb0, 0x3d, 0x3b, 0xe7, 0x48, 0x79, 0xa6, 0xb0, 0x9a, 0xf1, 0x74, 0x40, 0xbe, 0x82, 0xa6, 0xc8, + 0x9c, 0xf0, 0xca, 0x8c, 0x89, 0x3d, 0x38, 0x26, 0x91, 0x2a, 0x4c, 0x38, 0x14, 0x5b, 0xf3, 0x97, + 0xb0, 0x96, 0x95, 0x23, 0x23, 0x6b, 0x0b, 0x09, 0x5e, 0x03, 0x62, 0x2d, 0xf1, 0x5c, 0xaa, 0x42, + 0xf3, 0x31, 0xac, 0x66, 0xbc, 0x43, 0xcc, 0x89, 0xf5, 0x33, 0x7e, 0xf9, 0xa6, 0x12, 0xea, 0xf8, + 0xfd, 0x50, 0x93, 0xdf, 0x0f, 0x75, 0x71, 0xeb, 0x15, 0xb8, 0x7b, 0x7e, 0xc1, 0x1d, 0x02, 0x49, + 0x57, 0xee, 0x73, 0x58, 0x28, 0x42, 0xd1, 0x42, 0x94, 0xcf, 0x60, 0x35, 0x23, 0x1f, 0x45, 0x22, + 0x0a, 0x52, 0x57, 0x31, 0x8a, 0xa0, 0x65, 0x7e, 0x01, 0xb5, 0x28, 0x70, 0xc4, 0x80, 0x4a, 0x98, + 0x31, 0x0b, 0x4f, 0x61, 0x33, 0x63, 0xb4, 0x7f, 0x28, 0x86, 0x79, 0x13, 0x79, 0x04, 0x55, 0xdc, + 0xbc, 0xfc, 0x9a, 0xd4, 0x66, 0x31, 0x6f, 0x64, 0x86, 0x14, 0xff, 0xd2, 0x1a, 0x77, 0x5c, 0xe7, + 0xfd, 0xd0, 0xee, 0xfb, 0x7c, 0xfc, 0x55, 0x2a, 0x8b, 0x70, 0xa1, 0x5e, 0x5a, 0xe3, 0x6f, 0x3c, + 0x76, 0x13, 0xd4, 0x3f, 0x45, 0x6e, 0xa3, 0x0a, 0xc9, 0x97, 0x50, 0x8b, 0xee, 0xc6, 0x20, 0x03, + 0x9c, 0x75, 0x6f, 0xc6, 0xc6, 0x3f, 0xe2, 0x35, 0xbd, 0x05, 0xf5, 0x70, 0x54, 0xaf, 0xd8, 0x1d, + 0x2f, 0xba, 0x1b, 0x54, 0x16, 0xc9, 0x16, 0x18, 0xa5, 0x8a, 0x6a, 0x81, 0x91, 0xdd, 0x06, 0xc0, + 0x51, 0x8b, 0xdc, 0x80, 0xd7, 0xce, 0x0d, 0x2a, 0x49, 0x30, 0xf2, 0xe2, 0x4b, 0x3c, 0xa7, 0x37, + 0x69, 0xd8, 0xc4, 0x9e, 0x6f, 0xd8, 0x2d, 0x06, 0xee, 0x60, 0x20, 0xea, 0xdd, 0x2a, 0x95, 0x24, + 0x66, 0x17, 0x9a, 0xca, 0x4d, 0x8f, 0x4b, 0x75, 0xc5, 0xee, 0xc2, 0x5c, 0xef, 0x8a, 0xdd, 0x61, + 0xe2, 0x3c, 0xbe, 0xb2, 0x47, 0x41, 0x94, 0xf9, 0x37, 0x6e, 0x2b, 0x8f, 0x8d, 0x86, 0x56, 0x9f, + 0xf5, 0xdc, 0xe0, 0xdd, 0x22, 0x16, 0x20, 0xdd, 0x64, 0x3f, 0xff, 0xcc, 0x39, 0x02, 0x9b, 0x70, + 0x2f, 0xa7, 0x8a, 0xd9, 0xfd, 0x7f, 0xe5, 0xf7, 0x0a, 0xa9, 0xf0, 0x8c, 0x54, 0x5f, 0x20, 0x35, + 0x58, 0xa4, 0x18, 0x67, 0x5d, 0xdb, 0xfd, 0x44, 0xec, 0x23, 0xfe, 0xd3, 0xa4, 0x09, 0xb5, 0x17, + 0xd3, 0xfe, 0x70, 0x32, 0xb6, 0x6f, 0x98, 0xbe, 0x40, 0x00, 0xca, 0x98, 0x1e, 0xb0, 0x81, 0xae, + 0xed, 0xee, 0x00, 0xc4, 0xff, 0x4e, 0x48, 0x15, 0x4a, 0xd8, 0xd2, 0x17, 0x48, 0x03, 0xaa, 0x47, + 0xd6, 0xd8, 0x3f, 0xb2, 0xec, 0xa1, 0xae, 0xed, 0xde, 0x8f, 0x13, 0x0e, 0xb4, 0x79, 0xe3, 0x3a, + 0x4c, 0x78, 0x7b, 0x7e, 0x87, 0x8e, 0xb5, 0xdd, 0xff, 0x14, 0xc2, 0xc7, 0x1d, 0xd4, 0xa3, 0x63, + 0xe1, 0x47, 0x64, 0x45, 0xba, 0x46, 0x96, 0xe4, 0x37, 0x13, 0xbd, 0x40, 0x48, 0xf2, 0x0d, 0x44, + 0x2f, 0xa2, 0x4c, 0x65, 0x70, 0xbd, 0x44, 0xea, 0xd1, 0xfb, 0x86, 0xbe, 0x48, 0xd6, 0x33, 0x5e, + 0x2d, 0xf4, 0x32, 0x59, 0x86, 0x7a, 0xf0, 0x63, 0x87, 0x77, 0xaa, 0x90, 0x15, 0x68, 0x06, 0x82, + 0xc0, 0x7f, 0x95, 0xac, 0xa6, 0xde, 0x13, 0xf4, 0x1a, 0xd1, 0xd5, 0x57, 0x01, 0x1d, 0x50, 0x22, + 0xd3, 0x8e, 0x5e, 0x47, 0x9f, 0xa9, 0x8b, 0x59, 0x6f, 0x90, 0x8d, 0xac, 0xd2, 0x58, 0x6f, 0xa2, + 0x79, 0xea, 0x82, 0xd5, 0x97, 0x70, 0x88, 0x12, 0x91, 0xe8, 0xcb, 0x38, 0x9e, 0xc4, 0xe2, 0xea, + 0x3a, 0xd9, 0xca, 0xab, 0x42, 0xf5, 0x15, 0x9c, 0x93, 0x52, 0x37, 0xe8, 0x64, 0x97, 0x85, 0x39, + 0x89, 0x18, 0x24, 0xf7, 0x85, 0x06, 0x2f, 0x1c, 0x0c, 0x8e, 0xbe, 0x80, 0x83, 0x94, 0xc4, 0x41, + 0xb0, 0x75, 0x4d, 0x32, 0x7f, 0xcb, 0xd7, 0xa3, 0x3b, 0xe9, 0xf7, 0xf5, 0x82, 0x24, 0x8e, 0xa7, + 0xa0, 0x17, 0x9f, 0x77, 0xbe, 0xfb, 0xe7, 0xb6, 0xf6, 0xed, 0x87, 0x6d, 0xed, 0xbb, 0x0f, 0xdb, + 0xda, 0x3f, 0x3e, 0x6c, 0x2f, 0xfc, 0xf9, 0x5f, 0xdb, 0xda, 0xef, 0xe4, 0x3f, 0x86, 0xd7, 0x96, + 0xef, 0xd9, 0x53, 0x97, 0xe7, 0x94, 0x61, 0xc3, 0x61, 0x7b, 0xa3, 0xab, 0x8b, 0xbd, 0xd1, 0xf9, + 0x1e, 0xce, 0xe1, 0xbc, 0xcc, 0xff, 0x13, 0x3e, 0xfe, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x74, + 0x51, 0x98, 0x86, 0x7b, 0x1c, 0x00, 0x00, } func (m *LockOptions) Marshal() (dAtA []byte, err error) { @@ -3171,6 +3189,16 @@ func (m *LockOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.LockWaitDeadline != 0 { + i = encodeVarintLock(dAtA, i, uint64(m.LockWaitDeadline)) + i-- + dAtA[i] = 0x58 + } + if m.LockWaitTimeout != 0 { + i = encodeVarintLock(dAtA, i, uint64(m.LockWaitTimeout)) + i-- + dAtA[i] = 0x50 + } { size, err := m.SnapShotTs.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -5402,6 +5430,12 @@ func (m *LockOptions) ProtoSize() (n int) { } l = m.SnapShotTs.ProtoSize() n += 1 + l + sovLock(uint64(l)) + if m.LockWaitTimeout != 0 { + n += 1 + sovLock(uint64(m.LockWaitTimeout)) + } + if m.LockWaitDeadline != 0 { + n += 1 + sovLock(uint64(m.LockWaitDeadline)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -6497,6 +6531,44 @@ func (m *LockOptions) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LockWaitTimeout", wireType) + } + m.LockWaitTimeout = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLock + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.LockWaitTimeout |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LockWaitDeadline", wireType) + } + m.LockWaitDeadline = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLock + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.LockWaitDeadline |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipLock(dAtA[iNdEx:]) diff --git a/pkg/pb/pipeline/pipeline.pb.go b/pkg/pb/pipeline/pipeline.pb.go index f2140f29e6446..161393712bf20 100644 --- a/pkg/pb/pipeline/pipeline.pb.go +++ b/pkg/pb/pipeline/pipeline.pb.go @@ -4858,6 +4858,7 @@ type SessionInfo struct { TimeZone []byte `protobuf:"bytes,7,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` Account string `protobuf:"bytes,8,opt,name=account,proto3" json:"account,omitempty"` QueryId []string `protobuf:"bytes,9,rep,name=query_id,json=queryId,proto3" json:"query_id,omitempty"` + LockWaitTimeout int64 `protobuf:"varint,10,opt,name=lock_wait_timeout,json=lockWaitTimeout,proto3" json:"lock_wait_timeout,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -4959,6 +4960,13 @@ func (m *SessionInfo) GetQueryId() []string { return nil } +func (m *SessionInfo) GetLockWaitTimeout() int64 { + if m != nil { + return m.LockWaitTimeout + } + return 0 +} + type SessionLoggerInfo struct { SessId []byte `protobuf:"bytes,1,opt,name=sess_id,json=sessId,proto3" json:"sess_id,omitempty"` StmtId []byte `protobuf:"bytes,2,opt,name=stmt_id,json=stmtId,proto3" json:"stmt_id,omitempty"` @@ -5438,397 +5446,398 @@ func init() { func init() { proto.RegisterFile("pipeline.proto", fileDescriptor_7ac67a7adf3df9c7) } var fileDescriptor_7ac67a7adf3df9c7 = []byte{ - // 6231 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3c, 0x4d, 0x6f, 0x1c, 0x47, - 0x76, 0x9e, 0xef, 0x9e, 0x37, 0x1f, 0x1c, 0x36, 0x45, 0x69, 0x2c, 0x7f, 0x88, 0xee, 0x95, 0x64, - 0xae, 0x6c, 0x53, 0x36, 0xbd, 0xda, 0xf5, 0x7e, 0x2f, 0x45, 0x4a, 0x6b, 0xae, 0x49, 0x8a, 0x69, - 0x52, 0x31, 0xe2, 0x43, 0x1a, 0xcd, 0xee, 0x9a, 0x99, 0x36, 0x7b, 0xba, 0x5a, 0xdd, 0xd5, 0x12, - 0xa9, 0x53, 0x80, 0xe4, 0x94, 0x3f, 0x10, 0x20, 0xb9, 0x2c, 0x82, 0x00, 0xc1, 0x26, 0x08, 0x36, - 0x40, 0x90, 0x5c, 0x72, 0xc8, 0x75, 0x8f, 0x39, 0xe5, 0x90, 0x43, 0x10, 0x6c, 0x8e, 0x01, 0x72, - 0x4b, 0xb0, 0x97, 0x00, 0xc1, 0x7b, 0x55, 0xd5, 0xdd, 0x33, 0x1c, 0xca, 0x96, 0x13, 0xec, 0x25, - 0x7b, 0x62, 0xd5, 0x7b, 0xaf, 0x6a, 0xaa, 0x5f, 0xbd, 0x7a, 0x9f, 0x55, 0x84, 0x7e, 0x1c, 0xc4, - 0x2c, 0x0c, 0x22, 0xb6, 0x11, 0x27, 0x5c, 0x70, 0xd3, 0xd0, 0xfd, 0xeb, 0xef, 0x8d, 0x03, 0x31, - 0xc9, 0x4e, 0x36, 0x3c, 0x3e, 0xbd, 0x3b, 0xe6, 0x63, 0x7e, 0x97, 0x08, 0x4e, 0xb2, 0x11, 0xf5, - 0xa8, 0x43, 0x2d, 0x39, 0xf0, 0x3a, 0x84, 0xdc, 0x3b, 0xd5, 0xed, 0x38, 0x74, 0x23, 0xd5, 0x5e, - 0x12, 0xc1, 0x94, 0xa5, 0xc2, 0x9d, 0xc6, 0x0a, 0xd0, 0x16, 0x67, 0x0a, 0x67, 0xfd, 0x49, 0x15, - 0x5a, 0xfb, 0x2c, 0x4d, 0xdd, 0x31, 0x33, 0x2d, 0xa8, 0xa5, 0x81, 0x3f, 0xac, 0xac, 0x55, 0xd6, - 0xfb, 0x9b, 0x83, 0x8d, 0x7c, 0x59, 0x47, 0xc2, 0x15, 0x59, 0x6a, 0x23, 0x12, 0x69, 0xbc, 0xa9, - 0x3f, 0xac, 0xce, 0xd3, 0xec, 0x33, 0x31, 0xe1, 0xbe, 0x8d, 0x48, 0x73, 0x00, 0x35, 0x96, 0x24, - 0xc3, 0xda, 0x5a, 0x65, 0xbd, 0x6b, 0x63, 0xd3, 0x34, 0xa1, 0xee, 0xbb, 0xc2, 0x1d, 0xd6, 0x09, - 0x44, 0x6d, 0xf3, 0x26, 0xf4, 0xe3, 0x84, 0x7b, 0x4e, 0x10, 0x8d, 0xb8, 0x43, 0xd8, 0x06, 0x61, - 0xbb, 0x08, 0xdd, 0x8d, 0x46, 0x7c, 0x07, 0xa9, 0x86, 0xd0, 0x72, 0x23, 0x37, 0x3c, 0x4f, 0xd9, - 0xb0, 0x49, 0x68, 0xdd, 0x35, 0xfb, 0x50, 0x0d, 0xfc, 0x61, 0x6b, 0xad, 0xb2, 0x5e, 0xb7, 0xab, - 0x81, 0x8f, 0xbf, 0x91, 0x65, 0x81, 0x3f, 0x34, 0xe4, 0x6f, 0x60, 0xdb, 0xb4, 0xa0, 0x1b, 0x31, + // 6255 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3c, 0x4d, 0x6f, 0xdc, 0x48, + 0x76, 0xd3, 0xdf, 0xec, 0xd7, 0x1f, 0x6a, 0x51, 0x96, 0xdd, 0xe3, 0xf9, 0xb0, 0x86, 0x6b, 0x7b, + 0xb4, 0x9e, 0x19, 0x79, 0x46, 0xb3, 0xde, 0x9d, 0xfd, 0x5e, 0x59, 0xb2, 0x77, 0xb4, 0x23, 0xc9, + 0x0a, 0x25, 0x67, 0x90, 0x39, 0x84, 0xa0, 0xc8, 0xea, 0x6e, 0x8e, 0xd8, 0x2c, 0x9a, 0x2c, 0xda, + 0x92, 0x4f, 0x01, 0x92, 0x53, 0xfe, 0x40, 0x80, 0xe4, 0xb2, 0x58, 0x04, 0x08, 0x36, 0x41, 0xb0, + 0x01, 0x82, 0xe4, 0x92, 0x43, 0xae, 0x7b, 0xcc, 0x29, 0x87, 0x1c, 0x82, 0x60, 0x73, 0x0c, 0x90, + 0x5b, 0x80, 0xbd, 0x04, 0x08, 0xde, 0xab, 0x2a, 0x92, 0xdd, 0x6a, 0x79, 0xc6, 0x93, 0x60, 0x2f, + 0xd9, 0x53, 0x57, 0xbd, 0xf7, 0xaa, 0x58, 0x7c, 0xf5, 0xea, 0x7d, 0x16, 0x1b, 0xfa, 0x71, 0x10, + 0xb3, 0x30, 0x88, 0xd8, 0x46, 0x9c, 0x70, 0xc1, 0x4d, 0x43, 0xf7, 0xaf, 0xbf, 0x37, 0x0e, 0xc4, + 0x24, 0x3b, 0xd9, 0xf0, 0xf8, 0xf4, 0xee, 0x98, 0x8f, 0xf9, 0x5d, 0x22, 0x38, 0xc9, 0x46, 0xd4, + 0xa3, 0x0e, 0xb5, 0xe4, 0xc0, 0xeb, 0x10, 0x72, 0xef, 0x54, 0xb7, 0xe3, 0xd0, 0x8d, 0x54, 0x7b, + 0x49, 0x04, 0x53, 0x96, 0x0a, 0x77, 0x1a, 0x2b, 0x40, 0x5b, 0x9c, 0x29, 0x9c, 0xf5, 0x67, 0x55, + 0x68, 0xed, 0xb3, 0x34, 0x75, 0xc7, 0xcc, 0xb4, 0xa0, 0x96, 0x06, 0xfe, 0xb0, 0xb2, 0x56, 0x59, + 0xef, 0x6f, 0x0e, 0x36, 0xf2, 0x65, 0x1d, 0x09, 0x57, 0x64, 0xa9, 0x8d, 0x48, 0xa4, 0xf1, 0xa6, + 0xfe, 0xb0, 0x3a, 0x4f, 0xb3, 0xcf, 0xc4, 0x84, 0xfb, 0x36, 0x22, 0xcd, 0x01, 0xd4, 0x58, 0x92, + 0x0c, 0x6b, 0x6b, 0x95, 0xf5, 0xae, 0x8d, 0x4d, 0xd3, 0x84, 0xba, 0xef, 0x0a, 0x77, 0x58, 0x27, + 0x10, 0xb5, 0xcd, 0x9b, 0xd0, 0x8f, 0x13, 0xee, 0x39, 0x41, 0x34, 0xe2, 0x0e, 0x61, 0x1b, 0x84, + 0xed, 0x22, 0x74, 0x37, 0x1a, 0xf1, 0x1d, 0xa4, 0x1a, 0x42, 0xcb, 0x8d, 0xdc, 0xf0, 0x3c, 0x65, + 0xc3, 0x26, 0xa1, 0x75, 0xd7, 0xec, 0x43, 0x35, 0xf0, 0x87, 0xad, 0xb5, 0xca, 0x7a, 0xdd, 0xae, + 0x06, 0x3e, 0x3e, 0x23, 0xcb, 0x02, 0x7f, 0x68, 0xc8, 0x67, 0x60, 0xdb, 0xb4, 0xa0, 0x1b, 0x31, 0xe6, 0x1f, 0x70, 0x61, 0xb3, 0x38, 0x3c, 0x1f, 0xb6, 0xd7, 0x2a, 0xeb, 0x86, 0x3d, 0x03, 0x33, 0xaf, 0x83, 0xe1, 0xb3, 0x93, 0x6c, 0xbc, 0x9f, 0x8e, 0x87, 0xb0, 0x56, 0x59, 0x6f, 0xdb, 0x79, - 0xdf, 0x7a, 0x0c, 0xed, 0x6d, 0x1e, 0x45, 0xcc, 0x13, 0x3c, 0x31, 0x6f, 0x40, 0x47, 0x7f, 0xae, + 0xdf, 0x7a, 0x0c, 0xed, 0x6d, 0x1e, 0x45, 0xcc, 0x13, 0x3c, 0x31, 0x6f, 0x40, 0x47, 0xbf, 0xae, 0xa3, 0xd8, 0xd4, 0xb0, 0x41, 0x83, 0x76, 0x7d, 0xf3, 0x6d, 0x58, 0xf2, 0x34, 0xb5, 0x13, 0x44, - 0x3e, 0x3b, 0x23, 0x3e, 0x35, 0xec, 0x7e, 0x0e, 0xde, 0x45, 0xa8, 0xf5, 0xc7, 0x35, 0x68, 0x1d, + 0x3e, 0x3b, 0x23, 0x3e, 0x35, 0xec, 0x7e, 0x0e, 0xde, 0x45, 0xa8, 0xf5, 0xa7, 0x35, 0x68, 0x1d, 0x4d, 0xb2, 0xd1, 0x28, 0x64, 0xe6, 0x4d, 0xe8, 0xa9, 0xe6, 0x36, 0x0f, 0x77, 0xfd, 0x33, 0x35, 0xef, 0x2c, 0xd0, 0x5c, 0x83, 0x8e, 0x02, 0x1c, 0x9f, 0xc7, 0x4c, 0x4d, 0x5b, 0x06, 0xcd, 0xce, 0xb3, 0x1f, 0x44, 0xc4, 0xfe, 0x9a, 0x3d, 0x0b, 0x9c, 0xa3, 0x72, 0xcf, 0x68, 0x47, 0x66, 0xa9, - 0x5c, 0xfa, 0xb5, 0xad, 0x30, 0x78, 0xca, 0x6c, 0x36, 0xde, 0x8e, 0x04, 0xed, 0x4b, 0xc3, 0x2e, - 0x83, 0xcc, 0x4d, 0x58, 0x4d, 0xe5, 0x10, 0x27, 0x71, 0xa3, 0x31, 0x4b, 0x9d, 0x2c, 0x88, 0xc4, - 0x37, 0xbf, 0x31, 0x6c, 0xae, 0xd5, 0xd6, 0xeb, 0xf6, 0x8a, 0x42, 0xda, 0x84, 0x7b, 0x4c, 0x28, - 0xf3, 0x7d, 0xb8, 0x32, 0x37, 0x46, 0x0e, 0x69, 0xad, 0xd5, 0xd6, 0x6b, 0xb6, 0x39, 0x33, 0x64, - 0x97, 0x46, 0x3c, 0x80, 0xe5, 0x24, 0x8b, 0x50, 0x7a, 0x1f, 0x06, 0xa1, 0x60, 0xc9, 0x51, 0xcc, - 0x3c, 0xda, 0xdf, 0xce, 0xe6, 0xb5, 0x0d, 0x12, 0x70, 0x7b, 0x1e, 0x6d, 0x5f, 0x1c, 0x61, 0xbe, - 0x9b, 0x33, 0xef, 0xc1, 0x59, 0x9c, 0x90, 0x10, 0x74, 0x36, 0x41, 0x4e, 0x80, 0x10, 0xbb, 0x8c, - 0xb6, 0x7e, 0x55, 0x05, 0x63, 0x27, 0x48, 0x63, 0x57, 0x78, 0x13, 0xf3, 0x1a, 0xb4, 0x46, 0x59, - 0xe4, 0x15, 0xfb, 0xdd, 0xc4, 0xee, 0xae, 0x6f, 0x7e, 0x0f, 0x96, 0x42, 0xee, 0xb9, 0xa1, 0x93, - 0x6f, 0xed, 0xb0, 0xba, 0x56, 0x5b, 0xef, 0x6c, 0xae, 0x14, 0x67, 0x22, 0x17, 0x1d, 0xbb, 0x4f, - 0xb4, 0x85, 0x28, 0x7d, 0x1f, 0x06, 0x09, 0x9b, 0x72, 0xc1, 0x4a, 0xc3, 0x6b, 0x34, 0xdc, 0x2c, - 0x86, 0x7f, 0x9a, 0xb8, 0xf1, 0x01, 0xf7, 0x99, 0xbd, 0x24, 0x69, 0x8b, 0xe1, 0x1f, 0x94, 0xb8, - 0xcf, 0xc6, 0x4e, 0xe0, 0x9f, 0x39, 0xf4, 0x03, 0xc3, 0xfa, 0x5a, 0x6d, 0xbd, 0x51, 0xb0, 0x92, - 0x8d, 0x77, 0xfd, 0xb3, 0x3d, 0xc4, 0x98, 0x1f, 0xc2, 0xd5, 0xf9, 0x21, 0x72, 0xd6, 0x61, 0x83, - 0xc6, 0xac, 0xcc, 0x8c, 0xb1, 0x09, 0x65, 0xbe, 0x05, 0x5d, 0x3d, 0x48, 0xa0, 0xd8, 0x35, 0xa5, - 0x20, 0xa4, 0x25, 0xb1, 0xbb, 0x06, 0xad, 0x20, 0x75, 0xd2, 0x20, 0x3a, 0xa5, 0xa3, 0x68, 0xd8, - 0xcd, 0x20, 0x3d, 0x0a, 0xa2, 0x53, 0xf3, 0x55, 0x30, 0x12, 0xe6, 0x49, 0x8c, 0x41, 0x98, 0x56, - 0xc2, 0x3c, 0x42, 0x5d, 0x03, 0x6c, 0x3a, 0x9e, 0x60, 0xea, 0x40, 0x36, 0x13, 0xe6, 0x6d, 0x0b, - 0x66, 0xa5, 0xd0, 0xd8, 0x67, 0xc9, 0x98, 0xe1, 0x99, 0xc4, 0x81, 0x47, 0x9e, 0x1b, 0x11, 0xdf, - 0x0d, 0x3b, 0xef, 0xa3, 0x46, 0x88, 0xdd, 0x44, 0x04, 0x6e, 0x48, 0xc7, 0xc0, 0xb0, 0x75, 0xd7, - 0x7c, 0x0d, 0xda, 0xa9, 0x70, 0x13, 0x81, 0x5f, 0x47, 0xe2, 0xdf, 0xb0, 0x0d, 0x02, 0xe0, 0x09, - 0xba, 0x06, 0x2d, 0x16, 0xf9, 0x84, 0xaa, 0xcb, 0x9d, 0x64, 0x91, 0xbf, 0xeb, 0x9f, 0x59, 0x7f, - 0x53, 0x81, 0xde, 0x7e, 0x16, 0x8a, 0x60, 0x2b, 0x19, 0x67, 0x6c, 0x1a, 0x09, 0xd4, 0x24, 0x3b, - 0x41, 0x2a, 0xd4, 0x2f, 0x53, 0xdb, 0x5c, 0x87, 0xf6, 0x8f, 0x13, 0x9e, 0xc5, 0x24, 0x41, 0x72, - 0xa7, 0xcb, 0x12, 0x54, 0x20, 0x51, 0xda, 0x1e, 0x25, 0x3e, 0x4b, 0xee, 0x9f, 0x13, 0x6d, 0xed, - 0x02, 0x6d, 0x19, 0x6d, 0xbe, 0x0e, 0xed, 0x23, 0x16, 0xbb, 0x89, 0x8b, 0x22, 0x50, 0x27, 0xf5, - 0x53, 0x00, 0xf0, 0x5b, 0x89, 0x78, 0xd7, 0x57, 0x87, 0x50, 0x77, 0xad, 0x31, 0xb4, 0xb7, 0xc6, - 0xe3, 0x84, 0x8d, 0x5d, 0x41, 0xaa, 0x90, 0xc7, 0xb4, 0xdc, 0x9a, 0x5d, 0xe5, 0x31, 0xa9, 0x5b, - 0xfc, 0x00, 0xc9, 0x1f, 0x6a, 0x9b, 0x6f, 0x42, 0x9d, 0x2d, 0x5e, 0x0f, 0xc1, 0xcd, 0xab, 0xd0, - 0xf4, 0x78, 0x34, 0x0a, 0xc6, 0x4a, 0x49, 0xab, 0x9e, 0xf5, 0x17, 0x35, 0x68, 0xd0, 0xc7, 0x21, - 0x7b, 0x51, 0x71, 0x3a, 0xec, 0xa9, 0x1b, 0xea, 0x5d, 0x41, 0xc0, 0x83, 0xa7, 0x6e, 0x68, 0xae, - 0x41, 0x03, 0xa7, 0x49, 0x17, 0xf0, 0x46, 0x22, 0xcc, 0xdb, 0xd0, 0x40, 0x21, 0x4a, 0x67, 0x57, - 0x80, 0x42, 0x74, 0xbf, 0xfe, 0x8b, 0x7f, 0xb9, 0xf1, 0x8a, 0x2d, 0xd1, 0xe6, 0xdb, 0x50, 0x77, - 0xc7, 0xe3, 0x94, 0x64, 0x79, 0xe6, 0x38, 0xe5, 0xdf, 0x6b, 0x13, 0x81, 0x79, 0x0f, 0xda, 0x72, - 0xdf, 0x90, 0xba, 0x41, 0xd4, 0xd7, 0x4a, 0x06, 0xa9, 0xbc, 0xa5, 0x76, 0x41, 0x89, 0x1c, 0x0f, - 0x52, 0x75, 0xe0, 0x49, 0xa2, 0x0d, 0xbb, 0x00, 0xa0, 0xc5, 0x88, 0x13, 0xb6, 0x15, 0x86, 0xdc, - 0x3b, 0x0a, 0x9e, 0x33, 0x65, 0x5f, 0x66, 0x60, 0xe6, 0x6d, 0xe8, 0x1f, 0x4a, 0x91, 0xb3, 0x59, - 0x9a, 0x85, 0x22, 0x55, 0x36, 0x67, 0x0e, 0x6a, 0x6e, 0x80, 0x39, 0x03, 0x39, 0xa6, 0xcf, 0x6f, - 0xaf, 0xd5, 0xd6, 0x7b, 0xf6, 0x02, 0x8c, 0xf9, 0x35, 0xe8, 0x8d, 0x91, 0xd3, 0x41, 0x34, 0x76, - 0x46, 0xa1, 0x8b, 0xe6, 0xa8, 0x86, 0xe6, 0x4a, 0x03, 0x1f, 0x86, 0xee, 0x98, 0x84, 0x3c, 0x0e, - 0xc2, 0xd0, 0x99, 0xb2, 0xe9, 0xb0, 0x43, 0x5b, 0x6e, 0x10, 0x60, 0x9f, 0x4d, 0xad, 0xbf, 0xac, - 0x43, 0x73, 0x37, 0x4a, 0x59, 0x22, 0xf0, 0x08, 0xb9, 0xa3, 0x11, 0xf3, 0x04, 0x93, 0xaa, 0xab, - 0x6e, 0xe7, 0x7d, 0x64, 0xc1, 0x31, 0xff, 0x34, 0x09, 0x04, 0x3b, 0xfa, 0x50, 0x09, 0x49, 0x01, - 0x30, 0xef, 0xc0, 0xb2, 0xeb, 0xfb, 0x8e, 0xa6, 0x76, 0x12, 0xfe, 0x2c, 0xa5, 0xe3, 0x64, 0xd8, - 0x4b, 0xae, 0xef, 0x6f, 0x29, 0xb8, 0xcd, 0x9f, 0xa5, 0xe6, 0x5b, 0x50, 0x4b, 0xd8, 0x88, 0x44, - 0xa6, 0xb3, 0xb9, 0x24, 0xb7, 0xf4, 0xd1, 0xc9, 0xe7, 0xcc, 0x13, 0x36, 0x1b, 0xd9, 0x88, 0x33, - 0xaf, 0x40, 0xc3, 0x15, 0x22, 0x91, 0x5b, 0xd4, 0xb6, 0x65, 0xc7, 0xdc, 0x80, 0x15, 0x3a, 0xb6, - 0x22, 0xe0, 0x91, 0x23, 0xdc, 0x93, 0x10, 0x6d, 0x6a, 0xaa, 0xcc, 0xc7, 0x72, 0x8e, 0x3a, 0x46, - 0xcc, 0xae, 0x9f, 0xa2, 0xc1, 0x99, 0xa7, 0x8f, 0xdc, 0x29, 0x4b, 0xc9, 0x7a, 0xb4, 0xed, 0x95, - 0xd9, 0x11, 0x07, 0x88, 0x42, 0x7e, 0x16, 0x63, 0xf0, 0xe0, 0x1b, 0x74, 0x86, 0xba, 0x39, 0x10, - 0xf5, 0xc2, 0x2a, 0x34, 0x83, 0xd4, 0x61, 0x91, 0xaf, 0x74, 0x51, 0x23, 0x48, 0x1f, 0x44, 0xbe, - 0xf9, 0x0e, 0xb4, 0xe5, 0xaf, 0xf8, 0x6c, 0x44, 0x6e, 0x41, 0x67, 0xb3, 0xaf, 0x24, 0x16, 0xc1, - 0x3b, 0x6c, 0x64, 0x1b, 0x42, 0xb5, 0xd0, 0x33, 0x10, 0xdc, 0x61, 0x67, 0x82, 0x25, 0x91, 0x1b, - 0xd2, 0xae, 0x18, 0x36, 0x08, 0xfe, 0x40, 0x41, 0xcc, 0x7b, 0x70, 0x4d, 0x63, 0x9d, 0x54, 0x4c, - 0x85, 0x93, 0x45, 0xc1, 0x99, 0x13, 0xb9, 0x11, 0x1f, 0x76, 0x69, 0x0b, 0xaf, 0x68, 0xf4, 0x91, - 0x98, 0x8a, 0xc7, 0x51, 0x70, 0x76, 0xe0, 0x46, 0xdc, 0x5c, 0x87, 0x41, 0x3e, 0x4c, 0x3c, 0xa7, - 0x0f, 0x1e, 0xf6, 0x48, 0x47, 0xf4, 0x35, 0xfc, 0xf8, 0x39, 0x7e, 0x2b, 0xaa, 0xf7, 0x32, 0x25, - 0x1f, 0x8d, 0x52, 0x26, 0x9c, 0x94, 0x79, 0xc3, 0x3e, 0x7d, 0xf3, 0x4a, 0x41, 0xff, 0x88, 0x70, - 0x47, 0xcc, 0xb3, 0x7e, 0xbf, 0x02, 0x1d, 0x3a, 0x17, 0x8f, 0x63, 0x1f, 0xd5, 0xc8, 0xd7, 0xa0, - 0x37, 0xbb, 0xe9, 0x52, 0x6e, 0xba, 0x6e, 0x79, 0xc7, 0xaf, 0x42, 0x73, 0xcb, 0x43, 0xe6, 0x91, - 0xe0, 0xf4, 0x6c, 0xd5, 0x33, 0xbf, 0x05, 0x4b, 0x19, 0x4d, 0xe3, 0x78, 0xe2, 0xcc, 0x09, 0x51, - 0xfd, 0xc8, 0x83, 0xae, 0xa4, 0x42, 0xfe, 0xc6, 0xb6, 0x38, 0xb3, 0x7b, 0x99, 0x6e, 0xee, 0x05, - 0xa9, 0xb0, 0xde, 0x80, 0xc6, 0x56, 0x92, 0xb8, 0xe7, 0x24, 0x28, 0xd8, 0x18, 0x56, 0xc8, 0x22, - 0xc9, 0x8e, 0xe5, 0x41, 0x6d, 0xdf, 0x8d, 0xcd, 0x5b, 0x50, 0x9d, 0xc6, 0x84, 0xe9, 0x6c, 0xae, - 0x96, 0x4e, 0xb9, 0x1b, 0x6f, 0xec, 0xc7, 0x0f, 0x22, 0x91, 0x9c, 0xdb, 0xd5, 0x69, 0x7c, 0xfd, - 0x1e, 0xb4, 0x54, 0x17, 0xbd, 0xd0, 0x53, 0x76, 0x4e, 0xdf, 0xd0, 0xb6, 0xb1, 0x89, 0x3f, 0xf0, - 0xd4, 0x0d, 0x33, 0xed, 0x3e, 0xc9, 0xce, 0x77, 0xaa, 0x1f, 0x55, 0xac, 0xff, 0xac, 0x83, 0xb1, - 0xc3, 0x42, 0x46, 0x5f, 0x62, 0x41, 0xb7, 0x2c, 0xe3, 0x9a, 0x0b, 0x33, 0x72, 0x6f, 0x41, 0x57, - 0xda, 0x48, 0x1a, 0xc5, 0xd4, 0x21, 0x9a, 0x81, 0xa1, 0xf2, 0xde, 0xbd, 0x9f, 0x79, 0xa7, 0x4c, - 0xd0, 0xe9, 0xe9, 0xd9, 0xba, 0x8b, 0x98, 0x03, 0x85, 0xa9, 0x4b, 0x8c, 0xea, 0x9a, 0xaf, 0x03, - 0x24, 0xfc, 0x99, 0x13, 0x48, 0x43, 0x25, 0x75, 0xbe, 0x91, 0xf0, 0x67, 0xbb, 0x68, 0xaa, 0x7e, - 0x2d, 0x87, 0xe6, 0x5b, 0x30, 0x2c, 0x1d, 0x1a, 0x74, 0x57, 0x9d, 0x20, 0x72, 0x4e, 0xd0, 0x1b, - 0x52, 0xe7, 0xa7, 0x98, 0x93, 0xbc, 0xd9, 0xdd, 0xe8, 0x3e, 0xb9, 0x4a, 0x4a, 0x15, 0xb4, 0x5f, - 0xa0, 0x0a, 0x16, 0x6a, 0x16, 0x58, 0xac, 0x59, 0xee, 0x03, 0x1c, 0xb1, 0xf1, 0x94, 0x45, 0x62, - 0xdf, 0x8d, 0x87, 0x1d, 0xda, 0x78, 0xab, 0xd8, 0x78, 0xbd, 0x5b, 0x1b, 0x05, 0x91, 0x94, 0x82, - 0xd2, 0x28, 0xf4, 0x5f, 0x3c, 0x37, 0x72, 0x44, 0x92, 0x45, 0x9e, 0x2b, 0x18, 0x9d, 0x35, 0xc3, - 0xee, 0x78, 0x6e, 0x74, 0xac, 0x40, 0xa5, 0xe3, 0xdf, 0x2b, 0x1f, 0xff, 0xdb, 0xb0, 0x14, 0x27, - 0xc1, 0xd4, 0x4d, 0xce, 0x9d, 0x53, 0x76, 0x4e, 0x9b, 0x21, 0x0f, 0x52, 0x4f, 0x81, 0x3f, 0x61, - 0xe7, 0xbb, 0xfe, 0xd9, 0xf5, 0xef, 0xc3, 0xd2, 0xdc, 0x02, 0x5e, 0x4a, 0xee, 0x7e, 0x5a, 0x83, - 0xf6, 0x61, 0xc2, 0x94, 0xca, 0xbe, 0x01, 0x9d, 0xd4, 0x9b, 0xb0, 0xa9, 0x2b, 0x4f, 0xba, 0x9c, - 0x01, 0x24, 0x88, 0x4e, 0xf9, 0x8c, 0x52, 0xaa, 0x7e, 0x81, 0x52, 0x1a, 0x40, 0x4d, 0xfa, 0x41, - 0x78, 0x98, 0xb0, 0x59, 0x68, 0xe2, 0x7a, 0x59, 0x13, 0xaf, 0x41, 0x77, 0xe2, 0xa6, 0x8e, 0x9b, - 0x09, 0xee, 0x78, 0x3c, 0x24, 0xa1, 0x33, 0x6c, 0x98, 0xb8, 0xe9, 0x56, 0x26, 0xf8, 0x36, 0x0f, - 0xcd, 0x37, 0x00, 0x3c, 0x1e, 0x2a, 0xa5, 0xa2, 0x9c, 0xc0, 0xb6, 0xc7, 0x43, 0xa9, 0x49, 0x50, - 0x2a, 0x59, 0x2a, 0x82, 0xa9, 0xab, 0xb6, 0xd4, 0xf1, 0x78, 0x16, 0x09, 0xb2, 0x9c, 0x35, 0x7b, - 0x39, 0x47, 0xd9, 0xfc, 0xd9, 0x36, 0x22, 0xcc, 0xf7, 0xa1, 0xef, 0xf1, 0x69, 0xec, 0xc4, 0xc8, - 0x59, 0xf2, 0x49, 0x8c, 0x0b, 0x1e, 0x79, 0x17, 0x29, 0x0e, 0x4f, 0x99, 0x74, 0x92, 0x36, 0x61, - 0xc9, 0x0b, 0xb3, 0x54, 0xb0, 0xc4, 0x39, 0x51, 0x43, 0x2e, 0x3a, 0xf1, 0x3d, 0x45, 0xa2, 0x1c, - 0x2b, 0x0b, 0x7a, 0x41, 0xea, 0xf0, 0xd0, 0x77, 0xa4, 0xba, 0x51, 0x72, 0xd6, 0x09, 0xd2, 0x47, - 0xa1, 0xaf, 0x14, 0x9e, 0xa4, 0x89, 0xd8, 0x33, 0x4d, 0xd3, 0xd1, 0x34, 0x07, 0xec, 0x99, 0xa4, - 0xb1, 0xfe, 0xa9, 0x0a, 0xad, 0x43, 0x9e, 0x8a, 0x9d, 0x69, 0xa8, 0x45, 0xbc, 0xf2, 0xb2, 0x22, - 0x5e, 0x5d, 0x2c, 0xe2, 0x0b, 0x84, 0xac, 0xb6, 0x40, 0xc8, 0xd0, 0x0c, 0x94, 0xe9, 0x48, 0x38, - 0xa4, 0xab, 0xd8, 0x2f, 0x08, 0x49, 0x40, 0x5e, 0x43, 0xdf, 0xc6, 0xf1, 0xa5, 0x4e, 0x92, 0x1b, - 0x69, 0x04, 0xa9, 0xd2, 0x47, 0x12, 0x19, 0x90, 0xac, 0x29, 0xc7, 0xc7, 0x08, 0x52, 0x25, 0x7b, - 0xdf, 0x86, 0x57, 0xf3, 0x91, 0xce, 0xb3, 0x40, 0x4c, 0x78, 0x26, 0x9c, 0x11, 0xc5, 0x50, 0xa9, - 0xf2, 0xec, 0xaf, 0xea, 0x99, 0x3e, 0x95, 0x68, 0x19, 0x61, 0x91, 0x1f, 0x36, 0xca, 0xc2, 0xd0, - 0x11, 0xec, 0x4c, 0xa8, 0xad, 0x1c, 0x4a, 0xde, 0x28, 0xbe, 0x3d, 0xcc, 0xc2, 0xf0, 0x98, 0x9d, - 0x09, 0x54, 0xfe, 0xc6, 0x48, 0x75, 0xac, 0x3f, 0xaa, 0x03, 0xec, 0x71, 0xef, 0xf4, 0xd8, 0x4d, - 0xc6, 0x4c, 0x60, 0xbc, 0xa0, 0x35, 0x9a, 0xd2, 0xb8, 0x2d, 0x21, 0xf5, 0x98, 0xb9, 0x09, 0x57, - 0xf5, 0xf7, 0xa3, 0x1c, 0x62, 0xec, 0x22, 0x55, 0x92, 0x3a, 0x50, 0xa6, 0xc2, 0xca, 0x58, 0x99, - 0xf4, 0x91, 0xf9, 0x51, 0xc1, 0x5b, 0x1c, 0x23, 0xce, 0x63, 0xe2, 0xed, 0x22, 0xbf, 0xb3, 0x57, - 0x0c, 0x3f, 0x3e, 0x8f, 0xcd, 0xf7, 0x61, 0x35, 0x61, 0xa3, 0x84, 0xa5, 0x13, 0x47, 0xa4, 0xe5, - 0x1f, 0x93, 0x61, 0xc3, 0xb2, 0x42, 0x1e, 0xa7, 0xf9, 0x6f, 0xbd, 0x0f, 0xab, 0x92, 0x53, 0xf3, - 0xcb, 0x93, 0xfa, 0x7b, 0x59, 0x22, 0xcb, 0xab, 0x7b, 0x03, 0x28, 0x57, 0x23, 0x75, 0xb2, 0x76, - 0x42, 0x43, 0x62, 0xc6, 0x49, 0xc8, 0xd0, 0x3f, 0xdb, 0x9e, 0x60, 0x1c, 0xbc, 0xc3, 0x46, 0x8a, - 0xf9, 0x05, 0xc0, 0xb4, 0xa0, 0xbe, 0xcf, 0x7d, 0x46, 0xac, 0xee, 0x6f, 0xf6, 0x37, 0x28, 0xeb, - 0x83, 0x9c, 0x44, 0xa8, 0x4d, 0x38, 0xf3, 0x6d, 0xa0, 0xe9, 0xa4, 0xf8, 0x5d, 0x3c, 0x2b, 0x06, - 0x22, 0x49, 0x06, 0xdf, 0x87, 0xd5, 0x62, 0x25, 0x8e, 0x2b, 0x1c, 0x31, 0x61, 0xa4, 0x0e, 0xe5, - 0x71, 0x59, 0xce, 0x17, 0xb5, 0x25, 0x8e, 0x27, 0x0c, 0x55, 0xe3, 0x3a, 0xb4, 0xf8, 0xc9, 0xe7, - 0x0e, 0x1e, 0x84, 0xce, 0xe2, 0x83, 0xd0, 0xe4, 0x27, 0x9f, 0xdb, 0x6c, 0x64, 0x7e, 0xb3, 0x6c, - 0x4a, 0xe6, 0x58, 0xd3, 0x25, 0xd6, 0x5c, 0xc9, 0xf1, 0x25, 0xee, 0x58, 0x1f, 0x41, 0x13, 0x3f, - 0xe7, 0x51, 0x6c, 0x6e, 0x40, 0x4b, 0x90, 0x78, 0xa4, 0xca, 0xf4, 0x5f, 0x29, 0x2c, 0x40, 0x21, - 0x3b, 0xb6, 0x26, 0xb2, 0x6c, 0x58, 0xca, 0xd5, 0xe9, 0xe3, 0x28, 0x78, 0x92, 0x31, 0xf3, 0x87, - 0xb0, 0x1c, 0x27, 0x4c, 0x89, 0xbd, 0x93, 0x9d, 0xa2, 0x7b, 0xa2, 0x4e, 0xf0, 0x15, 0x25, 0xa5, - 0xf9, 0x88, 0x53, 0x94, 0xd0, 0x7e, 0x3c, 0xd3, 0xb7, 0x3e, 0x83, 0x6b, 0x39, 0xc5, 0x11, 0xf3, - 0x78, 0xe4, 0xbb, 0xc9, 0x39, 0x59, 0xbe, 0xb9, 0xb9, 0xd3, 0x97, 0x99, 0xfb, 0x88, 0xe6, 0xfe, - 0xd3, 0x1a, 0xf4, 0x1f, 0x45, 0x3b, 0x59, 0x1c, 0x06, 0x68, 0x8d, 0x3e, 0x91, 0xc6, 0x42, 0x2a, - 0xe9, 0x4a, 0x59, 0x49, 0xaf, 0xc3, 0x40, 0xfd, 0x0a, 0xf2, 0x51, 0x2a, 0x58, 0x95, 0x5b, 0x92, - 0xf0, 0x6d, 0x1e, 0x4a, 0xed, 0xfa, 0x7d, 0x58, 0xcd, 0xe8, 0xcb, 0x25, 0xe5, 0x84, 0x79, 0xa7, - 0xce, 0x25, 0x81, 0x9f, 0x29, 0x09, 0x71, 0x28, 0x92, 0x91, 0xda, 0xbc, 0x01, 0x9d, 0x62, 0xb8, - 0xb6, 0x14, 0x90, 0x13, 0xd2, 0x4a, 0x78, 0xe4, 0xf8, 0x7a, 0xc9, 0xca, 0x4f, 0x41, 0x1b, 0xd3, - 0xe7, 0xc5, 0x97, 0xa0, 0xda, 0xfa, 0x1d, 0x58, 0x9e, 0xa1, 0xa4, 0x55, 0x34, 0x69, 0x15, 0xef, - 0x15, 0xdb, 0x38, 0xfb, 0xf9, 0xe5, 0x2e, 0xae, 0x47, 0xda, 0xf4, 0x25, 0x3e, 0x0b, 0xd5, 0xaa, - 0x6c, 0x1c, 0xf1, 0x84, 0xa9, 0x03, 0x82, 0xaa, 0x8c, 0xfa, 0xd7, 0x0f, 0xe0, 0xca, 0xa2, 0x59, - 0x16, 0x18, 0xe6, 0xb5, 0xb2, 0x61, 0x9e, 0x0b, 0x5a, 0x0b, 0x23, 0xfd, 0xe7, 0x15, 0xe8, 0x3c, - 0xcc, 0x9e, 0x3f, 0x3f, 0x97, 0x0a, 0xcf, 0xec, 0x42, 0xe5, 0x80, 0x66, 0xa9, 0xda, 0x95, 0x03, - 0xf4, 0x87, 0x0f, 0x4f, 0x51, 0xf9, 0xd2, 0x24, 0x6d, 0x5b, 0xf5, 0x30, 0xdc, 0x3d, 0x3c, 0x3d, - 0x7e, 0x81, 0xda, 0x91, 0x68, 0x8c, 0xd3, 0xee, 0x67, 0x41, 0x88, 0xfe, 0x9d, 0xd2, 0x30, 0x79, - 0x1f, 0x03, 0xc8, 0xdd, 0x91, 0x94, 0x97, 0x87, 0x09, 0x9f, 0x4a, 0x89, 0x56, 0x7a, 0x7d, 0x01, - 0xc6, 0xfa, 0x55, 0x1d, 0x8c, 0x8f, 0xdd, 0x74, 0xf2, 0x13, 0x1e, 0x44, 0xe6, 0xfb, 0xd0, 0xfe, - 0x9c, 0x07, 0x91, 0xcc, 0xdc, 0xc8, 0x9c, 0xee, 0x8a, 0x5c, 0xc4, 0x01, 0xf7, 0xd9, 0x06, 0xd2, - 0xe0, 0x6a, 0x6c, 0xe3, 0x73, 0xd5, 0x52, 0xe6, 0x30, 0x09, 0xc6, 0x13, 0xe1, 0x20, 0x50, 0xd9, - 0xad, 0x4e, 0x90, 0xda, 0x08, 0xa3, 0x59, 0x5f, 0x07, 0xf4, 0x0c, 0x26, 0x0e, 0x8f, 0x9c, 0xf8, - 0x54, 0x45, 0x85, 0x06, 0x42, 0x1e, 0x45, 0x87, 0xa7, 0xa8, 0xd7, 0x82, 0xd4, 0x51, 0xf9, 0x21, - 0xfa, 0x9c, 0x99, 0xe0, 0xfa, 0x26, 0xf4, 0xd1, 0x1f, 0x4b, 0x4f, 0x83, 0xd8, 0x89, 0x13, 0x7e, - 0xa2, 0xbf, 0x05, 0xbd, 0xb4, 0xa3, 0xd3, 0x20, 0x3e, 0x44, 0x18, 0xb9, 0x41, 0x2a, 0xeb, 0x84, - 0xc2, 0x25, 0xfd, 0x0d, 0x50, 0x20, 0x64, 0x0b, 0xa5, 0x96, 0x42, 0x19, 0x63, 0xb4, 0x48, 0xf4, - 0x5a, 0x09, 0x0b, 0x31, 0x98, 0x40, 0x14, 0x8a, 0x3d, 0xa1, 0x0c, 0x89, 0xf2, 0xb8, 0x44, 0x7d, - 0x1d, 0x20, 0x64, 0x23, 0x3c, 0x40, 0x91, 0x2f, 0xa3, 0xf0, 0xb9, 0x14, 0x0e, 0x62, 0xb7, 0x11, - 0x69, 0xbe, 0x03, 0x1d, 0xc9, 0x05, 0x49, 0x0b, 0x17, 0x68, 0x81, 0xd0, 0x92, 0xf8, 0x0e, 0x74, - 0x22, 0x1e, 0x39, 0xec, 0x09, 0x51, 0x2b, 0x9d, 0x38, 0x33, 0x71, 0xc4, 0xa3, 0x07, 0x4f, 0x90, - 0xd8, 0xbc, 0xab, 0xd6, 0x20, 0x13, 0x21, 0xdd, 0x4b, 0x12, 0x21, 0xb4, 0x12, 0x99, 0x12, 0xf8, - 0x40, 0xaf, 0x44, 0x8e, 0xe8, 0x5d, 0x32, 0x42, 0xae, 0x47, 0x0e, 0x59, 0x83, 0x2e, 0xed, 0xfb, - 0xd4, 0x8d, 0x1d, 0xe1, 0x8e, 0x95, 0xdf, 0x0a, 0x08, 0xdb, 0x77, 0xe3, 0x63, 0x77, 0x6c, 0xda, - 0xf0, 0xaa, 0x4a, 0x92, 0x2a, 0x0b, 0xef, 0x9c, 0xa0, 0xc4, 0x49, 0xae, 0x2d, 0xe9, 0x44, 0xca, - 0xe2, 0xf4, 0xea, 0xd5, 0x99, 0xf4, 0x2a, 0x49, 0x2a, 0x45, 0x71, 0x7f, 0x56, 0x05, 0x63, 0x8f, - 0xf3, 0xf8, 0x2b, 0x8a, 0x5e, 0x79, 0x4b, 0xab, 0x97, 0x6f, 0x69, 0x6d, 0x76, 0x4b, 0xe7, 0x58, - 0x5f, 0xff, 0xf2, 0xac, 0x6f, 0xbc, 0x34, 0xeb, 0x9b, 0x5f, 0x81, 0xf5, 0xad, 0x79, 0xd6, 0x5b, - 0x2d, 0x68, 0x1c, 0x31, 0xf1, 0x28, 0xb6, 0x7e, 0x6e, 0x40, 0x7b, 0x87, 0xf9, 0x99, 0x64, 0x58, - 0xf9, 0xf3, 0x2b, 0x97, 0x7f, 0x7e, 0x75, 0xf6, 0xf3, 0xd1, 0xc8, 0x6b, 0x89, 0x5e, 0xa0, 0xde, - 0x0d, 0x2d, 0xd0, 0x28, 0xfa, 0x85, 0x3c, 0xab, 0xc4, 0xda, 0x0c, 0x9b, 0x72, 0x71, 0x7e, 0xb1, - 0x6c, 0x34, 0xbe, 0x92, 0x6c, 0xcc, 0x69, 0x85, 0x0b, 0x29, 0xb7, 0x2f, 0xe4, 0xda, 0xbc, 0x46, - 0x30, 0x2e, 0x68, 0x84, 0x3d, 0x58, 0x99, 0x31, 0x35, 0xae, 0xcc, 0x50, 0xb4, 0x49, 0xf4, 0x5e, - 0x2f, 0x89, 0x5e, 0xc9, 0x30, 0xc8, 0xbc, 0x85, 0xbd, 0xcc, 0xe7, 0x41, 0xa8, 0xa6, 0x7c, 0xdc, - 0x1a, 0xb2, 0xa0, 0xe4, 0x6d, 0xcb, 0xba, 0x50, 0x97, 0xa0, 0xdb, 0x3c, 0x24, 0x05, 0xff, 0x11, - 0x2c, 0x15, 0x54, 0x52, 0x46, 0x3a, 0x97, 0xc8, 0x48, 0x4f, 0x0f, 0x94, 0x62, 0xf2, 0xeb, 0xd0, - 0x02, 0xef, 0xc1, 0x8a, 0x4e, 0xc7, 0x28, 0xc7, 0x8b, 0x76, 0xb0, 0x4f, 0x12, 0x34, 0x50, 0x19, - 0x18, 0xf2, 0xb9, 0x68, 0x8b, 0xbe, 0x0b, 0x57, 0x4a, 0xe4, 0x68, 0xa9, 0xcb, 0xda, 0xa0, 0x2c, - 0x2b, 0xcb, 0xf9, 0x58, 0xec, 0xee, 0xc9, 0xd4, 0x72, 0xc7, 0x67, 0xa1, 0xfe, 0xa1, 0xe1, 0x40, - 0x06, 0x88, 0x3e, 0x0b, 0x55, 0xf1, 0x6a, 0x1f, 0x6e, 0x62, 0x1c, 0x46, 0xfe, 0x88, 0x1b, 0x8b, - 0x2c, 0x61, 0x4e, 0x1c, 0xba, 0x1e, 0x9b, 0xf0, 0xd0, 0x67, 0x49, 0xb1, 0xb8, 0x65, 0x5a, 0xdc, - 0x0d, 0x1e, 0xfa, 0xe8, 0x92, 0x48, 0xca, 0xc3, 0x82, 0x50, 0xaf, 0x75, 0x0b, 0xde, 0xbc, 0x30, - 0x1d, 0x1a, 0x8e, 0x62, 0x22, 0x93, 0x26, 0x7a, 0x75, 0x76, 0x22, 0x24, 0xd1, 0x53, 0x7c, 0x00, - 0xab, 0x72, 0xef, 0xa4, 0x70, 0x9f, 0x32, 0x16, 0x3b, 0xa1, 0x9b, 0x8a, 0xe1, 0x8a, 0xb4, 0xad, - 0x84, 0x24, 0x01, 0xfe, 0x84, 0xb1, 0x78, 0xcf, 0x95, 0xbf, 0x2a, 0x87, 0xa8, 0x18, 0x89, 0xc6, - 0xcc, 0xf0, 0xf6, 0x8a, 0xfc, 0x55, 0xa2, 0x92, 0x81, 0x12, 0x0e, 0x2e, 0x31, 0xf9, 0x7b, 0xf0, - 0xda, 0xcc, 0x14, 0x53, 0x37, 0x39, 0x2d, 0x82, 0x86, 0xe1, 0x2a, 0xf1, 0xed, 0x5a, 0x69, 0xfc, - 0x3e, 0x11, 0xc8, 0x19, 0xac, 0xff, 0x68, 0x40, 0x9f, 0xec, 0xf0, 0x6f, 0xd4, 0xc6, 0x6f, 0xd4, - 0xc6, 0xff, 0x03, 0xb5, 0x61, 0xfd, 0x5e, 0x05, 0x5a, 0x87, 0x09, 0xf7, 0x33, 0x4f, 0x7c, 0x45, - 0x49, 0x9f, 0x95, 0xa0, 0xda, 0x17, 0x49, 0x50, 0xfd, 0x82, 0xb9, 0xfe, 0x59, 0x05, 0xda, 0x6a, - 0x09, 0x7b, 0x9b, 0x5f, 0x71, 0x11, 0x45, 0xe1, 0xad, 0xb2, 0xb0, 0xf0, 0xf6, 0x85, 0xab, 0x40, - 0xc1, 0x7a, 0x2a, 0x2f, 0x15, 0xf0, 0x58, 0xfa, 0x54, 0x0d, 0x29, 0x58, 0x12, 0xfa, 0x28, 0xc6, - 0xbd, 0xb3, 0x9e, 0x41, 0x9b, 0xa2, 0x52, 0xd2, 0x0c, 0x57, 0xa1, 0x99, 0x50, 0x65, 0x49, 0x2d, - 0x54, 0xf5, 0x5e, 0x7c, 0x4e, 0xab, 0x5f, 0xcd, 0xf5, 0xfb, 0xeb, 0x0a, 0xf4, 0x28, 0x45, 0xf0, - 0x30, 0x8b, 0xe4, 0x49, 0x58, 0x1c, 0xc3, 0xae, 0x41, 0x3d, 0xc1, 0x48, 0x5e, 0xfe, 0x4c, 0x57, - 0xfe, 0xcc, 0x36, 0x0f, 0x77, 0xd8, 0xc8, 0x26, 0x0c, 0xb2, 0xca, 0x4d, 0xc6, 0xe9, 0xa2, 0x1a, - 0x25, 0xc2, 0xf1, 0xab, 0x62, 0x37, 0x71, 0xa7, 0xa9, 0xae, 0x51, 0xca, 0x9e, 0x69, 0x42, 0x9d, - 0xce, 0x9b, 0x64, 0x0b, 0xb5, 0x55, 0x88, 0x98, 0x06, 0xd1, 0x38, 0x57, 0x1e, 0x06, 0x95, 0xa6, - 0xc7, 0x21, 0xb3, 0xb6, 0x60, 0x55, 0xd7, 0x66, 0xf0, 0x50, 0x6e, 0xa2, 0xc4, 0x51, 0x44, 0xaf, - 0x67, 0xaa, 0x94, 0x66, 0xba, 0x02, 0x8d, 0xf2, 0x65, 0x0e, 0xd9, 0xb1, 0x6e, 0x41, 0x67, 0x14, - 0x84, 0x4c, 0x65, 0x45, 0x71, 0x69, 0x2a, 0x3f, 0x5a, 0xa1, 0xeb, 0x0c, 0xaa, 0x67, 0xfd, 0x6d, - 0x05, 0xae, 0xc5, 0x6e, 0xf2, 0x24, 0x63, 0x82, 0x72, 0xa3, 0x54, 0xcb, 0x73, 0xd2, 0x89, 0x9b, - 0xf8, 0x28, 0x9e, 0x34, 0x85, 0x9c, 0x5d, 0xde, 0x2f, 0x68, 0x23, 0x44, 0xae, 0xe5, 0x36, 0x2c, - 0x95, 0x46, 0x08, 0x37, 0xd1, 0x21, 0x7f, 0x2f, 0xe1, 0xcf, 0xa8, 0x24, 0x7b, 0x84, 0x40, 0x0c, - 0xdb, 0x0a, 0x3a, 0x46, 0x3a, 0x9d, 0xca, 0xf4, 0x9a, 0xea, 0x41, 0xe4, 0xa3, 0x7c, 0x46, 0xd9, - 0x54, 0xa6, 0x83, 0xe4, 0x95, 0x8f, 0x56, 0x94, 0x4d, 0x29, 0x03, 0x74, 0x05, 0x1a, 0x27, 0xe7, - 0x82, 0x7c, 0x62, 0x84, 0xcb, 0x8e, 0xf5, 0xcf, 0x75, 0xe8, 0x6a, 0x16, 0x51, 0xd9, 0xfd, 0xdd, - 0xf2, 0x9e, 0x76, 0x36, 0x07, 0x7a, 0x73, 0x90, 0x64, 0x4b, 0x88, 0x44, 0x47, 0xb5, 0x72, 0xaf, - 0x5f, 0x03, 0xfa, 0x10, 0x27, 0x0d, 0x9e, 0x33, 0xda, 0xf0, 0x9a, 0x6d, 0x20, 0x80, 0xea, 0xa7, - 0x5b, 0xb0, 0x5c, 0x62, 0x9d, 0x23, 0xb8, 0x70, 0x43, 0xb5, 0xe7, 0xa5, 0xd2, 0x4e, 0x89, 0xc4, - 0x5e, 0xc2, 0x8e, 0x4c, 0x37, 0x1f, 0x23, 0x35, 0xca, 0x52, 0x9e, 0x9f, 0xb8, 0x20, 0x4b, 0x88, - 0xa1, 0xa4, 0x75, 0xc2, 0x50, 0x35, 0xa5, 0x4f, 0x42, 0x25, 0x19, 0x6d, 0x09, 0x39, 0x7a, 0x12, - 0xe6, 0x0b, 0x24, 0xc1, 0x6f, 0x92, 0x98, 0xd2, 0x02, 0xe9, 0xc8, 0xbe, 0x07, 0x1d, 0x9e, 0x04, - 0xe3, 0x20, 0x92, 0x49, 0x90, 0xd6, 0x82, 0x1f, 0x01, 0x49, 0x40, 0x29, 0x11, 0x0b, 0x9a, 0xf2, - 0x30, 0x2d, 0x48, 0x64, 0x2b, 0x0c, 0x6e, 0x66, 0x2a, 0x92, 0xc0, 0x13, 0xb8, 0x1c, 0x67, 0xca, - 0x7d, 0x7d, 0xf7, 0xa1, 0x27, 0xc1, 0x47, 0x4f, 0x42, 0x4a, 0xdc, 0xdd, 0x86, 0x25, 0x8f, 0x87, - 0xd9, 0x34, 0xa2, 0x95, 0x39, 0x21, 0x8b, 0xc8, 0x8a, 0x34, 0xec, 0x9e, 0x04, 0xe3, 0xfa, 0xf6, - 0x58, 0xa4, 0x6a, 0x9b, 0x6e, 0x18, 0xa2, 0x42, 0xe2, 0xae, 0xaf, 0x52, 0xd7, 0x5d, 0x0d, 0xdc, - 0xe3, 0xae, 0x6f, 0x7e, 0x07, 0xae, 0x23, 0xce, 0x61, 0xd3, 0x58, 0x9c, 0x3b, 0x51, 0x36, 0x65, - 0x49, 0xe0, 0x39, 0x6e, 0xea, 0x3c, 0x67, 0x09, 0x57, 0xd5, 0x90, 0xab, 0x48, 0xf1, 0x00, 0x09, - 0x0e, 0x24, 0x7e, 0x2b, 0xfd, 0x8c, 0x25, 0xdc, 0xfc, 0x8c, 0x92, 0x77, 0x8b, 0xe4, 0x56, 0x5b, - 0x92, 0xb7, 0x8a, 0xbd, 0xba, 0x84, 0x92, 0x4a, 0x45, 0x88, 0xb0, 0xb5, 0xc0, 0xd2, 0x78, 0xcb, - 0x03, 0x38, 0x12, 0x09, 0x73, 0xa7, 0x24, 0x59, 0x6f, 0x43, 0x4b, 0x9c, 0x84, 0x54, 0xd3, 0xa8, - 0x2c, 0xac, 0x69, 0x34, 0xc5, 0x09, 0xf2, 0xbc, 0x74, 0xc6, 0xaa, 0x24, 0xaa, 0xaa, 0x87, 0x12, - 0x1c, 0x06, 0xd3, 0x40, 0xa8, 0x2b, 0x4f, 0xb2, 0x63, 0x9d, 0x40, 0x9b, 0x66, 0xa0, 0xdf, 0xc8, - 0x2f, 0x1f, 0x54, 0x5e, 0x7c, 0xf9, 0xe0, 0x3d, 0xe8, 0x2a, 0xbd, 0x78, 0xd9, 0x6d, 0x86, 0x8e, - 0xc4, 0x63, 0x3b, 0xb5, 0xde, 0x85, 0xf6, 0x6f, 0xbb, 0x61, 0x26, 0x7f, 0xe3, 0x06, 0x74, 0xa8, - 0x4c, 0xe6, 0x9c, 0x84, 0xdc, 0x3b, 0xd5, 0xe5, 0x1b, 0x02, 0xdd, 0x47, 0x88, 0x05, 0x60, 0x3c, - 0x8e, 0x02, 0x1e, 0x6d, 0x85, 0xa1, 0xf5, 0xf7, 0x4d, 0x68, 0x7f, 0xec, 0xa6, 0x13, 0x52, 0xa3, - 0x78, 0x84, 0xe9, 0x6a, 0x05, 0xa5, 0x56, 0xa6, 0x6e, 0xac, 0xae, 0x57, 0x74, 0x10, 0x88, 0x54, - 0xfb, 0x6e, 0x3c, 0x97, 0x79, 0xa9, 0xce, 0x65, 0x5e, 0xde, 0x92, 0x37, 0xdd, 0x64, 0xa1, 0x8e, - 0xe9, 0x7a, 0x3d, 0x4d, 0x70, 0x5f, 0x82, 0xcc, 0x77, 0xc1, 0x24, 0x12, 0x37, 0x0c, 0x39, 0xb9, - 0x3b, 0x29, 0x0b, 0x53, 0x95, 0xa4, 0x19, 0x20, 0x66, 0x4b, 0x21, 0x8e, 0x98, 0x3c, 0x3f, 0x25, - 0xdb, 0xd9, 0x98, 0xb7, 0x9d, 0x77, 0x00, 0xd0, 0x2b, 0xa4, 0xdc, 0xed, 0x5c, 0x70, 0x2c, 0x33, - 0x24, 0x05, 0xf6, 0x4b, 0x78, 0x6a, 0x6f, 0xc3, 0x20, 0xa7, 0x48, 0xd8, 0xc8, 0xf1, 0x22, 0xa1, - 0xdc, 0xb5, 0x9e, 0xa2, 0xb2, 0xd9, 0x68, 0x3b, 0x12, 0xf3, 0x2e, 0x5d, 0xfb, 0x82, 0x4b, 0xf7, - 0x63, 0x58, 0x99, 0x33, 0x70, 0x69, 0xcc, 0x3c, 0x55, 0xc1, 0x7f, 0x99, 0x4b, 0x63, 0xaf, 0x82, - 0x41, 0x05, 0x11, 0x3f, 0x8b, 0xd5, 0xd9, 0x6a, 0x05, 0x29, 0xb9, 0xde, 0x97, 0xb9, 0x8d, 0xdd, - 0xff, 0x2b, 0xb7, 0xb1, 0xf7, 0xe5, 0xdc, 0xc6, 0xfe, 0x97, 0x73, 0x1b, 0xe7, 0xdc, 0xac, 0xa5, - 0xf9, 0xe8, 0xec, 0xd2, 0x58, 0x68, 0x70, 0x69, 0x2c, 0xf4, 0x05, 0x81, 0xcc, 0xf2, 0x0b, 0x03, - 0x99, 0x2f, 0x11, 0x49, 0x99, 0x5f, 0x10, 0x49, 0x59, 0x8f, 0x01, 0xc8, 0x46, 0xd2, 0x92, 0x2f, - 0xdb, 0xf3, 0xca, 0xcb, 0xee, 0xb9, 0xf5, 0xdf, 0x15, 0x80, 0x23, 0x77, 0x1a, 0x4b, 0x57, 0xc6, - 0xfc, 0x11, 0x74, 0x52, 0xea, 0x95, 0x13, 0x59, 0x37, 0x4a, 0xf7, 0x62, 0x73, 0x52, 0xd5, 0xa4, - 0xa4, 0x16, 0xa4, 0x79, 0x9b, 0xc4, 0x55, 0xce, 0x90, 0xd7, 0x01, 0x1b, 0x9a, 0x80, 0x8c, 0xef, - 0x2d, 0xe8, 0x2b, 0x82, 0x98, 0x25, 0x1e, 0x8b, 0xa4, 0x0e, 0xab, 0xd8, 0x3d, 0x09, 0x3d, 0x94, - 0x40, 0xf3, 0x83, 0x9c, 0x4c, 0x5a, 0x81, 0x74, 0x41, 0x34, 0xa6, 0x86, 0x6c, 0x4b, 0x02, 0x6b, - 0x53, 0x7f, 0x0a, 0x2d, 0xc4, 0x80, 0x3a, 0xfe, 0xde, 0xe0, 0x15, 0xb3, 0x03, 0x2d, 0x35, 0xeb, - 0xa0, 0x62, 0xf6, 0xa0, 0x4d, 0x17, 0xee, 0x08, 0x57, 0xb5, 0xfe, 0x61, 0x19, 0x3a, 0xbb, 0x51, - 0x2a, 0x92, 0x4c, 0x8a, 0x66, 0x71, 0xaf, 0xac, 0x41, 0xf7, 0xca, 0x54, 0x49, 0x59, 0x7e, 0x06, - 0x95, 0x94, 0xdf, 0x83, 0x96, 0xba, 0xc1, 0xa8, 0xfc, 0xdb, 0x85, 0xd7, 0x1f, 0x35, 0x8d, 0xb9, - 0x01, 0x86, 0xaf, 0xae, 0x56, 0xaa, 0x6c, 0x5d, 0xe9, 0xbe, 0xa3, 0xbe, 0x74, 0x69, 0xe7, 0x34, - 0xe6, 0x5b, 0x50, 0x73, 0xc7, 0x63, 0xd2, 0x3e, 0x54, 0x67, 0xd2, 0xa4, 0x64, 0x4c, 0x6c, 0xc4, - 0x99, 0x77, 0xa1, 0x4d, 0x6a, 0x91, 0x12, 0xd6, 0xcd, 0xf9, 0x39, 0x75, 0x36, 0x5c, 0x6a, 0x4a, - 0x72, 0x8d, 0xef, 0x42, 0x3b, 0xe4, 0x3c, 0x96, 0x03, 0x5a, 0xf3, 0x03, 0x74, 0x0e, 0xd3, 0x36, - 0x42, 0x9d, 0xcd, 0xbc, 0x0d, 0x4d, 0x74, 0x53, 0x78, 0xac, 0xcc, 0x7b, 0x69, 0x1d, 0x94, 0xcb, - 0xb3, 0x1b, 0x29, 0xfe, 0x31, 0x37, 0x01, 0xa4, 0x5c, 0xd3, 0xcc, 0xed, 0x79, 0x76, 0xe4, 0x61, - 0x3b, 0x1e, 0x3e, 0x1d, 0xc1, 0xdf, 0x87, 0x81, 0x0c, 0xd1, 0x4a, 0x23, 0x41, 0x97, 0x50, 0xf5, - 0xc8, 0xd9, 0xa8, 0xdf, 0xee, 0x27, 0xb3, 0x59, 0x80, 0x77, 0xa0, 0x15, 0xcb, 0x18, 0x85, 0x34, - 0x47, 0x67, 0x73, 0xb9, 0x18, 0xaa, 0x82, 0x17, 0x5b, 0x53, 0x98, 0x3f, 0x80, 0xbe, 0x2c, 0xf5, - 0x8d, 0x94, 0xb3, 0x4e, 0xf9, 0xe1, 0x99, 0x9b, 0x73, 0x33, 0xbe, 0xbc, 0xdd, 0x13, 0x33, 0xae, - 0xfd, 0x77, 0xa1, 0x57, 0xdc, 0x64, 0xf2, 0xdc, 0x88, 0xf4, 0x49, 0x67, 0xf3, 0x6a, 0x31, 0xbc, - 0xec, 0x35, 0xda, 0x5d, 0x56, 0xf6, 0x21, 0xd7, 0xa1, 0xa9, 0xca, 0xcf, 0x03, 0x1a, 0x55, 0xba, - 0x3f, 0x2e, 0x6b, 0x19, 0xb6, 0xc2, 0x23, 0x5f, 0x66, 0x54, 0xec, 0x29, 0x3b, 0x27, 0xb5, 0x32, - 0xc3, 0x97, 0xd9, 0xd2, 0xd1, 0x4c, 0xfd, 0xe9, 0x13, 0x76, 0x8e, 0xfb, 0x51, 0x54, 0xe7, 0x86, - 0xe6, 0xfc, 0x7e, 0xe4, 0xa5, 0x39, 0xbb, 0x9d, 0x57, 0xe5, 0xcc, 0x07, 0xb3, 0xd5, 0x42, 0x59, - 0x70, 0x59, 0xa1, 0xa1, 0xaf, 0x2e, 0x18, 0x2a, 0xeb, 0x2e, 0xf6, 0x52, 0x3c, 0x57, 0x74, 0x7c, - 0x17, 0x0c, 0x9e, 0xf8, 0x74, 0x5d, 0x81, 0xd2, 0x42, 0xb4, 0x27, 0x54, 0x24, 0x95, 0x57, 0x3f, - 0x49, 0x01, 0xb5, 0xb8, 0xec, 0xa0, 0xd3, 0x11, 0x27, 0xfc, 0x73, 0xe6, 0x09, 0xa9, 0xfe, 0x56, - 0x2f, 0x3a, 0x1d, 0x0a, 0x4f, 0xde, 0xe9, 0x4d, 0x68, 0xe9, 0xc2, 0xfc, 0xd5, 0x0b, 0x94, 0x1a, - 0x65, 0x7e, 0x08, 0x4b, 0xb3, 0x4a, 0x31, 0x1d, 0x5e, 0xbb, 0x40, 0xdd, 0x9f, 0xd1, 0x81, 0x68, - 0xa9, 0x95, 0x27, 0x35, 0xbc, 0x58, 0x10, 0x23, 0x04, 0xfa, 0xba, 0xca, 0x07, 0x7b, 0xf5, 0xa2, - 0xaf, 0xab, 0xfc, 0xb1, 0x21, 0xb4, 0x82, 0xf4, 0x61, 0x90, 0xa4, 0x62, 0x78, 0x5d, 0x5b, 0x4e, - 0xea, 0xa2, 0x07, 0x17, 0xa4, 0x68, 0x42, 0x86, 0xaf, 0xe9, 0xcb, 0xc2, 0x64, 0x50, 0xee, 0x40, - 0x53, 0x5d, 0x5a, 0x58, 0xbb, 0xa0, 0x15, 0xd4, 0x45, 0x1f, 0x5b, 0x51, 0x98, 0x5f, 0x87, 0x16, - 0x55, 0xac, 0x79, 0x3c, 0x7c, 0x6b, 0x5e, 0x8a, 0x64, 0xd9, 0xd8, 0x6e, 0x86, 0xb2, 0x7c, 0xfc, - 0x0e, 0xb4, 0xb4, 0x03, 0x63, 0xcd, 0x9f, 0x0c, 0xe5, 0xc8, 0xd8, 0x9a, 0xc2, 0xbc, 0x05, 0x8d, - 0x29, 0xea, 0xc2, 0xe1, 0xd7, 0xe6, 0x4f, 0xb9, 0x54, 0x91, 0x12, 0x6b, 0xde, 0x83, 0x4e, 0x4a, - 0xbe, 0xab, 0x14, 0xff, 0x9b, 0xba, 0xda, 0x5b, 0x3c, 0x96, 0xd0, 0x8e, 0xad, 0x0d, 0x69, 0xe1, - 0xe4, 0xfe, 0x2e, 0x5c, 0x2f, 0x97, 0x8a, 0x75, 0x1d, 0x59, 0xc5, 0x7e, 0xb7, 0x68, 0x96, 0xb7, - 0x16, 0x48, 0xd8, 0x6c, 0xc5, 0xd9, 0xbe, 0x16, 0x5f, 0x52, 0x8a, 0xbe, 0x97, 0x5b, 0x1a, 0x3c, - 0xd8, 0xc3, 0xdb, 0x17, 0x96, 0x95, 0xdb, 0x2a, 0x6d, 0x7f, 0xc8, 0xc4, 0x7d, 0x04, 0xdd, 0x51, - 0xf6, 0xfc, 0xf9, 0xb9, 0x92, 0x91, 0xe1, 0xdb, 0x34, 0xae, 0x14, 0x85, 0x95, 0x0a, 0x9f, 0x76, - 0x67, 0x54, 0xaa, 0x82, 0x5e, 0x83, 0x96, 0x17, 0x39, 0xae, 0xef, 0x27, 0xc3, 0x75, 0x59, 0xf8, - 0xf4, 0xa2, 0x2d, 0xdf, 0xa7, 0x0a, 0x32, 0x8f, 0x19, 0xdd, 0x5f, 0x76, 0x02, 0x7f, 0xf8, 0x75, - 0x69, 0xf3, 0x34, 0x68, 0xd7, 0xa7, 0x77, 0x14, 0x3a, 0x74, 0x09, 0xfc, 0xe1, 0x1d, 0xf5, 0x8e, - 0x42, 0x81, 0x76, 0x7d, 0xf4, 0x65, 0xa7, 0xee, 0x99, 0xa3, 0x21, 0xc3, 0x77, 0x64, 0x3c, 0x3b, - 0x75, 0xcf, 0x0e, 0x15, 0x08, 0xcf, 0xb6, 0xbc, 0x9b, 0x46, 0x1a, 0xf3, 0xdd, 0xf9, 0xb3, 0x9d, - 0x27, 0x42, 0xec, 0x76, 0x90, 0xe7, 0x44, 0x48, 0x1f, 0x90, 0x16, 0x74, 0xc2, 0xcd, 0xe1, 0x7b, - 0x17, 0xf5, 0x81, 0xca, 0xf3, 0xa0, 0x3e, 0xd0, 0x29, 0x9f, 0x4d, 0x00, 0xa9, 0x2e, 0x69, 0xb3, - 0x37, 0xe6, 0xc7, 0xe4, 0x01, 0x86, 0x2d, 0x2f, 0x66, 0xd1, 0x56, 0x6f, 0x02, 0x50, 0xf1, 0x58, - 0x8e, 0xb9, 0x3b, 0x3f, 0x26, 0x0f, 0x18, 0xec, 0xf6, 0xd3, 0x3c, 0x76, 0xb8, 0x0b, 0xed, 0x0c, - 0x43, 0x03, 0x74, 0xce, 0x87, 0xef, 0xcf, 0x9f, 0x01, 0x1d, 0x35, 0xd8, 0x46, 0xa6, 0x5a, 0xf8, - 0x23, 0x64, 0xf6, 0xc8, 0x03, 0x1a, 0x7e, 0x30, 0xff, 0x23, 0x79, 0x68, 0x61, 0x93, 0x75, 0x94, - 0x51, 0xc6, 0x3d, 0xe8, 0x48, 0xa6, 0xc9, 0x41, 0x9b, 0xf3, 0x32, 0x52, 0xb8, 0x54, 0xb6, 0xe4, - 0xae, 0x1c, 0x76, 0x0b, 0x1a, 0x6e, 0x1c, 0x87, 0xe7, 0xc3, 0x0f, 0xe7, 0x0f, 0xc6, 0x16, 0x82, - 0x6d, 0x89, 0x45, 0x51, 0x9a, 0x66, 0xa1, 0x08, 0xf4, 0x5d, 0xaa, 0x6f, 0xcc, 0x8b, 0x52, 0xe9, - 0xaa, 0xa9, 0xdd, 0x99, 0x96, 0xee, 0x9d, 0xbe, 0x0b, 0x46, 0xcc, 0x53, 0xe1, 0xf8, 0xd3, 0x70, - 0x78, 0xef, 0x82, 0x05, 0x93, 0x77, 0x88, 0xec, 0x56, 0xac, 0x2e, 0x61, 0xcd, 0x5c, 0x80, 0xfe, - 0xe6, 0xdc, 0x05, 0xe8, 0x7b, 0xd0, 0xdd, 0xa2, 0xf7, 0x41, 0x41, 0x4a, 0xba, 0xf2, 0x16, 0xd4, - 0xf3, 0x74, 0x5d, 0xae, 0x84, 0x89, 0xe2, 0x39, 0xdb, 0x8d, 0x46, 0xdc, 0x26, 0xb4, 0xf5, 0x77, - 0x75, 0x68, 0x1e, 0xf1, 0x2c, 0xf1, 0xd8, 0x17, 0x5f, 0xc2, 0x7b, 0x43, 0x8b, 0x44, 0x54, 0x14, - 0xfd, 0xe5, 0xee, 0x13, 0x7a, 0xbe, 0x5c, 0xd9, 0x2e, 0x32, 0x81, 0x57, 0xa0, 0x21, 0x43, 0x43, - 0x79, 0x79, 0x4b, 0x76, 0xe8, 0x38, 0x64, 0xe9, 0xc4, 0xe7, 0xcf, 0x22, 0x3c, 0x0e, 0x0d, 0xba, - 0xfb, 0x04, 0x1a, 0xb4, 0xeb, 0x53, 0xa8, 0xaf, 0x09, 0xe8, 0xbc, 0x35, 0x65, 0x7c, 0xa0, 0x81, - 0x74, 0xea, 0x74, 0x96, 0xb1, 0x75, 0x49, 0x96, 0xf1, 0x4d, 0xa8, 0x47, 0xfa, 0xd2, 0x50, 0x8e, - 0xa7, 0xd7, 0x25, 0x04, 0x37, 0xef, 0x40, 0x7e, 0x73, 0x50, 0xb9, 0x2e, 0x97, 0xdf, 0x2c, 0xdc, - 0x84, 0x76, 0xfe, 0xa2, 0x4c, 0x79, 0x2b, 0x57, 0x36, 0x8a, 0x37, 0x66, 0xc7, 0xba, 0x65, 0x17, - 0x64, 0x0b, 0x12, 0x8f, 0xb2, 0x66, 0x43, 0x7c, 0xea, 0xbc, 0x4c, 0xe2, 0x91, 0x0a, 0x39, 0x3a, - 0xe9, 0x1a, 0xa4, 0x8e, 0xc7, 0xa3, 0x54, 0xa8, 0x64, 0x46, 0x2b, 0x48, 0xb7, 0xb1, 0x6b, 0x7e, - 0x1b, 0x7a, 0x09, 0xf3, 0x9e, 0x3a, 0xd3, 0x74, 0x2c, 0x7f, 0xa2, 0x57, 0xbe, 0x8b, 0x3c, 0x4d, - 0xc7, 0x1f, 0x33, 0x17, 0x8d, 0xaf, 0x8c, 0x98, 0x3a, 0x48, 0xbb, 0x9f, 0x8e, 0x69, 0xd6, 0x77, - 0x60, 0x79, 0xca, 0xa6, 0x27, 0x2c, 0x49, 0x27, 0x41, 0xac, 0xf5, 0x62, 0x9f, 0xf2, 0x8d, 0x83, - 0x02, 0x21, 0xd7, 0x62, 0xfd, 0x61, 0x05, 0x0c, 0xe4, 0x22, 0xca, 0x92, 0x69, 0x42, 0x7d, 0xea, - 0xc5, 0x99, 0x72, 0x98, 0xa9, 0xad, 0x5e, 0xa9, 0x49, 0x29, 0x51, 0xaf, 0xd4, 0x68, 0x0f, 0x6b, - 0x32, 0xc1, 0x88, 0x6d, 0xf9, 0xa2, 0xe5, 0x9c, 0xb2, 0x38, 0x52, 0x32, 0x74, 0xd7, 0x5c, 0x85, - 0xa6, 0x17, 0x51, 0x34, 0x2c, 0xaf, 0x92, 0x35, 0xbc, 0x08, 0xa3, 0x60, 0x09, 0x2e, 0x2e, 0x47, - 0x34, 0xbc, 0x68, 0xd7, 0x3f, 0xb3, 0xfe, 0xaa, 0x02, 0xcb, 0x87, 0x09, 0xf7, 0x58, 0x9a, 0xee, - 0xa1, 0xb1, 0x76, 0xc9, 0x63, 0x33, 0xa1, 0x4e, 0x59, 0x38, 0xf9, 0x3c, 0x84, 0xda, 0x28, 0xc3, - 0x32, 0x55, 0x91, 0x87, 0x25, 0x35, 0xbb, 0x4d, 0x10, 0x8a, 0x4a, 0x72, 0x34, 0x0d, 0xac, 0x95, - 0xd0, 0x94, 0xbf, 0xbb, 0x05, 0xfd, 0xe2, 0x5e, 0x57, 0x29, 0xa5, 0x58, 0xdc, 0xb6, 0xa7, 0x59, - 0x6e, 0x40, 0x27, 0x21, 0x2e, 0xcb, 0x69, 0x64, 0x7a, 0x11, 0x24, 0x08, 0xe7, 0xb1, 0x26, 0x30, - 0x38, 0x4c, 0x58, 0xec, 0x26, 0x0c, 0xf5, 0xfa, 0x94, 0x78, 0x78, 0x15, 0x9a, 0x21, 0x8b, 0xc6, - 0x62, 0xa2, 0xd6, 0xab, 0x7a, 0xf9, 0x0b, 0xc2, 0x6a, 0xe9, 0x05, 0x21, 0xf2, 0x32, 0x61, 0xae, - 0x7a, 0x68, 0x48, 0x6d, 0x3c, 0x63, 0x51, 0x16, 0xaa, 0xcc, 0xa0, 0x61, 0xcb, 0x8e, 0xf5, 0xb3, - 0x1a, 0x74, 0x14, 0x67, 0xe8, 0x57, 0xe4, 0xae, 0x54, 0xf2, 0x5d, 0x19, 0x40, 0x2d, 0x7d, 0x12, - 0xaa, 0x6d, 0xc2, 0xa6, 0xf9, 0x21, 0xd4, 0xc2, 0x60, 0xaa, 0x82, 0x9a, 0xd7, 0x66, 0xac, 0xc4, - 0x2c, 0x7f, 0x95, 0x08, 0x21, 0x35, 0xaa, 0x26, 0xba, 0xd8, 0x8f, 0xc2, 0xaa, 0x78, 0x82, 0x1a, - 0xfb, 0x0c, 0x4f, 0x04, 0x32, 0xd5, 0xf5, 0xe8, 0xe6, 0x96, 0x3e, 0xe6, 0x3d, 0xbb, 0xad, 0x20, - 0xbb, 0xbe, 0xf9, 0x0d, 0x30, 0xd2, 0xc8, 0x8d, 0xd3, 0x09, 0x17, 0x79, 0x18, 0x23, 0xce, 0xa2, - 0x8d, 0xed, 0x83, 0xe3, 0xb3, 0xe8, 0x48, 0x61, 0xd4, 0x8f, 0xe5, 0x94, 0xe6, 0x0f, 0xa0, 0x9b, - 0xb2, 0x34, 0x95, 0x77, 0xb5, 0x47, 0x5c, 0x1d, 0xff, 0xd5, 0x72, 0x84, 0x42, 0x58, 0xfc, 0x6a, - 0x2d, 0xec, 0x69, 0x01, 0x32, 0x3f, 0x86, 0xbe, 0x1e, 0x1f, 0xf2, 0xf1, 0x38, 0x4f, 0x61, 0xbe, - 0x76, 0x61, 0x86, 0x3d, 0x42, 0x97, 0xe6, 0xe9, 0xa5, 0x65, 0x84, 0xf9, 0x63, 0xe8, 0xc7, 0x72, - 0x33, 0x1d, 0x95, 0xa3, 0x97, 0x6a, 0xe4, 0xfa, 0x8c, 0x53, 0x33, 0xb3, 0xd9, 0xc5, 0xfd, 0xcb, - 0x02, 0x9e, 0x5a, 0xff, 0x55, 0x81, 0x4e, 0x69, 0xd5, 0xf4, 0xae, 0x33, 0x65, 0x89, 0x4e, 0xc9, - 0x63, 0x1b, 0x61, 0x13, 0xae, 0x1e, 0x38, 0xb5, 0x6d, 0x6a, 0x23, 0x2c, 0xe1, 0xaa, 0xcc, 0xd3, - 0xb6, 0xa9, 0x8d, 0xaa, 0x53, 0x85, 0x9e, 0xf2, 0x09, 0x08, 0x6d, 0x4a, 0xdd, 0xee, 0x16, 0xc0, - 0x5d, 0x9f, 0x1e, 0x80, 0xba, 0xc2, 0x3d, 0x71, 0x53, 0x5d, 0x41, 0xc8, 0xfb, 0x78, 0x34, 0x9f, - 0xb2, 0x04, 0xd7, 0xa2, 0xb4, 0xae, 0xee, 0xe2, 0x5e, 0x93, 0x36, 0x7b, 0xce, 0x23, 0x79, 0x05, - 0xad, 0x6b, 0x1b, 0x08, 0xf8, 0x8c, 0x47, 0x34, 0x4c, 0xed, 0x2c, 0xf1, 0xb3, 0x6d, 0xeb, 0x2e, - 0xea, 0xac, 0x27, 0x19, 0x43, 0xc7, 0xcf, 0xa7, 0x3b, 0x48, 0x6d, 0xbb, 0x45, 0xfd, 0x5d, 0xdf, - 0xfa, 0xf7, 0x0a, 0x2c, 0x5f, 0x60, 0x36, 0xfa, 0x59, 0xc8, 0x68, 0x7d, 0x2d, 0xb6, 0x6b, 0x37, - 0xb1, 0xbb, 0xeb, 0x13, 0x42, 0x4c, 0x49, 0x98, 0xaa, 0x0a, 0x21, 0xa6, 0x28, 0x49, 0xab, 0xd0, - 0x14, 0x67, 0xf4, 0xb5, 0xf2, 0x60, 0x34, 0xc4, 0x19, 0x7e, 0xe6, 0x16, 0xc6, 0xbd, 0x63, 0x27, - 0x64, 0x4f, 0x59, 0x48, 0x7c, 0xe8, 0x6f, 0xde, 0x7c, 0xc1, 0x2e, 0x6f, 0xec, 0xf1, 0xf1, 0x1e, - 0xd2, 0x62, 0x24, 0x2c, 0x5b, 0xd6, 0x4f, 0xc0, 0xd0, 0x50, 0xb3, 0x0d, 0x8d, 0x1d, 0x76, 0x92, - 0x8d, 0x07, 0xaf, 0x98, 0x06, 0xd4, 0x71, 0xc4, 0xa0, 0x82, 0xad, 0x4f, 0xdd, 0x24, 0x1a, 0x54, - 0x11, 0xfd, 0x20, 0x49, 0x78, 0x32, 0xa8, 0x61, 0xf3, 0xd0, 0x8d, 0x02, 0x6f, 0x50, 0xc7, 0xe6, - 0x43, 0x57, 0xb8, 0xe1, 0xa0, 0x61, 0xfd, 0xbc, 0x01, 0xc6, 0xa1, 0xfa, 0x75, 0x73, 0x07, 0x7a, - 0xf9, 0xd3, 0xda, 0xc5, 0xb9, 0x96, 0xc3, 0xf9, 0x06, 0xe5, 0x5a, 0xba, 0x71, 0xa9, 0x37, 0xff, - 0x40, 0xb7, 0x7a, 0xe1, 0x81, 0xee, 0xeb, 0x50, 0x7b, 0x92, 0x9c, 0xcf, 0x56, 0xe2, 0x0e, 0x43, - 0x37, 0xb2, 0x11, 0x6c, 0x7e, 0x00, 0x1d, 0xdc, 0x77, 0x27, 0x25, 0x47, 0x40, 0xe5, 0x27, 0xca, - 0xcf, 0xa0, 0x09, 0x6e, 0x03, 0x12, 0x29, 0x67, 0x61, 0x03, 0x0c, 0x6f, 0x12, 0x84, 0x7e, 0xc2, - 0x22, 0x55, 0xe5, 0x36, 0x2f, 0x2e, 0xd9, 0xce, 0x69, 0xcc, 0x1f, 0xd1, 0x35, 0x4e, 0x9d, 0x5f, - 0x29, 0x8a, 0x0f, 0x33, 0x47, 0xb6, 0x94, 0x81, 0xb1, 0x97, 0x4a, 0xe4, 0x64, 0x9d, 0x8a, 0xf7, - 0x0a, 0xad, 0xf2, 0x7b, 0x05, 0xf9, 0x0c, 0x93, 0x4c, 0x88, 0x91, 0x47, 0x56, 0x68, 0x41, 0x6e, - 0x2b, 0xbb, 0xdf, 0x9e, 0xf7, 0x29, 0xb5, 0xd5, 0x52, 0xf6, 0xff, 0x26, 0xf4, 0xd1, 0x9f, 0x70, - 0xa4, 0x1b, 0x82, 0xaa, 0x04, 0xd4, 0x63, 0xa9, 0x2c, 0x9d, 0xec, 0xa0, 0x23, 0x82, 0xc2, 0x78, - 0x0b, 0xfa, 0xfa, 0x5b, 0xd4, 0x25, 0xd4, 0x8e, 0x2a, 0x4e, 0x28, 0xa8, 0xbc, 0x83, 0xba, 0x01, - 0x2b, 0xde, 0xc4, 0x8d, 0x22, 0x16, 0x3a, 0x27, 0xd9, 0x68, 0xa4, 0x2d, 0x40, 0x97, 0xd2, 0x7a, - 0xcb, 0x0a, 0x75, 0x9f, 0x30, 0x64, 0x50, 0x2c, 0xe8, 0x45, 0x41, 0x28, 0x73, 0xd7, 0x64, 0xed, - 0x7a, 0x44, 0xd9, 0x89, 0x82, 0x90, 0x92, 0xd7, 0x68, 0xf3, 0x7e, 0x08, 0x83, 0x2c, 0x0b, 0xfc, - 0xd4, 0x11, 0x5c, 0xbf, 0x60, 0x55, 0x19, 0xd0, 0x52, 0xee, 0xe1, 0x71, 0x16, 0xf8, 0xc7, 0x5c, - 0xbd, 0x61, 0xed, 0x11, 0xbd, 0xee, 0x5a, 0x3f, 0x84, 0x6e, 0x59, 0x76, 0x50, 0x16, 0x29, 0xb0, - 0x1b, 0xbc, 0x62, 0x02, 0x34, 0x0f, 0x78, 0x32, 0x75, 0xc3, 0x41, 0x05, 0xdb, 0xf2, 0x15, 0xcf, - 0xa0, 0x6a, 0x76, 0xc1, 0xd0, 0x11, 0xc7, 0xa0, 0x66, 0x7d, 0x17, 0x0c, 0xfd, 0x24, 0x97, 0xde, - 0x42, 0x72, 0x9f, 0x49, 0x7f, 0x4c, 0x6a, 0x26, 0x03, 0x01, 0xe4, 0x8b, 0xe9, 0x97, 0xe8, 0xd5, - 0xe2, 0x25, 0xba, 0xf5, 0x5b, 0xd0, 0x2d, 0x2f, 0x4e, 0xa7, 0xd2, 0x2a, 0x45, 0x2a, 0x6d, 0xc1, - 0x28, 0xaa, 0x52, 0x25, 0x7c, 0xea, 0x94, 0x5c, 0x06, 0x03, 0x01, 0xf8, 0x33, 0xd6, 0x1f, 0x54, - 0xa0, 0x41, 0x1e, 0x38, 0x99, 0x16, 0x6c, 0x14, 0x67, 0xa7, 0x61, 0xb7, 0x09, 0xf2, 0xbf, 0xb8, - 0x5c, 0x97, 0x97, 0x4c, 0xea, 0x2f, 0x2c, 0x99, 0xdc, 0x79, 0x02, 0x4d, 0xf9, 0xf8, 0xdf, 0x5c, - 0x86, 0xde, 0xe3, 0xe8, 0x34, 0xe2, 0xcf, 0x22, 0x09, 0x18, 0xbc, 0x62, 0xae, 0xc0, 0x92, 0x66, - 0xba, 0xfa, 0x2f, 0x03, 0x83, 0x8a, 0x39, 0x80, 0x2e, 0x6d, 0xab, 0x86, 0x54, 0xcd, 0xd7, 0x61, - 0xa8, 0x8c, 0xc3, 0x0e, 0x8f, 0xd8, 0x01, 0x17, 0xc1, 0xe8, 0x5c, 0x63, 0x6b, 0xe6, 0x12, 0x74, - 0x8e, 0x04, 0x8f, 0x8f, 0x58, 0xe4, 0x07, 0xd1, 0x78, 0x50, 0xbf, 0xf3, 0x10, 0x9a, 0xf2, 0x7f, - 0x12, 0x94, 0x7e, 0x52, 0x02, 0x06, 0xaf, 0x20, 0xf5, 0xa7, 0x6e, 0x20, 0x82, 0x68, 0x7c, 0xc0, - 0xce, 0x84, 0x54, 0x4a, 0x7b, 0x6e, 0x2a, 0x06, 0x55, 0xb3, 0x0f, 0xa0, 0x66, 0x7d, 0x10, 0xf9, - 0x83, 0xda, 0xfd, 0xed, 0x5f, 0xfc, 0xf2, 0xcd, 0xca, 0x3f, 0xfe, 0xf2, 0xcd, 0xca, 0xbf, 0xfe, - 0xf2, 0xcd, 0x57, 0x7e, 0xfa, 0x6f, 0x6f, 0x56, 0x3e, 0xfb, 0xa0, 0xf4, 0x1f, 0x17, 0xa6, 0xae, - 0x48, 0x82, 0x33, 0x59, 0xe7, 0xd3, 0x9d, 0x88, 0xdd, 0x8d, 0x4f, 0xc7, 0x77, 0xe3, 0x93, 0xbb, - 0x5a, 0xe6, 0x4e, 0x9a, 0xf4, 0x8f, 0x14, 0x3e, 0xfc, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5c, - 0xf2, 0xf0, 0x33, 0xc7, 0x41, 0x00, 0x00, + 0x5c, 0x7a, 0xda, 0x56, 0x18, 0x3c, 0x65, 0x36, 0x1b, 0x6f, 0x47, 0x82, 0xf6, 0xa5, 0x61, 0x97, + 0x41, 0xe6, 0x26, 0xac, 0xa6, 0x72, 0x88, 0x93, 0xb8, 0xd1, 0x98, 0xa5, 0x4e, 0x16, 0x44, 0xe2, + 0x9b, 0xdf, 0x18, 0x36, 0xd7, 0x6a, 0xeb, 0x75, 0x7b, 0x45, 0x21, 0x6d, 0xc2, 0x3d, 0x26, 0x94, + 0xf9, 0x3e, 0x5c, 0x99, 0x1b, 0x23, 0x87, 0xb4, 0xd6, 0x6a, 0xeb, 0x35, 0xdb, 0x9c, 0x19, 0xb2, + 0x4b, 0x23, 0x1e, 0xc0, 0x72, 0x92, 0x45, 0x28, 0xbd, 0x0f, 0x83, 0x50, 0xb0, 0xe4, 0x28, 0x66, + 0x1e, 0xed, 0x6f, 0x67, 0xf3, 0xda, 0x06, 0x09, 0xb8, 0x3d, 0x8f, 0xb6, 0x2f, 0x8e, 0x30, 0xdf, + 0xcd, 0x99, 0xf7, 0xe0, 0x2c, 0x4e, 0x48, 0x08, 0x3a, 0x9b, 0x20, 0x27, 0x40, 0x88, 0x5d, 0x46, + 0x5b, 0xbf, 0xae, 0x82, 0xb1, 0x13, 0xa4, 0xb1, 0x2b, 0xbc, 0x89, 0x79, 0x0d, 0x5a, 0xa3, 0x2c, + 0xf2, 0x8a, 0xfd, 0x6e, 0x62, 0x77, 0xd7, 0x37, 0xbf, 0x07, 0x4b, 0x21, 0xf7, 0xdc, 0xd0, 0xc9, + 0xb7, 0x76, 0x58, 0x5d, 0xab, 0xad, 0x77, 0x36, 0x57, 0x8a, 0x33, 0x91, 0x8b, 0x8e, 0xdd, 0x27, + 0xda, 0x42, 0x94, 0xbe, 0x0f, 0x83, 0x84, 0x4d, 0xb9, 0x60, 0xa5, 0xe1, 0x35, 0x1a, 0x6e, 0x16, + 0xc3, 0x3f, 0x4d, 0xdc, 0xf8, 0x80, 0xfb, 0xcc, 0x5e, 0x92, 0xb4, 0xc5, 0xf0, 0x0f, 0x4a, 0xdc, + 0x67, 0x63, 0x27, 0xf0, 0xcf, 0x1c, 0x7a, 0xc0, 0xb0, 0xbe, 0x56, 0x5b, 0x6f, 0x14, 0xac, 0x64, + 0xe3, 0x5d, 0xff, 0x6c, 0x0f, 0x31, 0xe6, 0x87, 0x70, 0x75, 0x7e, 0x88, 0x9c, 0x75, 0xd8, 0xa0, + 0x31, 0x2b, 0x33, 0x63, 0x6c, 0x42, 0x99, 0x6f, 0x41, 0x57, 0x0f, 0x12, 0x28, 0x76, 0x4d, 0x29, + 0x08, 0x69, 0x49, 0xec, 0xae, 0x41, 0x2b, 0x48, 0x9d, 0x34, 0x88, 0x4e, 0xe9, 0x28, 0x1a, 0x76, + 0x33, 0x48, 0x8f, 0x82, 0xe8, 0xd4, 0x7c, 0x15, 0x8c, 0x84, 0x79, 0x12, 0x63, 0x10, 0xa6, 0x95, + 0x30, 0x8f, 0x50, 0xd7, 0x00, 0x9b, 0x8e, 0x27, 0x98, 0x3a, 0x90, 0xcd, 0x84, 0x79, 0xdb, 0x82, + 0x59, 0x29, 0x34, 0xf6, 0x59, 0x32, 0x66, 0x78, 0x26, 0x71, 0xe0, 0x91, 0xe7, 0x46, 0xc4, 0x77, + 0xc3, 0xce, 0xfb, 0xa8, 0x11, 0x62, 0x37, 0x11, 0x81, 0x1b, 0xd2, 0x31, 0x30, 0x6c, 0xdd, 0x35, + 0x5f, 0x83, 0x76, 0x2a, 0xdc, 0x44, 0xe0, 0xdb, 0x91, 0xf8, 0x37, 0x6c, 0x83, 0x00, 0x78, 0x82, + 0xae, 0x41, 0x8b, 0x45, 0x3e, 0xa1, 0xea, 0x72, 0x27, 0x59, 0xe4, 0xef, 0xfa, 0x67, 0xd6, 0xdf, + 0x56, 0xa0, 0xb7, 0x9f, 0x85, 0x22, 0xd8, 0x4a, 0xc6, 0x19, 0x9b, 0x46, 0x02, 0x35, 0xc9, 0x4e, + 0x90, 0x0a, 0xf5, 0x64, 0x6a, 0x9b, 0xeb, 0xd0, 0xfe, 0x71, 0xc2, 0xb3, 0x98, 0x24, 0x48, 0xee, + 0x74, 0x59, 0x82, 0x0a, 0x24, 0x4a, 0xdb, 0xa3, 0xc4, 0x67, 0xc9, 0xfd, 0x73, 0xa2, 0xad, 0x5d, + 0xa0, 0x2d, 0xa3, 0xcd, 0xd7, 0xa1, 0x7d, 0xc4, 0x62, 0x37, 0x71, 0x51, 0x04, 0xea, 0xa4, 0x7e, + 0x0a, 0x00, 0xbe, 0x2b, 0x11, 0xef, 0xfa, 0xea, 0x10, 0xea, 0xae, 0x35, 0x86, 0xf6, 0xd6, 0x78, + 0x9c, 0xb0, 0xb1, 0x2b, 0x48, 0x15, 0xf2, 0x98, 0x96, 0x5b, 0xb3, 0xab, 0x3c, 0x26, 0x75, 0x8b, + 0x2f, 0x20, 0xf9, 0x43, 0x6d, 0xf3, 0x4d, 0xa8, 0xb3, 0xc5, 0xeb, 0x21, 0xb8, 0x79, 0x15, 0x9a, + 0x1e, 0x8f, 0x46, 0xc1, 0x58, 0x29, 0x69, 0xd5, 0xb3, 0xfe, 0xb2, 0x06, 0x0d, 0x7a, 0x39, 0x64, + 0x2f, 0x2a, 0x4e, 0x87, 0x3d, 0x75, 0x43, 0xbd, 0x2b, 0x08, 0x78, 0xf0, 0xd4, 0x0d, 0xcd, 0x35, + 0x68, 0xe0, 0x34, 0xe9, 0x02, 0xde, 0x48, 0x84, 0x79, 0x1b, 0x1a, 0x28, 0x44, 0xe9, 0xec, 0x0a, + 0x50, 0x88, 0xee, 0xd7, 0x7f, 0xf9, 0xaf, 0x37, 0x5e, 0xb1, 0x25, 0xda, 0x7c, 0x1b, 0xea, 0xee, + 0x78, 0x9c, 0x92, 0x2c, 0xcf, 0x1c, 0xa7, 0xfc, 0x7d, 0x6d, 0x22, 0x30, 0xef, 0x41, 0x5b, 0xee, + 0x1b, 0x52, 0x37, 0x88, 0xfa, 0x5a, 0xc9, 0x20, 0x95, 0xb7, 0xd4, 0x2e, 0x28, 0x91, 0xe3, 0x41, + 0xaa, 0x0e, 0x3c, 0x49, 0xb4, 0x61, 0x17, 0x00, 0xb4, 0x18, 0x71, 0xc2, 0xb6, 0xc2, 0x90, 0x7b, + 0x47, 0xc1, 0x73, 0xa6, 0xec, 0xcb, 0x0c, 0xcc, 0xbc, 0x0d, 0xfd, 0x43, 0x29, 0x72, 0x36, 0x4b, + 0xb3, 0x50, 0xa4, 0xca, 0xe6, 0xcc, 0x41, 0xcd, 0x0d, 0x30, 0x67, 0x20, 0xc7, 0xf4, 0xfa, 0xed, + 0xb5, 0xda, 0x7a, 0xcf, 0x5e, 0x80, 0x31, 0xbf, 0x06, 0xbd, 0x31, 0x72, 0x3a, 0x88, 0xc6, 0xce, + 0x28, 0x74, 0xd1, 0x1c, 0xd5, 0xd0, 0x5c, 0x69, 0xe0, 0xc3, 0xd0, 0x1d, 0x93, 0x90, 0xc7, 0x41, + 0x18, 0x3a, 0x53, 0x36, 0x1d, 0x76, 0x68, 0xcb, 0x0d, 0x02, 0xec, 0xb3, 0xa9, 0xf5, 0x57, 0x75, + 0x68, 0xee, 0x46, 0x29, 0x4b, 0x04, 0x1e, 0x21, 0x77, 0x34, 0x62, 0x9e, 0x60, 0x52, 0x75, 0xd5, + 0xed, 0xbc, 0x8f, 0x2c, 0x38, 0xe6, 0x9f, 0x26, 0x81, 0x60, 0x47, 0x1f, 0x2a, 0x21, 0x29, 0x00, + 0xe6, 0x1d, 0x58, 0x76, 0x7d, 0xdf, 0xd1, 0xd4, 0x4e, 0xc2, 0x9f, 0xa5, 0x74, 0x9c, 0x0c, 0x7b, + 0xc9, 0xf5, 0xfd, 0x2d, 0x05, 0xb7, 0xf9, 0xb3, 0xd4, 0x7c, 0x0b, 0x6a, 0x09, 0x1b, 0x91, 0xc8, + 0x74, 0x36, 0x97, 0xe4, 0x96, 0x3e, 0x3a, 0xf9, 0x9c, 0x79, 0xc2, 0x66, 0x23, 0x1b, 0x71, 0xe6, + 0x15, 0x68, 0xb8, 0x42, 0x24, 0x72, 0x8b, 0xda, 0xb6, 0xec, 0x98, 0x1b, 0xb0, 0x42, 0xc7, 0x56, + 0x04, 0x3c, 0x72, 0x84, 0x7b, 0x12, 0xa2, 0x4d, 0x4d, 0x95, 0xf9, 0x58, 0xce, 0x51, 0xc7, 0x88, + 0xd9, 0xf5, 0x53, 0x34, 0x38, 0xf3, 0xf4, 0x91, 0x3b, 0x65, 0x29, 0x59, 0x8f, 0xb6, 0xbd, 0x32, + 0x3b, 0xe2, 0x00, 0x51, 0xc8, 0xcf, 0x62, 0x0c, 0x1e, 0x7c, 0x83, 0xce, 0x50, 0x37, 0x07, 0xa2, + 0x5e, 0x58, 0x85, 0x66, 0x90, 0x3a, 0x2c, 0xf2, 0x95, 0x2e, 0x6a, 0x04, 0xe9, 0x83, 0xc8, 0x37, + 0xdf, 0x81, 0xb6, 0x7c, 0x8a, 0xcf, 0x46, 0xe4, 0x16, 0x74, 0x36, 0xfb, 0x4a, 0x62, 0x11, 0xbc, + 0xc3, 0x46, 0xb6, 0x21, 0x54, 0x0b, 0x3d, 0x03, 0xc1, 0x1d, 0x76, 0x26, 0x58, 0x12, 0xb9, 0x21, + 0xed, 0x8a, 0x61, 0x83, 0xe0, 0x0f, 0x14, 0xc4, 0xbc, 0x07, 0xd7, 0x34, 0xd6, 0x49, 0xc5, 0x54, + 0x38, 0x59, 0x14, 0x9c, 0x39, 0x91, 0x1b, 0xf1, 0x61, 0x97, 0xb6, 0xf0, 0x8a, 0x46, 0x1f, 0x89, + 0xa9, 0x78, 0x1c, 0x05, 0x67, 0x07, 0x6e, 0xc4, 0xcd, 0x75, 0x18, 0xe4, 0xc3, 0xc4, 0x73, 0x7a, + 0xe1, 0x61, 0x8f, 0x74, 0x44, 0x5f, 0xc3, 0x8f, 0x9f, 0xe3, 0xbb, 0xa2, 0x7a, 0x2f, 0x53, 0xf2, + 0xd1, 0x28, 0x65, 0xc2, 0x49, 0x99, 0x37, 0xec, 0xd3, 0x3b, 0xaf, 0x14, 0xf4, 0x8f, 0x08, 0x77, + 0xc4, 0x3c, 0xeb, 0x0f, 0x2b, 0xd0, 0xa1, 0x73, 0xf1, 0x38, 0xf6, 0x51, 0x8d, 0x7c, 0x0d, 0x7a, + 0xb3, 0x9b, 0x2e, 0xe5, 0xa6, 0xeb, 0x96, 0x77, 0xfc, 0x2a, 0x34, 0xb7, 0x3c, 0x64, 0x1e, 0x09, + 0x4e, 0xcf, 0x56, 0x3d, 0xf3, 0x5b, 0xb0, 0x94, 0xd1, 0x34, 0x8e, 0x27, 0xce, 0x9c, 0x10, 0xd5, + 0x8f, 0x3c, 0xe8, 0x4a, 0x2a, 0xe4, 0x33, 0xb6, 0xc5, 0x99, 0xdd, 0xcb, 0x74, 0x73, 0x2f, 0x48, + 0x85, 0xf5, 0x06, 0x34, 0xb6, 0x92, 0xc4, 0x3d, 0x27, 0x41, 0xc1, 0xc6, 0xb0, 0x42, 0x16, 0x49, + 0x76, 0x2c, 0x0f, 0x6a, 0xfb, 0x6e, 0x6c, 0xde, 0x82, 0xea, 0x34, 0x26, 0x4c, 0x67, 0x73, 0xb5, + 0x74, 0xca, 0xdd, 0x78, 0x63, 0x3f, 0x7e, 0x10, 0x89, 0xe4, 0xdc, 0xae, 0x4e, 0xe3, 0xeb, 0xf7, + 0xa0, 0xa5, 0xba, 0xe8, 0x85, 0x9e, 0xb2, 0x73, 0x7a, 0x87, 0xb6, 0x8d, 0x4d, 0x7c, 0xc0, 0x53, + 0x37, 0xcc, 0xb4, 0xfb, 0x24, 0x3b, 0xdf, 0xa9, 0x7e, 0x54, 0xb1, 0xfe, 0xab, 0x0e, 0xc6, 0x0e, + 0x0b, 0x19, 0xbd, 0x89, 0x05, 0xdd, 0xb2, 0x8c, 0x6b, 0x2e, 0xcc, 0xc8, 0xbd, 0x05, 0x5d, 0x69, + 0x23, 0x69, 0x14, 0x53, 0x87, 0x68, 0x06, 0x86, 0xca, 0x7b, 0xf7, 0x7e, 0xe6, 0x9d, 0x32, 0x41, + 0xa7, 0xa7, 0x67, 0xeb, 0x2e, 0x62, 0x0e, 0x14, 0xa6, 0x2e, 0x31, 0xaa, 0x6b, 0xbe, 0x0e, 0x90, + 0xf0, 0x67, 0x4e, 0x20, 0x0d, 0x95, 0xd4, 0xf9, 0x46, 0xc2, 0x9f, 0xed, 0xa2, 0xa9, 0xfa, 0x8d, + 0x1c, 0x9a, 0x6f, 0xc1, 0xb0, 0x74, 0x68, 0xd0, 0x5d, 0x75, 0x82, 0xc8, 0x39, 0x41, 0x6f, 0x48, + 0x9d, 0x9f, 0x62, 0x4e, 0xf2, 0x66, 0x77, 0xa3, 0xfb, 0xe4, 0x2a, 0x29, 0x55, 0xd0, 0x7e, 0x81, + 0x2a, 0x58, 0xa8, 0x59, 0x60, 0xb1, 0x66, 0xb9, 0x0f, 0x70, 0xc4, 0xc6, 0x53, 0x16, 0x89, 0x7d, + 0x37, 0x1e, 0x76, 0x68, 0xe3, 0xad, 0x62, 0xe3, 0xf5, 0x6e, 0x6d, 0x14, 0x44, 0x52, 0x0a, 0x4a, + 0xa3, 0xd0, 0x7f, 0xf1, 0xdc, 0xc8, 0x11, 0x49, 0x16, 0x79, 0xae, 0x60, 0x74, 0xd6, 0x0c, 0xbb, + 0xe3, 0xb9, 0xd1, 0xb1, 0x02, 0x95, 0x8e, 0x7f, 0xaf, 0x7c, 0xfc, 0x6f, 0xc3, 0x52, 0x9c, 0x04, + 0x53, 0x37, 0x39, 0x77, 0x4e, 0xd9, 0x39, 0x6d, 0x86, 0x3c, 0x48, 0x3d, 0x05, 0xfe, 0x84, 0x9d, + 0xef, 0xfa, 0x67, 0xd7, 0xbf, 0x0f, 0x4b, 0x73, 0x0b, 0x78, 0x29, 0xb9, 0xfb, 0x69, 0x0d, 0xda, + 0x87, 0x09, 0x53, 0x2a, 0xfb, 0x06, 0x74, 0x52, 0x6f, 0xc2, 0xa6, 0xae, 0x3c, 0xe9, 0x72, 0x06, + 0x90, 0x20, 0x3a, 0xe5, 0x33, 0x4a, 0xa9, 0xfa, 0x05, 0x4a, 0x69, 0x00, 0x35, 0xe9, 0x07, 0xe1, + 0x61, 0xc2, 0x66, 0xa1, 0x89, 0xeb, 0x65, 0x4d, 0xbc, 0x06, 0xdd, 0x89, 0x9b, 0x3a, 0x6e, 0x26, + 0xb8, 0xe3, 0xf1, 0x90, 0x84, 0xce, 0xb0, 0x61, 0xe2, 0xa6, 0x5b, 0x99, 0xe0, 0xdb, 0x3c, 0x34, + 0xdf, 0x00, 0xf0, 0x78, 0xa8, 0x94, 0x8a, 0x72, 0x02, 0xdb, 0x1e, 0x0f, 0xa5, 0x26, 0x41, 0xa9, + 0x64, 0xa9, 0x08, 0xa6, 0xae, 0xda, 0x52, 0xc7, 0xe3, 0x59, 0x24, 0xc8, 0x72, 0xd6, 0xec, 0xe5, + 0x1c, 0x65, 0xf3, 0x67, 0xdb, 0x88, 0x30, 0xdf, 0x87, 0xbe, 0xc7, 0xa7, 0xb1, 0x13, 0x23, 0x67, + 0xc9, 0x27, 0x31, 0x2e, 0x78, 0xe4, 0x5d, 0xa4, 0x38, 0x3c, 0x65, 0xd2, 0x49, 0xda, 0x84, 0x25, + 0x2f, 0xcc, 0x52, 0xc1, 0x12, 0xe7, 0x44, 0x0d, 0xb9, 0xe8, 0xc4, 0xf7, 0x14, 0x89, 0x72, 0xac, + 0x2c, 0xe8, 0x05, 0xa9, 0xc3, 0x43, 0xdf, 0x91, 0xea, 0x46, 0xc9, 0x59, 0x27, 0x48, 0x1f, 0x85, + 0xbe, 0x52, 0x78, 0x92, 0x26, 0x62, 0xcf, 0x34, 0x4d, 0x47, 0xd3, 0x1c, 0xb0, 0x67, 0x92, 0xc6, + 0xfa, 0xe7, 0x2a, 0xb4, 0x0e, 0x79, 0x2a, 0x76, 0xa6, 0xa1, 0x16, 0xf1, 0xca, 0xcb, 0x8a, 0x78, + 0x75, 0xb1, 0x88, 0x2f, 0x10, 0xb2, 0xda, 0x02, 0x21, 0x43, 0x33, 0x50, 0xa6, 0x23, 0xe1, 0x90, + 0xae, 0x62, 0xbf, 0x20, 0x24, 0x01, 0x79, 0x0d, 0x7d, 0x1b, 0xc7, 0x97, 0x3a, 0x49, 0x6e, 0xa4, + 0x11, 0xa4, 0x4a, 0x1f, 0x49, 0x64, 0x40, 0xb2, 0xa6, 0x1c, 0x1f, 0x23, 0x48, 0x95, 0xec, 0x7d, + 0x1b, 0x5e, 0xcd, 0x47, 0x3a, 0xcf, 0x02, 0x31, 0xe1, 0x99, 0x70, 0x46, 0x14, 0x43, 0xa5, 0xca, + 0xb3, 0xbf, 0xaa, 0x67, 0xfa, 0x54, 0xa2, 0x65, 0x84, 0x45, 0x7e, 0xd8, 0x28, 0x0b, 0x43, 0x47, + 0xb0, 0x33, 0xa1, 0xb6, 0x72, 0x28, 0x79, 0xa3, 0xf8, 0xf6, 0x30, 0x0b, 0xc3, 0x63, 0x76, 0x26, + 0x50, 0xf9, 0x1b, 0x23, 0xd5, 0xb1, 0xfe, 0xa4, 0x0e, 0xb0, 0xc7, 0xbd, 0xd3, 0x63, 0x37, 0x19, + 0x33, 0x81, 0xf1, 0x82, 0xd6, 0x68, 0x4a, 0xe3, 0xb6, 0x84, 0xd4, 0x63, 0xe6, 0x26, 0x5c, 0xd5, + 0xef, 0x8f, 0x72, 0x88, 0xb1, 0x8b, 0x54, 0x49, 0xea, 0x40, 0x99, 0x0a, 0x2b, 0x63, 0x65, 0xd2, + 0x47, 0xe6, 0x47, 0x05, 0x6f, 0x71, 0x8c, 0x38, 0x8f, 0x89, 0xb7, 0x8b, 0xfc, 0xce, 0x5e, 0x31, + 0xfc, 0xf8, 0x3c, 0x36, 0xdf, 0x87, 0xd5, 0x84, 0x8d, 0x12, 0x96, 0x4e, 0x1c, 0x91, 0x96, 0x1f, + 0x26, 0xc3, 0x86, 0x65, 0x85, 0x3c, 0x4e, 0xf3, 0x67, 0xbd, 0x0f, 0xab, 0x92, 0x53, 0xf3, 0xcb, + 0x93, 0xfa, 0x7b, 0x59, 0x22, 0xcb, 0xab, 0x7b, 0x03, 0x28, 0x57, 0x23, 0x75, 0xb2, 0x76, 0x42, + 0x43, 0x62, 0xc6, 0x49, 0xc8, 0xd0, 0x3f, 0xdb, 0x9e, 0x60, 0x1c, 0xbc, 0xc3, 0x46, 0x8a, 0xf9, + 0x05, 0xc0, 0xb4, 0xa0, 0xbe, 0xcf, 0x7d, 0x46, 0xac, 0xee, 0x6f, 0xf6, 0x37, 0x28, 0xeb, 0x83, + 0x9c, 0x44, 0xa8, 0x4d, 0x38, 0xf3, 0x6d, 0xa0, 0xe9, 0xa4, 0xf8, 0x5d, 0x3c, 0x2b, 0x06, 0x22, + 0x49, 0x06, 0xdf, 0x87, 0xd5, 0x62, 0x25, 0x8e, 0x2b, 0x1c, 0x31, 0x61, 0xa4, 0x0e, 0xe5, 0x71, + 0x59, 0xce, 0x17, 0xb5, 0x25, 0x8e, 0x27, 0x0c, 0x55, 0xe3, 0x3a, 0xb4, 0xf8, 0xc9, 0xe7, 0x0e, + 0x1e, 0x84, 0xce, 0xe2, 0x83, 0xd0, 0xe4, 0x27, 0x9f, 0xdb, 0x6c, 0x64, 0x7e, 0xb3, 0x6c, 0x4a, + 0xe6, 0x58, 0xd3, 0x25, 0xd6, 0x5c, 0xc9, 0xf1, 0x25, 0xee, 0x58, 0x1f, 0x41, 0x13, 0x5f, 0xe7, + 0x51, 0x6c, 0x6e, 0x40, 0x4b, 0x90, 0x78, 0xa4, 0xca, 0xf4, 0x5f, 0x29, 0x2c, 0x40, 0x21, 0x3b, + 0xb6, 0x26, 0xb2, 0x6c, 0x58, 0xca, 0xd5, 0xe9, 0xe3, 0x28, 0x78, 0x92, 0x31, 0xf3, 0x87, 0xb0, + 0x1c, 0x27, 0x4c, 0x89, 0xbd, 0x93, 0x9d, 0xa2, 0x7b, 0xa2, 0x4e, 0xf0, 0x15, 0x25, 0xa5, 0xf9, + 0x88, 0x53, 0x94, 0xd0, 0x7e, 0x3c, 0xd3, 0xb7, 0x3e, 0x83, 0x6b, 0x39, 0xc5, 0x11, 0xf3, 0x78, + 0xe4, 0xbb, 0xc9, 0x39, 0x59, 0xbe, 0xb9, 0xb9, 0xd3, 0x97, 0x99, 0xfb, 0x88, 0xe6, 0xfe, 0x59, + 0x0d, 0xfa, 0x8f, 0xa2, 0x9d, 0x2c, 0x0e, 0x03, 0xb4, 0x46, 0x9f, 0x48, 0x63, 0x21, 0x95, 0x74, + 0xa5, 0xac, 0xa4, 0xd7, 0x61, 0xa0, 0x9e, 0x82, 0x7c, 0x94, 0x0a, 0x56, 0xe5, 0x96, 0x24, 0x7c, + 0x9b, 0x87, 0x52, 0xbb, 0x7e, 0x1f, 0x56, 0x33, 0x7a, 0x73, 0x49, 0x39, 0x61, 0xde, 0xa9, 0x73, + 0x49, 0xe0, 0x67, 0x4a, 0x42, 0x1c, 0x8a, 0x64, 0xa4, 0x36, 0x6f, 0x40, 0xa7, 0x18, 0xae, 0x2d, + 0x05, 0xe4, 0x84, 0xb4, 0x12, 0x1e, 0x39, 0xbe, 0x5e, 0xb2, 0xf2, 0x53, 0xd0, 0xc6, 0xf4, 0x79, + 0xf1, 0x26, 0xa8, 0xb6, 0x7e, 0x0f, 0x96, 0x67, 0x28, 0x69, 0x15, 0x4d, 0x5a, 0xc5, 0x7b, 0xc5, + 0x36, 0xce, 0xbe, 0x7e, 0xb9, 0x8b, 0xeb, 0x91, 0x36, 0x7d, 0x89, 0xcf, 0x42, 0xb5, 0x2a, 0x1b, + 0x47, 0x3c, 0x61, 0xea, 0x80, 0xa0, 0x2a, 0xa3, 0xfe, 0xf5, 0x03, 0xb8, 0xb2, 0x68, 0x96, 0x05, + 0x86, 0x79, 0xad, 0x6c, 0x98, 0xe7, 0x82, 0xd6, 0xc2, 0x48, 0xff, 0x45, 0x05, 0x3a, 0x0f, 0xb3, + 0xe7, 0xcf, 0xcf, 0xa5, 0xc2, 0x33, 0xbb, 0x50, 0x39, 0xa0, 0x59, 0xaa, 0x76, 0xe5, 0x00, 0xfd, + 0xe1, 0xc3, 0x53, 0x54, 0xbe, 0x34, 0x49, 0xdb, 0x56, 0x3d, 0x0c, 0x77, 0x0f, 0x4f, 0x8f, 0x5f, + 0xa0, 0x76, 0x24, 0x1a, 0xe3, 0xb4, 0xfb, 0x59, 0x10, 0xa2, 0x7f, 0xa7, 0x34, 0x4c, 0xde, 0xc7, + 0x00, 0x72, 0x77, 0x24, 0xe5, 0xe5, 0x61, 0xc2, 0xa7, 0x52, 0xa2, 0x95, 0x5e, 0x5f, 0x80, 0xb1, + 0x7e, 0x5d, 0x07, 0xe3, 0x63, 0x37, 0x9d, 0xfc, 0x84, 0x07, 0x91, 0xf9, 0x3e, 0xb4, 0x3f, 0xe7, + 0x41, 0x24, 0x33, 0x37, 0x32, 0xa7, 0xbb, 0x22, 0x17, 0x71, 0xc0, 0x7d, 0xb6, 0x81, 0x34, 0xb8, + 0x1a, 0xdb, 0xf8, 0x5c, 0xb5, 0x94, 0x39, 0x4c, 0x82, 0xf1, 0x44, 0x38, 0x08, 0x54, 0x76, 0xab, + 0x13, 0xa4, 0x36, 0xc2, 0x68, 0xd6, 0xd7, 0x01, 0x3d, 0x83, 0x89, 0xc3, 0x23, 0x27, 0x3e, 0x55, + 0x51, 0xa1, 0x81, 0x90, 0x47, 0xd1, 0xe1, 0x29, 0xea, 0xb5, 0x20, 0x75, 0x54, 0x7e, 0x88, 0x5e, + 0x67, 0x26, 0xb8, 0xbe, 0x09, 0x7d, 0xf4, 0xc7, 0xd2, 0xd3, 0x20, 0x76, 0xe2, 0x84, 0x9f, 0xe8, + 0x77, 0x41, 0x2f, 0xed, 0xe8, 0x34, 0x88, 0x0f, 0x11, 0x46, 0x6e, 0x90, 0xca, 0x3a, 0xa1, 0x70, + 0x49, 0x7f, 0x03, 0x14, 0x08, 0xd9, 0x42, 0xa9, 0xa5, 0x50, 0xc6, 0x18, 0x2d, 0x12, 0xbd, 0x56, + 0xc2, 0x42, 0x0c, 0x26, 0x10, 0x85, 0x62, 0x4f, 0x28, 0x43, 0xa2, 0x3c, 0x2e, 0x51, 0x5f, 0x07, + 0x08, 0xd9, 0x08, 0x0f, 0x50, 0xe4, 0xcb, 0x28, 0x7c, 0x2e, 0x85, 0x83, 0xd8, 0x6d, 0x44, 0x9a, + 0xef, 0x40, 0x47, 0x72, 0x41, 0xd2, 0xc2, 0x05, 0x5a, 0x20, 0xb4, 0x24, 0xbe, 0x03, 0x9d, 0x88, + 0x47, 0x0e, 0x7b, 0x42, 0xd4, 0x4a, 0x27, 0xce, 0x4c, 0x1c, 0xf1, 0xe8, 0xc1, 0x13, 0x24, 0x36, + 0xef, 0xaa, 0x35, 0xc8, 0x44, 0x48, 0xf7, 0x92, 0x44, 0x08, 0xad, 0x44, 0xa6, 0x04, 0x3e, 0xd0, + 0x2b, 0x91, 0x23, 0x7a, 0x97, 0x8c, 0x90, 0xeb, 0x91, 0x43, 0xd6, 0xa0, 0x4b, 0xfb, 0x3e, 0x75, + 0x63, 0x47, 0xb8, 0x63, 0xe5, 0xb7, 0x02, 0xc2, 0xf6, 0xdd, 0xf8, 0xd8, 0x1d, 0x9b, 0x36, 0xbc, + 0xaa, 0x92, 0xa4, 0xca, 0xc2, 0x3b, 0x27, 0x28, 0x71, 0x92, 0x6b, 0x4b, 0x3a, 0x91, 0xb2, 0x38, + 0xbd, 0x7a, 0x75, 0x26, 0xbd, 0x4a, 0x92, 0x4a, 0x51, 0xdc, 0x9f, 0x57, 0xc1, 0xd8, 0xe3, 0x3c, + 0xfe, 0x8a, 0xa2, 0x57, 0xde, 0xd2, 0xea, 0xe5, 0x5b, 0x5a, 0x9b, 0xdd, 0xd2, 0x39, 0xd6, 0xd7, + 0xbf, 0x3c, 0xeb, 0x1b, 0x2f, 0xcd, 0xfa, 0xe6, 0x57, 0x60, 0x7d, 0x6b, 0x9e, 0xf5, 0x56, 0x0b, + 0x1a, 0x47, 0x4c, 0x3c, 0x8a, 0xad, 0x5f, 0x18, 0xd0, 0xde, 0x61, 0x7e, 0x26, 0x19, 0x56, 0x7e, + 0xfd, 0xca, 0xe5, 0xaf, 0x5f, 0x9d, 0x7d, 0x7d, 0x34, 0xf2, 0x5a, 0xa2, 0x17, 0xa8, 0x77, 0x43, + 0x0b, 0x34, 0x8a, 0x7e, 0x21, 0xcf, 0x2a, 0xb1, 0x36, 0xc3, 0xa6, 0x5c, 0x9c, 0x5f, 0x2c, 0x1b, + 0x8d, 0xaf, 0x24, 0x1b, 0x73, 0x5a, 0xe1, 0x42, 0xca, 0xed, 0x0b, 0xb9, 0x36, 0xaf, 0x11, 0x8c, + 0x0b, 0x1a, 0x61, 0x0f, 0x56, 0x66, 0x4c, 0x8d, 0x2b, 0x33, 0x14, 0x6d, 0x12, 0xbd, 0xd7, 0x4b, + 0xa2, 0x57, 0x32, 0x0c, 0x32, 0x6f, 0x61, 0x2f, 0xf3, 0x79, 0x10, 0xaa, 0x29, 0x1f, 0xb7, 0x86, + 0x2c, 0x28, 0x79, 0xdb, 0xb2, 0x2e, 0xd4, 0x25, 0xe8, 0x36, 0x0f, 0x49, 0xc1, 0x7f, 0x04, 0x4b, + 0x05, 0x95, 0x94, 0x91, 0xce, 0x25, 0x32, 0xd2, 0xd3, 0x03, 0xa5, 0x98, 0xfc, 0x26, 0xb4, 0xc0, + 0x7b, 0xb0, 0xa2, 0xd3, 0x31, 0xca, 0xf1, 0xa2, 0x1d, 0xec, 0x93, 0x04, 0x0d, 0x54, 0x06, 0x86, + 0x7c, 0x2e, 0xda, 0xa2, 0xef, 0xc2, 0x95, 0x12, 0x39, 0x5a, 0xea, 0xb2, 0x36, 0x28, 0xcb, 0xca, + 0x72, 0x3e, 0x16, 0xbb, 0x7b, 0x32, 0xb5, 0xdc, 0xf1, 0x59, 0xa8, 0x1f, 0x34, 0x1c, 0xc8, 0x00, + 0xd1, 0x67, 0xa1, 0x2a, 0x5e, 0xed, 0xc3, 0x4d, 0x8c, 0xc3, 0xc8, 0x1f, 0x71, 0x63, 0x91, 0x25, + 0xcc, 0x89, 0x43, 0xd7, 0x63, 0x13, 0x1e, 0xfa, 0x2c, 0x29, 0x16, 0xb7, 0x4c, 0x8b, 0xbb, 0xc1, + 0x43, 0x1f, 0x5d, 0x12, 0x49, 0x79, 0x58, 0x10, 0xea, 0xb5, 0x6e, 0xc1, 0x9b, 0x17, 0xa6, 0x43, + 0xc3, 0x51, 0x4c, 0x64, 0xd2, 0x44, 0xaf, 0xce, 0x4e, 0x84, 0x24, 0x7a, 0x8a, 0x0f, 0x60, 0x55, + 0xee, 0x9d, 0x14, 0xee, 0x53, 0xc6, 0x62, 0x27, 0x74, 0x53, 0x31, 0x5c, 0x91, 0xb6, 0x95, 0x90, + 0x24, 0xc0, 0x9f, 0x30, 0x16, 0xef, 0xb9, 0xf2, 0xa9, 0x72, 0x88, 0x8a, 0x91, 0x68, 0xcc, 0x0c, + 0x6f, 0xaf, 0xc8, 0xa7, 0x12, 0x95, 0x0c, 0x94, 0x70, 0x70, 0x89, 0xc9, 0xdf, 0x83, 0xd7, 0x66, + 0xa6, 0x98, 0xba, 0xc9, 0x69, 0x11, 0x34, 0x0c, 0x57, 0x89, 0x6f, 0xd7, 0x4a, 0xe3, 0xf7, 0x89, + 0x40, 0xce, 0x60, 0xfd, 0x67, 0x03, 0xfa, 0x64, 0x87, 0x7f, 0xab, 0x36, 0x7e, 0xab, 0x36, 0xfe, + 0x1f, 0xa8, 0x0d, 0xeb, 0x0f, 0x2a, 0xd0, 0x3a, 0x4c, 0xb8, 0x9f, 0x79, 0xe2, 0x2b, 0x4a, 0xfa, + 0xac, 0x04, 0xd5, 0xbe, 0x48, 0x82, 0xea, 0x17, 0xcc, 0xf5, 0xcf, 0x2b, 0xd0, 0x56, 0x4b, 0xd8, + 0xdb, 0xfc, 0x8a, 0x8b, 0x28, 0x0a, 0x6f, 0x95, 0x85, 0x85, 0xb7, 0x2f, 0x5c, 0x05, 0x0a, 0xd6, + 0x53, 0x79, 0xa9, 0x80, 0xc7, 0xd2, 0xa7, 0x6a, 0x48, 0xc1, 0x92, 0xd0, 0x47, 0x31, 0xee, 0x9d, + 0xf5, 0x0c, 0xda, 0x14, 0x95, 0x92, 0x66, 0xb8, 0x0a, 0xcd, 0x84, 0x2a, 0x4b, 0x6a, 0xa1, 0xaa, + 0xf7, 0xe2, 0x73, 0x5a, 0xfd, 0x6a, 0xae, 0xdf, 0xdf, 0x54, 0xa0, 0x47, 0x29, 0x82, 0x87, 0x59, + 0x24, 0x4f, 0xc2, 0xe2, 0x18, 0x76, 0x0d, 0xea, 0x09, 0x46, 0xf2, 0xf2, 0x31, 0x5d, 0xf9, 0x98, + 0x6d, 0x1e, 0xee, 0xb0, 0x91, 0x4d, 0x18, 0x64, 0x95, 0x9b, 0x8c, 0xd3, 0x45, 0x35, 0x4a, 0x84, + 0xe3, 0x5b, 0xc5, 0x6e, 0xe2, 0x4e, 0x53, 0x5d, 0xa3, 0x94, 0x3d, 0xd3, 0x84, 0x3a, 0x9d, 0x37, + 0xc9, 0x16, 0x6a, 0xab, 0x10, 0x31, 0x0d, 0xa2, 0x71, 0xae, 0x3c, 0x0c, 0x2a, 0x4d, 0x8f, 0x43, + 0x66, 0x6d, 0xc1, 0xaa, 0xae, 0xcd, 0xe0, 0xa1, 0xdc, 0x44, 0x89, 0xa3, 0x88, 0x5e, 0xcf, 0x54, + 0x29, 0xcd, 0x74, 0x05, 0x1a, 0xe5, 0xcb, 0x1c, 0xb2, 0x63, 0xdd, 0x82, 0xce, 0x28, 0x08, 0x99, + 0xca, 0x8a, 0xe2, 0xd2, 0x54, 0x7e, 0xb4, 0x42, 0xd7, 0x19, 0x54, 0xcf, 0xfa, 0xbb, 0x0a, 0x5c, + 0x8b, 0xdd, 0xe4, 0x49, 0xc6, 0x04, 0xe5, 0x46, 0xa9, 0x96, 0xe7, 0xa4, 0x13, 0x37, 0xf1, 0x51, + 0x3c, 0x69, 0x0a, 0x39, 0xbb, 0xbc, 0x5f, 0xd0, 0x46, 0x88, 0x5c, 0xcb, 0x6d, 0x58, 0x2a, 0x8d, + 0x10, 0x6e, 0xa2, 0x43, 0xfe, 0x5e, 0xc2, 0x9f, 0x51, 0x49, 0xf6, 0x08, 0x81, 0x18, 0xb6, 0x15, + 0x74, 0x8c, 0x74, 0x3a, 0x95, 0xe9, 0x35, 0xd5, 0x83, 0xc8, 0x47, 0xf9, 0x8c, 0xb2, 0xa9, 0x4c, + 0x07, 0xc9, 0x2b, 0x1f, 0xad, 0x28, 0x9b, 0x52, 0x06, 0xe8, 0x0a, 0x34, 0x4e, 0xce, 0x05, 0xf9, + 0xc4, 0x08, 0x97, 0x1d, 0xeb, 0x5f, 0xea, 0xd0, 0xd5, 0x2c, 0xa2, 0xb2, 0xfb, 0xbb, 0xe5, 0x3d, + 0xed, 0x6c, 0x0e, 0xf4, 0xe6, 0x20, 0xc9, 0x96, 0x10, 0x89, 0x8e, 0x6a, 0xe5, 0x5e, 0xbf, 0x06, + 0xf4, 0x22, 0x4e, 0x1a, 0x3c, 0x67, 0xb4, 0xe1, 0x35, 0xdb, 0x40, 0x00, 0xd5, 0x4f, 0xb7, 0x60, + 0xb9, 0xc4, 0x3a, 0x47, 0x70, 0xe1, 0x86, 0x6a, 0xcf, 0x4b, 0xa5, 0x9d, 0x12, 0x89, 0xbd, 0x84, + 0x1d, 0x99, 0x6e, 0x3e, 0x46, 0x6a, 0x94, 0xa5, 0x3c, 0x3f, 0x71, 0x41, 0x96, 0x10, 0x43, 0x49, + 0xeb, 0x84, 0xa1, 0x6a, 0x4a, 0x9f, 0x84, 0x4a, 0x32, 0xda, 0x12, 0x72, 0xf4, 0x24, 0xcc, 0x17, + 0x48, 0x82, 0xdf, 0x24, 0x31, 0xa5, 0x05, 0xd2, 0x91, 0x7d, 0x0f, 0x3a, 0x3c, 0x09, 0xc6, 0x41, + 0x24, 0x93, 0x20, 0xad, 0x05, 0x0f, 0x01, 0x49, 0x40, 0x29, 0x11, 0x0b, 0x9a, 0xf2, 0x30, 0x2d, + 0x48, 0x64, 0x2b, 0x0c, 0x6e, 0x66, 0x2a, 0x92, 0xc0, 0x13, 0xb8, 0x1c, 0x67, 0xca, 0x7d, 0x7d, + 0xf7, 0xa1, 0x27, 0xc1, 0x47, 0x4f, 0x42, 0x4a, 0xdc, 0xdd, 0x86, 0x25, 0x8f, 0x87, 0xd9, 0x34, + 0xa2, 0x95, 0x39, 0x21, 0x8b, 0xc8, 0x8a, 0x34, 0xec, 0x9e, 0x04, 0xe3, 0xfa, 0xf6, 0x58, 0xa4, + 0x6a, 0x9b, 0x6e, 0x18, 0xa2, 0x42, 0xe2, 0xae, 0xaf, 0x52, 0xd7, 0x5d, 0x0d, 0xdc, 0xe3, 0xae, + 0x6f, 0x7e, 0x07, 0xae, 0x23, 0xce, 0x61, 0xd3, 0x58, 0x9c, 0x3b, 0x51, 0x36, 0x65, 0x49, 0xe0, + 0x39, 0x6e, 0xea, 0x3c, 0x67, 0x09, 0x57, 0xd5, 0x90, 0xab, 0x48, 0xf1, 0x00, 0x09, 0x0e, 0x24, + 0x7e, 0x2b, 0xfd, 0x8c, 0x25, 0xdc, 0xfc, 0x8c, 0x92, 0x77, 0x8b, 0xe4, 0x56, 0x5b, 0x92, 0xb7, + 0x8a, 0xbd, 0xba, 0x84, 0x92, 0x4a, 0x45, 0x88, 0xb0, 0xb5, 0xc0, 0xd2, 0x78, 0xcb, 0x03, 0x38, + 0x12, 0x09, 0x73, 0xa7, 0x24, 0x59, 0x6f, 0x43, 0x4b, 0x9c, 0x84, 0x54, 0xd3, 0xa8, 0x2c, 0xac, + 0x69, 0x34, 0xc5, 0x09, 0xf2, 0xbc, 0x74, 0xc6, 0xaa, 0x24, 0xaa, 0xaa, 0x87, 0x12, 0x1c, 0x06, + 0xd3, 0x40, 0xa8, 0x2b, 0x4f, 0xb2, 0x63, 0x9d, 0x40, 0x9b, 0x66, 0xa0, 0x67, 0xe4, 0x97, 0x0f, + 0x2a, 0x2f, 0xbe, 0x7c, 0xf0, 0x1e, 0x74, 0x95, 0x5e, 0xbc, 0xec, 0x36, 0x43, 0x47, 0xe2, 0xb1, + 0x9d, 0x5a, 0xef, 0x42, 0xfb, 0x77, 0xdd, 0x30, 0x93, 0xcf, 0xb8, 0x01, 0x1d, 0x2a, 0x93, 0x39, + 0x27, 0x21, 0xf7, 0x4e, 0x75, 0xf9, 0x86, 0x40, 0xf7, 0x11, 0x62, 0x01, 0x18, 0x8f, 0xa3, 0x80, + 0x47, 0x5b, 0x61, 0x68, 0xfd, 0x43, 0x13, 0xda, 0x1f, 0xbb, 0xe9, 0x84, 0xd4, 0x28, 0x1e, 0x61, + 0xba, 0x5a, 0x41, 0xa9, 0x95, 0xa9, 0x1b, 0xab, 0xeb, 0x15, 0x1d, 0x04, 0x22, 0xd5, 0xbe, 0x1b, + 0xcf, 0x65, 0x5e, 0xaa, 0x73, 0x99, 0x97, 0xb7, 0xe4, 0x4d, 0x37, 0x59, 0xa8, 0x63, 0xba, 0x5e, + 0x4f, 0x13, 0xdc, 0x97, 0x20, 0xf3, 0x5d, 0x30, 0x89, 0xc4, 0x0d, 0x43, 0x4e, 0xee, 0x4e, 0xca, + 0xc2, 0x54, 0x25, 0x69, 0x06, 0x88, 0xd9, 0x52, 0x88, 0x23, 0x26, 0xcf, 0x4f, 0xc9, 0x76, 0x36, + 0xe6, 0x6d, 0xe7, 0x1d, 0x00, 0xf4, 0x0a, 0x29, 0x77, 0x3b, 0x17, 0x1c, 0xcb, 0x0c, 0x49, 0x81, + 0xfd, 0x12, 0x9e, 0xda, 0xdb, 0x30, 0xc8, 0x29, 0x12, 0x36, 0x72, 0xbc, 0x48, 0x28, 0x77, 0xad, + 0xa7, 0xa8, 0x6c, 0x36, 0xda, 0x8e, 0xc4, 0xbc, 0x4b, 0xd7, 0xbe, 0xe0, 0xd2, 0xfd, 0x18, 0x56, + 0xe6, 0x0c, 0x5c, 0x1a, 0x33, 0x4f, 0x55, 0xf0, 0x5f, 0xe6, 0xd2, 0xd8, 0xab, 0x60, 0x50, 0x41, + 0xc4, 0xcf, 0x62, 0x75, 0xb6, 0x5a, 0x41, 0x4a, 0xae, 0xf7, 0x65, 0x6e, 0x63, 0xf7, 0xff, 0xca, + 0x6d, 0xec, 0x7d, 0x39, 0xb7, 0xb1, 0xff, 0xe5, 0xdc, 0xc6, 0x39, 0x37, 0x6b, 0x69, 0x3e, 0x3a, + 0xbb, 0x34, 0x16, 0x1a, 0x5c, 0x1a, 0x0b, 0x7d, 0x41, 0x20, 0xb3, 0xfc, 0xc2, 0x40, 0xe6, 0x4b, + 0x44, 0x52, 0xe6, 0x17, 0x44, 0x52, 0xd6, 0x63, 0x00, 0xb2, 0x91, 0xb4, 0xe4, 0xcb, 0xf6, 0xbc, + 0xf2, 0xb2, 0x7b, 0x6e, 0xfd, 0x77, 0x05, 0xe0, 0xc8, 0x9d, 0xc6, 0xd2, 0x95, 0x31, 0x7f, 0x04, + 0x9d, 0x94, 0x7a, 0xe5, 0x44, 0xd6, 0x8d, 0xd2, 0xbd, 0xd8, 0x9c, 0x54, 0x35, 0x29, 0xa9, 0x05, + 0x69, 0xde, 0x26, 0x71, 0x95, 0x33, 0xe4, 0x75, 0xc0, 0x86, 0x26, 0x20, 0xe3, 0x7b, 0x0b, 0xfa, + 0x8a, 0x20, 0x66, 0x89, 0xc7, 0x22, 0xa9, 0xc3, 0x2a, 0x76, 0x4f, 0x42, 0x0f, 0x25, 0xd0, 0xfc, + 0x20, 0x27, 0x93, 0x56, 0x20, 0x5d, 0x10, 0x8d, 0xa9, 0x21, 0xdb, 0x92, 0xc0, 0xda, 0xd4, 0xaf, + 0x42, 0x0b, 0x31, 0xa0, 0x8e, 0xcf, 0x1b, 0xbc, 0x62, 0x76, 0xa0, 0xa5, 0x66, 0x1d, 0x54, 0xcc, + 0x1e, 0xb4, 0xe9, 0xc2, 0x1d, 0xe1, 0xaa, 0xd6, 0x3f, 0x2e, 0x43, 0x67, 0x37, 0x4a, 0x45, 0x92, + 0x49, 0xd1, 0x2c, 0xee, 0x95, 0x35, 0xe8, 0x5e, 0x99, 0x2a, 0x29, 0xcb, 0xd7, 0xa0, 0x92, 0xf2, + 0x7b, 0xd0, 0x52, 0x37, 0x18, 0x95, 0x7f, 0xbb, 0xf0, 0xfa, 0xa3, 0xa6, 0x31, 0x37, 0xc0, 0xf0, + 0xd5, 0xd5, 0x4a, 0x95, 0xad, 0x2b, 0xdd, 0x77, 0xd4, 0x97, 0x2e, 0xed, 0x9c, 0xc6, 0x7c, 0x0b, + 0x6a, 0xee, 0x78, 0x4c, 0xda, 0x87, 0xea, 0x4c, 0x9a, 0x94, 0x8c, 0x89, 0x8d, 0x38, 0xf3, 0x2e, + 0xb4, 0x49, 0x2d, 0x52, 0xc2, 0xba, 0x39, 0x3f, 0xa7, 0xce, 0x86, 0x4b, 0x4d, 0x49, 0xae, 0xf1, + 0x5d, 0x68, 0x87, 0x9c, 0xc7, 0x72, 0x40, 0x6b, 0x7e, 0x80, 0xce, 0x61, 0xda, 0x46, 0xa8, 0xb3, + 0x99, 0xb7, 0xa1, 0x89, 0x6e, 0x0a, 0x8f, 0x95, 0x79, 0x2f, 0xad, 0x83, 0x72, 0x79, 0x76, 0x23, + 0xc5, 0x1f, 0x73, 0x13, 0x40, 0xca, 0x35, 0xcd, 0xdc, 0x9e, 0x67, 0x47, 0x1e, 0xb6, 0xe3, 0xe1, + 0xd3, 0x11, 0xfc, 0x7d, 0x18, 0xc8, 0x10, 0xad, 0x34, 0x12, 0x74, 0x09, 0x55, 0x8f, 0x9c, 0x8d, + 0xfa, 0xed, 0x7e, 0x32, 0x9b, 0x05, 0x78, 0x07, 0x5a, 0xb1, 0x8c, 0x51, 0x48, 0x73, 0x74, 0x36, + 0x97, 0x8b, 0xa1, 0x2a, 0x78, 0xb1, 0x35, 0x85, 0xf9, 0x03, 0xe8, 0xcb, 0x52, 0xdf, 0x48, 0x39, + 0xeb, 0x94, 0x1f, 0x9e, 0xb9, 0x39, 0x37, 0xe3, 0xcb, 0xdb, 0x3d, 0x31, 0xe3, 0xda, 0x7f, 0x17, + 0x7a, 0xc5, 0x4d, 0x26, 0xcf, 0x8d, 0x48, 0x9f, 0x74, 0x36, 0xaf, 0x16, 0xc3, 0xcb, 0x5e, 0xa3, + 0xdd, 0x65, 0x65, 0x1f, 0x72, 0x1d, 0x9a, 0xaa, 0xfc, 0x3c, 0xa0, 0x51, 0xa5, 0xfb, 0xe3, 0xb2, + 0x96, 0x61, 0x2b, 0x3c, 0xf2, 0x65, 0x46, 0xc5, 0x9e, 0xb2, 0x73, 0x52, 0x2b, 0x33, 0x7c, 0x99, + 0x2d, 0x1d, 0xcd, 0xd4, 0x9f, 0x3e, 0x61, 0xe7, 0xb8, 0x1f, 0x45, 0x75, 0x6e, 0x68, 0xce, 0xef, + 0x47, 0x5e, 0x9a, 0xb3, 0xdb, 0x79, 0x55, 0xce, 0x7c, 0x30, 0x5b, 0x2d, 0x94, 0x05, 0x97, 0x15, + 0x1a, 0xfa, 0xea, 0x82, 0xa1, 0xb2, 0xee, 0x62, 0x2f, 0xc5, 0x73, 0x45, 0xc7, 0x77, 0xc1, 0xe0, + 0x89, 0x4f, 0xd7, 0x15, 0x28, 0x2d, 0x44, 0x7b, 0x42, 0x45, 0x52, 0x79, 0xf5, 0x93, 0x14, 0x50, + 0x8b, 0xcb, 0x0e, 0x3a, 0x1d, 0x71, 0xc2, 0x3f, 0x67, 0x9e, 0x90, 0xea, 0x6f, 0xf5, 0xa2, 0xd3, + 0xa1, 0xf0, 0xe4, 0x9d, 0xde, 0x84, 0x96, 0x2e, 0xcc, 0x5f, 0xbd, 0x40, 0xa9, 0x51, 0xe6, 0x87, + 0xb0, 0x34, 0xab, 0x14, 0xd3, 0xe1, 0xb5, 0x0b, 0xd4, 0xfd, 0x19, 0x1d, 0x88, 0x96, 0x5a, 0x79, + 0x52, 0xc3, 0x8b, 0x05, 0x31, 0x42, 0xa0, 0xaf, 0xab, 0x7c, 0xb0, 0x57, 0x2f, 0xfa, 0xba, 0xca, + 0x1f, 0x1b, 0x42, 0x2b, 0x48, 0x1f, 0x06, 0x49, 0x2a, 0x86, 0xd7, 0xb5, 0xe5, 0xa4, 0x2e, 0x7a, + 0x70, 0x41, 0x8a, 0x26, 0x64, 0xf8, 0x9a, 0xbe, 0x2c, 0x4c, 0x06, 0xe5, 0x0e, 0x34, 0xd5, 0xa5, + 0x85, 0xb5, 0x0b, 0x5a, 0x41, 0x5d, 0xf4, 0xb1, 0x15, 0x85, 0xf9, 0x75, 0x68, 0x51, 0xc5, 0x9a, + 0xc7, 0xc3, 0xb7, 0xe6, 0xa5, 0x48, 0x96, 0x8d, 0xed, 0x66, 0x28, 0xcb, 0xc7, 0xef, 0x40, 0x4b, + 0x3b, 0x30, 0xd6, 0xfc, 0xc9, 0x50, 0x8e, 0x8c, 0xad, 0x29, 0xcc, 0x5b, 0xd0, 0x98, 0xa2, 0x2e, + 0x1c, 0x7e, 0x6d, 0xfe, 0x94, 0x4b, 0x15, 0x29, 0xb1, 0xe6, 0x3d, 0xe8, 0xa4, 0xe4, 0xbb, 0x4a, + 0xf1, 0xbf, 0xa9, 0xab, 0xbd, 0xc5, 0xc7, 0x12, 0xda, 0xb1, 0xb5, 0x21, 0x2d, 0x9c, 0xdc, 0xdf, + 0x87, 0xeb, 0xe5, 0x52, 0xb1, 0xae, 0x23, 0xab, 0xd8, 0xef, 0x16, 0xcd, 0xf2, 0xd6, 0x02, 0x09, + 0x9b, 0xad, 0x38, 0xdb, 0xd7, 0xe2, 0x4b, 0x4a, 0xd1, 0xf7, 0x72, 0x4b, 0x83, 0x07, 0x7b, 0x78, + 0xfb, 0xc2, 0xb2, 0x72, 0x5b, 0xa5, 0xed, 0x0f, 0x99, 0xb8, 0x8f, 0xa0, 0x3b, 0xca, 0x9e, 0x3f, + 0x3f, 0x57, 0x32, 0x32, 0x7c, 0x9b, 0xc6, 0x95, 0xa2, 0xb0, 0x52, 0xe1, 0xd3, 0xee, 0x8c, 0x4a, + 0x55, 0xd0, 0x6b, 0xd0, 0xf2, 0x22, 0xc7, 0xf5, 0xfd, 0x64, 0xb8, 0x2e, 0x0b, 0x9f, 0x5e, 0xb4, + 0xe5, 0xfb, 0x54, 0x41, 0xe6, 0x31, 0xa3, 0xfb, 0xcb, 0x4e, 0xe0, 0x0f, 0xbf, 0x2e, 0x6d, 0x9e, + 0x06, 0xed, 0xfa, 0xf4, 0x1d, 0x85, 0x0e, 0x5d, 0x02, 0x7f, 0x78, 0x47, 0x7d, 0x47, 0xa1, 0x40, + 0xbb, 0x3e, 0xfa, 0xb2, 0x53, 0xf7, 0xcc, 0xd1, 0x90, 0xe1, 0x3b, 0x32, 0x9e, 0x9d, 0xba, 0x67, + 0x87, 0x0a, 0x84, 0x67, 0x5b, 0xde, 0x4d, 0x23, 0x8d, 0xf9, 0xee, 0xfc, 0xd9, 0xce, 0x13, 0x21, + 0x76, 0x3b, 0xc8, 0x73, 0x22, 0xa4, 0x0f, 0x48, 0x0b, 0x3a, 0xe1, 0xe6, 0xf0, 0xbd, 0x8b, 0xfa, + 0x40, 0xe5, 0x79, 0x50, 0x1f, 0xe8, 0x94, 0xcf, 0x26, 0x80, 0x54, 0x97, 0xb4, 0xd9, 0x1b, 0xf3, + 0x63, 0xf2, 0x00, 0xc3, 0x96, 0x17, 0xb3, 0x68, 0xab, 0x37, 0x01, 0xa8, 0x78, 0x2c, 0xc7, 0xdc, + 0x9d, 0x1f, 0x93, 0x07, 0x0c, 0x76, 0xfb, 0x69, 0x1e, 0x3b, 0xdc, 0x85, 0x76, 0x86, 0xa1, 0x01, + 0x3a, 0xe7, 0xc3, 0xf7, 0xe7, 0xcf, 0x80, 0x8e, 0x1a, 0x6c, 0x23, 0x53, 0x2d, 0x7c, 0x08, 0x99, + 0x3d, 0xf2, 0x80, 0x86, 0x1f, 0xcc, 0x3f, 0x24, 0x0f, 0x2d, 0x6c, 0xb2, 0x8e, 0x32, 0xca, 0xb8, + 0x07, 0x1d, 0xc9, 0x34, 0x39, 0x68, 0x73, 0x5e, 0x46, 0x0a, 0x97, 0xca, 0x96, 0xdc, 0x95, 0xc3, + 0x6e, 0x41, 0xc3, 0x8d, 0xe3, 0xf0, 0x7c, 0xf8, 0xe1, 0xfc, 0xc1, 0xd8, 0x42, 0xb0, 0x2d, 0xb1, + 0x28, 0x4a, 0xd3, 0x2c, 0x14, 0x81, 0xbe, 0x4b, 0xf5, 0x8d, 0x79, 0x51, 0x2a, 0x5d, 0x35, 0xb5, + 0x3b, 0xd3, 0xd2, 0xbd, 0xd3, 0x77, 0xc1, 0x88, 0x79, 0x2a, 0x1c, 0x7f, 0x1a, 0x0e, 0xef, 0x5d, + 0xb0, 0x60, 0xf2, 0x0e, 0x91, 0xdd, 0x8a, 0xd5, 0x25, 0xac, 0x99, 0x0b, 0xd0, 0xdf, 0x9c, 0xbb, + 0x00, 0x7d, 0x0f, 0xba, 0x5b, 0xf4, 0x7d, 0x50, 0x90, 0x92, 0xae, 0xbc, 0x05, 0xf5, 0x3c, 0x5d, + 0x97, 0x2b, 0x61, 0xa2, 0x78, 0xce, 0x76, 0xa3, 0x11, 0xb7, 0x09, 0x6d, 0xfd, 0x7d, 0x1d, 0x9a, + 0x47, 0x3c, 0x4b, 0x3c, 0xf6, 0xc5, 0x97, 0xf0, 0xde, 0xd0, 0x22, 0x11, 0x15, 0x45, 0x7f, 0xb9, + 0xfb, 0x84, 0x9e, 0x2f, 0x57, 0xb6, 0x8b, 0x4c, 0xe0, 0x15, 0x68, 0xc8, 0xd0, 0x50, 0x5e, 0xde, + 0x92, 0x1d, 0x3a, 0x0e, 0x59, 0x3a, 0xf1, 0xf9, 0xb3, 0x08, 0x8f, 0x43, 0x83, 0xee, 0x3e, 0x81, + 0x06, 0xed, 0xfa, 0x14, 0xea, 0x6b, 0x02, 0x3a, 0x6f, 0x4d, 0x19, 0x1f, 0x68, 0x20, 0x9d, 0x3a, + 0x9d, 0x65, 0x6c, 0x5d, 0x92, 0x65, 0x7c, 0x13, 0xea, 0x91, 0xbe, 0x34, 0x94, 0xe3, 0xe9, 0xeb, + 0x12, 0x82, 0x9b, 0x77, 0x20, 0xbf, 0x39, 0xa8, 0x5c, 0x97, 0xcb, 0x6f, 0x16, 0x6e, 0x42, 0x3b, + 0xff, 0xa2, 0x4c, 0x79, 0x2b, 0x57, 0x36, 0x8a, 0x6f, 0xcc, 0x8e, 0x75, 0xcb, 0x2e, 0xc8, 0x16, + 0x24, 0x1e, 0x65, 0xcd, 0x86, 0xf8, 0xd4, 0x79, 0x99, 0xc4, 0x23, 0x15, 0x72, 0x74, 0xd2, 0x35, + 0x48, 0x1d, 0x8f, 0x47, 0xa9, 0x50, 0xc9, 0x8c, 0x56, 0x90, 0x6e, 0x63, 0xd7, 0xfc, 0x36, 0xf4, + 0x12, 0xe6, 0x3d, 0x75, 0xa6, 0xe9, 0x58, 0x3e, 0xa2, 0x57, 0xbe, 0x8b, 0x3c, 0x4d, 0xc7, 0x1f, + 0x33, 0x17, 0x8d, 0xaf, 0x8c, 0x98, 0x3a, 0x48, 0xbb, 0x9f, 0x8e, 0x69, 0xd6, 0x77, 0x60, 0x79, + 0xca, 0xa6, 0x27, 0x2c, 0x49, 0x27, 0x41, 0xac, 0xf5, 0x62, 0x9f, 0xf2, 0x8d, 0x83, 0x02, 0x21, + 0xd7, 0x62, 0xfd, 0x71, 0x05, 0x0c, 0xe4, 0x22, 0xca, 0x92, 0x69, 0x42, 0x7d, 0xea, 0xc5, 0x99, + 0x72, 0x98, 0xa9, 0xad, 0xbe, 0x52, 0x93, 0x52, 0xa2, 0xbe, 0x52, 0xa3, 0x3d, 0xac, 0xc9, 0x04, + 0x23, 0xb6, 0xe5, 0x17, 0x2d, 0xe7, 0x94, 0xc5, 0x91, 0x92, 0xa1, 0xbb, 0xe6, 0x2a, 0x34, 0xbd, + 0x88, 0xa2, 0x61, 0x79, 0x95, 0xac, 0xe1, 0x45, 0x18, 0x05, 0x4b, 0x70, 0x71, 0x39, 0xa2, 0xe1, + 0x45, 0xbb, 0xfe, 0x99, 0xf5, 0xd7, 0x15, 0x58, 0x3e, 0x4c, 0xb8, 0xc7, 0xd2, 0x74, 0x0f, 0x8d, + 0xb5, 0x4b, 0x1e, 0x9b, 0x09, 0x75, 0xca, 0xc2, 0xc9, 0xcf, 0x43, 0xa8, 0x8d, 0x32, 0x2c, 0x53, + 0x15, 0x79, 0x58, 0x52, 0xb3, 0xdb, 0x04, 0xa1, 0xa8, 0x24, 0x47, 0xd3, 0xc0, 0x5a, 0x09, 0x4d, + 0xf9, 0xbb, 0x5b, 0xd0, 0x2f, 0xee, 0x75, 0x95, 0x52, 0x8a, 0xc5, 0x6d, 0x7b, 0x9a, 0xe5, 0x06, + 0x74, 0x12, 0xe2, 0xb2, 0x9c, 0x46, 0xa6, 0x17, 0x41, 0x82, 0x70, 0x1e, 0x6b, 0x02, 0x83, 0xc3, + 0x84, 0xc5, 0x6e, 0xc2, 0x50, 0xaf, 0x4f, 0x89, 0x87, 0x57, 0xa1, 0x19, 0xb2, 0x68, 0x2c, 0x26, + 0x6a, 0xbd, 0xaa, 0x97, 0x7f, 0x41, 0x58, 0x2d, 0x7d, 0x41, 0x88, 0xbc, 0x4c, 0x98, 0xab, 0x3e, + 0x34, 0xa4, 0x36, 0x9e, 0xb1, 0x28, 0x0b, 0x55, 0x66, 0xd0, 0xb0, 0x65, 0xc7, 0xfa, 0x79, 0x0d, + 0x3a, 0x8a, 0x33, 0xf4, 0x14, 0xb9, 0x2b, 0x95, 0x7c, 0x57, 0x06, 0x50, 0x4b, 0x9f, 0x84, 0x6a, + 0x9b, 0xb0, 0x69, 0x7e, 0x08, 0xb5, 0x30, 0x98, 0xaa, 0xa0, 0xe6, 0xb5, 0x19, 0x2b, 0x31, 0xcb, + 0x5f, 0x25, 0x42, 0x48, 0x8d, 0xaa, 0x89, 0x2e, 0xf6, 0xa3, 0xb0, 0x2a, 0x9e, 0xa0, 0xc6, 0x3e, + 0xc3, 0x13, 0x81, 0x4c, 0x75, 0x3d, 0xba, 0xb9, 0xa5, 0x8f, 0x79, 0xcf, 0x6e, 0x2b, 0xc8, 0xae, + 0x6f, 0x7e, 0x03, 0x8c, 0x34, 0x72, 0xe3, 0x74, 0xc2, 0x45, 0x1e, 0xc6, 0x88, 0xb3, 0x68, 0x63, + 0xfb, 0xe0, 0xf8, 0x2c, 0x3a, 0x52, 0x18, 0xf5, 0xb0, 0x9c, 0xd2, 0xfc, 0x01, 0x74, 0x53, 0x96, + 0xa6, 0xf2, 0xae, 0xf6, 0x88, 0xab, 0xe3, 0xbf, 0x5a, 0x8e, 0x50, 0x08, 0x8b, 0x6f, 0xad, 0x85, + 0x3d, 0x2d, 0x40, 0xe6, 0xc7, 0xd0, 0xd7, 0xe3, 0x43, 0x3e, 0x1e, 0xe7, 0x29, 0xcc, 0xd7, 0x2e, + 0xcc, 0xb0, 0x47, 0xe8, 0xd2, 0x3c, 0xbd, 0xb4, 0x8c, 0x30, 0x7f, 0x0c, 0xfd, 0x58, 0x6e, 0xa6, + 0xa3, 0x72, 0xf4, 0x52, 0x8d, 0x5c, 0x9f, 0x71, 0x6a, 0x66, 0x36, 0xbb, 0xb8, 0x7f, 0x59, 0xc0, + 0x53, 0xeb, 0x67, 0x55, 0xe8, 0x94, 0x56, 0x4d, 0xdf, 0x75, 0xa6, 0x2c, 0xd1, 0x29, 0x79, 0x6c, + 0x23, 0x6c, 0xc2, 0xd5, 0x07, 0x4e, 0x6d, 0x9b, 0xda, 0x08, 0x4b, 0xb8, 0x2a, 0xf3, 0xb4, 0x6d, + 0x6a, 0xa3, 0xea, 0x54, 0xa1, 0xa7, 0xfc, 0x04, 0x84, 0x36, 0xa5, 0x6e, 0x77, 0x0b, 0xe0, 0xae, + 0x4f, 0x1f, 0x80, 0xba, 0xc2, 0x3d, 0x71, 0x53, 0x5d, 0x41, 0xc8, 0xfb, 0x78, 0x34, 0x9f, 0xb2, + 0x04, 0xd7, 0xa2, 0xb4, 0xae, 0xee, 0xe2, 0x5e, 0x93, 0x36, 0x7b, 0xce, 0x23, 0x79, 0x05, 0xad, + 0x6b, 0x1b, 0x08, 0xf8, 0x8c, 0x47, 0x34, 0x4c, 0xed, 0x2c, 0xf1, 0xb3, 0x6d, 0xeb, 0x2e, 0xea, + 0xac, 0x27, 0x19, 0x43, 0xc7, 0xcf, 0xa7, 0x3b, 0x48, 0x6d, 0xbb, 0x45, 0xfd, 0x5d, 0xdf, 0xbc, + 0x03, 0x74, 0xdb, 0xd2, 0x79, 0xe6, 0x06, 0x82, 0x44, 0x88, 0x67, 0x82, 0xd4, 0x6b, 0xcd, 0x5e, + 0x42, 0xc4, 0xa7, 0x6e, 0x20, 0x8e, 0x25, 0xd8, 0xfa, 0x8f, 0x0a, 0x2c, 0x5f, 0xd8, 0x18, 0xf4, + 0xc9, 0x70, 0x53, 0xf4, 0x15, 0xda, 0xae, 0xdd, 0xc4, 0xee, 0xae, 0x4f, 0x08, 0x31, 0x25, 0xc1, + 0xab, 0x2a, 0x84, 0x98, 0xa2, 0xd4, 0xad, 0x42, 0x53, 0x9c, 0x11, 0x67, 0xe4, 0x21, 0x6a, 0x88, + 0x33, 0x64, 0xc9, 0x16, 0xc6, 0xc8, 0x63, 0x27, 0x64, 0x4f, 0x59, 0x48, 0x3c, 0xeb, 0x6f, 0xde, + 0x7c, 0x81, 0x44, 0x6c, 0xec, 0xf1, 0xf1, 0x1e, 0xd2, 0x62, 0xd4, 0x2c, 0x5b, 0xd6, 0x4f, 0xc0, + 0xd0, 0x50, 0xb3, 0x0d, 0x8d, 0x1d, 0x76, 0x92, 0x8d, 0x07, 0xaf, 0x98, 0x06, 0xd4, 0x71, 0xc4, + 0xa0, 0x82, 0xad, 0x4f, 0xdd, 0x24, 0x1a, 0x54, 0x11, 0xfd, 0x20, 0x49, 0x78, 0x32, 0xa8, 0x61, + 0xf3, 0xd0, 0x8d, 0x02, 0x6f, 0x50, 0xc7, 0xe6, 0x43, 0x57, 0xb8, 0xe1, 0xa0, 0x61, 0xfd, 0xa2, + 0x01, 0xc6, 0xa1, 0x7a, 0xba, 0xb9, 0x03, 0xbd, 0xfc, 0x33, 0xdc, 0xc5, 0x79, 0x99, 0xc3, 0xf9, + 0x06, 0xe5, 0x65, 0xba, 0x71, 0xa9, 0x37, 0xff, 0x31, 0x6f, 0xf5, 0xc2, 0xc7, 0xbc, 0xaf, 0x43, + 0xed, 0x49, 0x72, 0x3e, 0x5b, 0xb5, 0x3b, 0x0c, 0xdd, 0xc8, 0x46, 0xb0, 0xf9, 0x01, 0x74, 0x50, + 0x46, 0x9c, 0x94, 0x9c, 0x06, 0x95, 0xcb, 0x28, 0x7f, 0x32, 0x4d, 0x70, 0x1b, 0x90, 0x48, 0x39, + 0x16, 0x1b, 0x60, 0x78, 0x93, 0x20, 0xf4, 0x13, 0x16, 0xa9, 0x8a, 0xb8, 0x79, 0x71, 0xc9, 0x76, + 0x4e, 0x63, 0xfe, 0x88, 0xae, 0x7c, 0xea, 0x5c, 0x4c, 0x51, 0xa8, 0x98, 0x39, 0xde, 0xa5, 0x6c, + 0x8d, 0xbd, 0x54, 0x22, 0x27, 0x4b, 0x56, 0x7c, 0xdb, 0xd0, 0x2a, 0x7f, 0xdb, 0x20, 0x3f, 0xd9, + 0x24, 0x73, 0x63, 0xe4, 0x51, 0x18, 0x5a, 0x9b, 0xdb, 0xca, 0x47, 0x68, 0xcf, 0xfb, 0x9f, 0xda, + 0xc2, 0x29, 0x5f, 0xe1, 0x26, 0xf4, 0xd1, 0xf7, 0x70, 0xa4, 0xcb, 0x82, 0x6a, 0x07, 0xd4, 0x87, + 0x55, 0x59, 0x3a, 0xd9, 0x41, 0xa7, 0x05, 0x85, 0xf1, 0x16, 0xf4, 0xf5, 0xbb, 0xa8, 0x0b, 0xab, + 0x1d, 0x55, 0xc8, 0x50, 0x50, 0x79, 0x5f, 0x75, 0x03, 0x56, 0xbc, 0x89, 0x1b, 0x45, 0x2c, 0x74, + 0x4e, 0xb2, 0xd1, 0x48, 0x5b, 0x8b, 0x2e, 0xa5, 0x00, 0x97, 0x15, 0xea, 0x3e, 0x61, 0xc8, 0xf8, + 0x58, 0xd0, 0x8b, 0x82, 0x50, 0xe6, 0xb9, 0xc9, 0x32, 0xf6, 0x88, 0xb2, 0x13, 0x05, 0x21, 0x25, + 0xba, 0xd1, 0x3e, 0xfe, 0x10, 0x06, 0x59, 0x16, 0xf8, 0xa9, 0x23, 0xb8, 0xfe, 0xda, 0x55, 0x65, + 0x4b, 0x4b, 0x79, 0x8a, 0xc7, 0x59, 0xe0, 0x1f, 0x73, 0xf5, 0xbd, 0x6b, 0x8f, 0xe8, 0x75, 0xd7, + 0xfa, 0x21, 0x74, 0xcb, 0xb2, 0x83, 0xb2, 0x48, 0x41, 0xe0, 0xe0, 0x15, 0x13, 0xa0, 0x79, 0xc0, + 0x93, 0xa9, 0x1b, 0x0e, 0x2a, 0xd8, 0x96, 0x5f, 0xfc, 0x0c, 0xaa, 0x66, 0x17, 0x0c, 0x1d, 0x9d, + 0x0c, 0x6a, 0xd6, 0x77, 0xc1, 0xd0, 0x9f, 0xef, 0xd2, 0x77, 0x93, 0xdc, 0x67, 0xd2, 0x77, 0x93, + 0x5a, 0xcc, 0x40, 0x00, 0xf9, 0x6d, 0xfa, 0xab, 0xf5, 0x6a, 0xf1, 0xd5, 0xba, 0xf5, 0x3b, 0xd0, + 0x2d, 0x2f, 0x4e, 0xa7, 0xdd, 0x2a, 0x45, 0xda, 0x6d, 0xc1, 0x28, 0xaa, 0x68, 0x25, 0x7c, 0xea, + 0x94, 0xdc, 0x0b, 0x03, 0x01, 0xf8, 0x18, 0xeb, 0x8f, 0x2a, 0xd0, 0x20, 0x6f, 0x9d, 0xcc, 0x10, + 0x36, 0x8a, 0xb3, 0xd3, 0xb0, 0xdb, 0x04, 0xf9, 0x5f, 0x5c, 0xc4, 0xcb, 0xcb, 0x2b, 0xf5, 0x17, + 0x96, 0x57, 0xee, 0x3c, 0x81, 0xa6, 0xfc, 0xa3, 0x00, 0x73, 0x19, 0x7a, 0x8f, 0xa3, 0xd3, 0x88, + 0x3f, 0x8b, 0x24, 0x60, 0xf0, 0x8a, 0xb9, 0x02, 0x4b, 0x9a, 0xe9, 0xea, 0x1f, 0x09, 0x06, 0x15, + 0x73, 0x00, 0x5d, 0xda, 0x56, 0x0d, 0xa9, 0x9a, 0xaf, 0xc3, 0x50, 0x19, 0x92, 0x1d, 0x1e, 0xb1, + 0x03, 0x2e, 0x82, 0xd1, 0xb9, 0xc6, 0xd6, 0xcc, 0x25, 0xe8, 0x1c, 0x09, 0x1e, 0x1f, 0xb1, 0xc8, + 0x0f, 0xa2, 0xf1, 0xa0, 0x7e, 0xe7, 0x21, 0x34, 0xe5, 0xff, 0x17, 0x94, 0x1e, 0x29, 0x01, 0x83, + 0x57, 0x90, 0x1a, 0xb5, 0x6a, 0x10, 0x8d, 0x0f, 0xd8, 0x99, 0x90, 0x4a, 0x69, 0xcf, 0x4d, 0xc5, + 0xa0, 0x6a, 0xf6, 0x01, 0xd4, 0xac, 0x0f, 0x22, 0x7f, 0x50, 0xbb, 0xbf, 0xfd, 0xcb, 0x5f, 0xbd, + 0x59, 0xf9, 0xa7, 0x5f, 0xbd, 0x59, 0xf9, 0xb7, 0x5f, 0xbd, 0xf9, 0xca, 0x4f, 0xff, 0xfd, 0xcd, + 0xca, 0x67, 0x1f, 0x94, 0xfe, 0x9d, 0x61, 0xea, 0x8a, 0x24, 0x38, 0x93, 0x35, 0x41, 0xdd, 0x89, + 0xd8, 0xdd, 0xf8, 0x74, 0x7c, 0x37, 0x3e, 0xb9, 0xab, 0x65, 0xee, 0xa4, 0x49, 0x7f, 0xba, 0xf0, + 0xe1, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x2c, 0xd5, 0x25, 0xd5, 0xf3, 0x41, 0x00, 0x00, } func (m *Message) Marshal() (dAtA []byte, err error) { @@ -10762,6 +10771,11 @@ func (m *SessionInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.LockWaitTimeout != 0 { + i = encodeVarintPipeline(dAtA, i, uint64(m.LockWaitTimeout)) + i-- + dAtA[i] = 0x50 + } if len(m.QueryId) > 0 { for iNdEx := len(m.QueryId) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.QueryId[iNdEx]) @@ -13321,6 +13335,9 @@ func (m *SessionInfo) ProtoSize() (n int) { n += 1 + l + sovPipeline(uint64(l)) } } + if m.LockWaitTimeout != 0 { + n += 1 + sovPipeline(uint64(m.LockWaitTimeout)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -27550,6 +27567,25 @@ func (m *SessionInfo) Unmarshal(dAtA []byte) error { } m.QueryId = append(m.QueryId, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LockWaitTimeout", wireType) + } + m.LockWaitTimeout = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.LockWaitTimeout |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipPipeline(dAtA[iNdEx:]) diff --git a/pkg/pb/txn/txn.pb.go b/pkg/pb/txn/txn.pb.go index 32c6be6aab043..7de91e9d9cdd4 100644 --- a/pkg/pb/txn/txn.pb.go +++ b/pkg/pb/txn/txn.pb.go @@ -1701,6 +1701,7 @@ type TxnOptions struct { Autocommit bool `protobuf:"varint,15,opt,name=autocommit,proto3" json:"autocommit,omitempty"` InIncrStmt bool `protobuf:"varint,16,opt,name=inIncrStmt,proto3" json:"inIncrStmt,omitempty"` InRollbackStmt bool `protobuf:"varint,17,opt,name=inRollbackStmt,proto3" json:"inRollbackStmt,omitempty"` + LockWaitTimeout int64 `protobuf:"varint,18,opt,name=lockWaitTimeout,proto3" json:"lockWaitTimeout,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1858,6 +1859,13 @@ func (m *TxnOptions) GetInRollbackStmt() bool { return false } +func (m *TxnOptions) GetLockWaitTimeout() int64 { + if m != nil { + return m.LockWaitTimeout + } + return 0 +} + func init() { proto.RegisterEnum("txn.TxnIsolation", TxnIsolation_name, TxnIsolation_value) proto.RegisterEnum("txn.TxnMode", TxnMode_name, TxnMode_value) @@ -1891,106 +1899,107 @@ func init() { func init() { proto.RegisterFile("txn.proto", fileDescriptor_4f782e76b37adb9a) } var fileDescriptor_4f782e76b37adb9a = []byte{ - // 1577 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xcb, 0x6e, 0xdb, 0x46, - 0x17, 0x36, 0x75, 0x25, 0x8f, 0x2e, 0xa6, 0x26, 0x8e, 0xc3, 0xf8, 0xcf, 0xaf, 0x08, 0x44, 0x10, - 0x28, 0x46, 0x7e, 0xeb, 0x4f, 0x82, 0x74, 0xd1, 0x02, 0x01, 0x6c, 0xd9, 0x4e, 0x05, 0x44, 0xb2, - 0x31, 0x52, 0x5a, 0xa4, 0x9b, 0x82, 0x92, 0x26, 0x32, 0x61, 0x89, 0x54, 0xc8, 0x91, 0x21, 0x3f, - 0x4b, 0x37, 0xed, 0x2b, 0xf4, 0x29, 0xb2, 0xcc, 0x13, 0x14, 0x6d, 0x8a, 0x6e, 0xba, 0xed, 0x0b, - 0x14, 0x33, 0x9c, 0xe1, 0x4d, 0x52, 0x52, 0xb8, 0x2b, 0xf1, 0xdc, 0xbe, 0x33, 0x3c, 0x73, 0xbe, - 0x33, 0x1c, 0x81, 0x46, 0x97, 0xce, 0xc1, 0xdc, 0x73, 0xa9, 0x8b, 0xb2, 0x74, 0xe9, 0xec, 0xfd, - 0x6f, 0x62, 0xd3, 0x8b, 0xc5, 0xf0, 0x60, 0xe4, 0xce, 0x5a, 0x13, 0x77, 0xe2, 0xb6, 0xb8, 0x6d, - 0xb8, 0x78, 0xcb, 0x25, 0x2e, 0xf0, 0xa7, 0x20, 0x66, 0x6f, 0x9b, 0xda, 0x33, 0xe2, 0x53, 0x6b, - 0x36, 0x17, 0x8a, 0xea, 0x8c, 0x50, 0x6b, 0x6c, 0x51, 0x4b, 0xc8, 0x30, 0x75, 0x47, 0x97, 0xc1, - 0xb3, 0xf9, 0x67, 0x16, 0x8a, 0x83, 0xa5, 0xd3, 0x25, 0xd4, 0x42, 0x55, 0xc8, 0x74, 0x8e, 0x0d, - 0xa5, 0xa1, 0x34, 0xcb, 0x38, 0xd3, 0x39, 0x46, 0x0f, 0xa1, 0xd0, 0xa7, 0x16, 0x5d, 0xf8, 0x46, - 0xa6, 0xa1, 0x34, 0xab, 0x4f, 0xab, 0x07, 0x6c, 0x61, 0x83, 0xa5, 0x13, 0x68, 0xb1, 0xb0, 0xa2, - 0x2f, 0x01, 0xfa, 0x8e, 0x35, 0xf7, 0x2f, 0x5c, 0x3a, 0xe8, 0x1b, 0xd9, 0x86, 0xd2, 0x2c, 0x3d, - 0xdd, 0x39, 0x88, 0x56, 0x31, 0x90, 0x4f, 0x47, 0xb9, 0xf7, 0xbf, 0xdc, 0xdf, 0xc2, 0x31, 0x6f, - 0x16, 0x7b, 0xee, 0x91, 0xb9, 0xe5, 0x91, 0xf1, 0xa0, 0x6f, 0xe4, 0x3e, 0x1f, 0x1b, 0x79, 0xa3, - 0x2f, 0x40, 0x6d, 0xbb, 0xb3, 0x99, 0xcd, 0xb2, 0xe6, 0x3f, 0x1b, 0x19, 0xfa, 0xa2, 0x67, 0xa0, - 0x0e, 0x7a, 0xfd, 0x0b, 0xcb, 0x1b, 0xfb, 0x46, 0xa1, 0x91, 0x6d, 0x96, 0x9e, 0xd6, 0x0e, 0xc2, - 0x12, 0x09, 0x8b, 0x0c, 0x92, 0x8e, 0xe8, 0x39, 0xc0, 0x2b, 0x77, 0x74, 0x39, 0xb0, 0x86, 0x53, - 0xe2, 0x1b, 0x45, 0x1e, 0xb6, 0x7d, 0xc0, 0x2b, 0x19, 0xea, 0xe5, 0x1a, 0x23, 0x47, 0xd4, 0x80, - 0x5c, 0xd7, 0x1d, 0x13, 0x43, 0xe5, 0x15, 0x2c, 0xcb, 0x0a, 0x32, 0x1d, 0xe6, 0x16, 0xd4, 0x02, - 0xad, 0xe3, 0xbb, 0x53, 0x8b, 0xda, 0xae, 0x63, 0x68, 0xdc, 0xad, 0x26, 0xdd, 0x42, 0x03, 0x8e, - 0x7c, 0xd0, 0x2e, 0x14, 0xba, 0xb6, 0xe7, 0xb9, 0x9e, 0x01, 0x0d, 0xa5, 0xa9, 0x62, 0x21, 0xa1, - 0x06, 0x94, 0x58, 0xe2, 0x3e, 0xf1, 0xae, 0xec, 0x11, 0x31, 0x4a, 0x0d, 0xa5, 0xa9, 0xe1, 0xb8, - 0xca, 0xfc, 0x29, 0x03, 0x95, 0x76, 0x8f, 0x6d, 0xa0, 0xd8, 0x00, 0xf4, 0x00, 0xb2, 0x83, 0xa5, - 0xc3, 0xf7, 0xbc, 0x14, 0x5b, 0x1d, 0xa1, 0x96, 0x78, 0x17, 0x66, 0x46, 0xf7, 0x40, 0xc3, 0xc4, - 0x1a, 0x5f, 0x9f, 0x39, 0xd3, 0x6b, 0xde, 0x0b, 0x2a, 0x8e, 0x14, 0x68, 0x1f, 0xf4, 0x13, 0x87, - 0xbd, 0x6d, 0xdb, 0x1a, 0x5d, 0x90, 0x6f, 0x3d, 0x9b, 0x12, 0xde, 0x04, 0x2a, 0x5e, 0xd1, 0xa3, - 0x07, 0x50, 0x39, 0xb6, 0x7d, 0xa6, 0x7c, 0x72, 0xde, 0x3e, 0x9b, 0x53, 0xbe, 0xe3, 0x2a, 0x4e, - 0x2a, 0x53, 0xb5, 0xce, 0xff, 0xd3, 0x5a, 0xb7, 0xa0, 0x78, 0x36, 0x67, 0x25, 0x62, 0xdb, 0xaa, - 0xf0, 0x18, 0xf1, 0x42, 0x42, 0x2d, 0x62, 0xa4, 0x17, 0x42, 0x90, 0x3b, 0x9d, 0x5a, 0x13, 0xa3, - 0xd8, 0x50, 0x9a, 0x15, 0xcc, 0x9f, 0xcd, 0x39, 0x94, 0xda, 0xbd, 0xb3, 0x39, 0x26, 0xef, 0x16, - 0xc4, 0xa7, 0xac, 0xd8, 0x67, 0xf3, 0x36, 0xdb, 0x41, 0x85, 0x3b, 0x09, 0x09, 0x19, 0x50, 0x3c, - 0xb7, 0xae, 0xa7, 0xae, 0x35, 0xe6, 0x05, 0x29, 0x63, 0x29, 0xa2, 0x16, 0x14, 0x06, 0x96, 0x37, - 0x21, 0x54, 0x30, 0x61, 0x63, 0x6f, 0x09, 0x37, 0xb3, 0x09, 0xe5, 0x20, 0xa3, 0x3f, 0x77, 0x1d, - 0x3f, 0x01, 0xad, 0x24, 0xa0, 0xcd, 0x3f, 0xf2, 0x00, 0x83, 0xa5, 0x23, 0xd7, 0xc6, 0xb7, 0x85, - 0x3f, 0x0a, 0xda, 0xe6, 0x70, 0xa4, 0x90, 0x5b, 0x9b, 0xf9, 0xf4, 0xd6, 0x3e, 0x84, 0x42, 0x97, - 0xd0, 0x0b, 0x77, 0xcc, 0x57, 0x1b, 0xe3, 0x78, 0xa0, 0xc5, 0xc2, 0x1a, 0x96, 0x2a, 0x17, 0x95, - 0x0a, 0x1d, 0x80, 0xd6, 0xee, 0x89, 0x84, 0x82, 0x80, 0x3a, 0x0f, 0x8f, 0x15, 0x10, 0x47, 0x2e, - 0xe8, 0x2b, 0xa8, 0x04, 0x1c, 0x94, 0x31, 0xc1, 0x2e, 0xdd, 0x96, 0x29, 0x13, 0x46, 0x9c, 0xf4, - 0x45, 0x87, 0xb0, 0x8d, 0xdd, 0xe9, 0x74, 0x68, 0x8d, 0x2e, 0x65, 0x78, 0x91, 0x87, 0xdf, 0x91, - 0xe1, 0x29, 0x33, 0x4e, 0xfb, 0xa3, 0x17, 0x50, 0x15, 0xd3, 0x43, 0x22, 0xa8, 0x1c, 0x61, 0x57, - 0x22, 0x24, 0xad, 0x38, 0xe5, 0x8d, 0x8e, 0x41, 0x7f, 0x49, 0xa8, 0x18, 0x7e, 0x02, 0x41, 0xe3, - 0x08, 0x86, 0x44, 0x48, 0xdb, 0xf1, 0x4a, 0x04, 0x3a, 0x87, 0x1d, 0x31, 0x89, 0x82, 0x6e, 0x90, - 0x48, 0xc0, 0x91, 0xee, 0x25, 0x8b, 0x91, 0xf4, 0xc1, 0x6b, 0x23, 0xd1, 0x37, 0xb0, 0x2b, 0x5f, - 0x35, 0x85, 0x59, 0xe2, 0x98, 0xf5, 0x74, 0x85, 0x52, 0xa8, 0x1b, 0xa2, 0xd1, 0x09, 0x54, 0x31, - 0x99, 0xb9, 0x57, 0xa4, 0x2b, 0x1a, 0xd8, 0x28, 0x73, 0xbc, 0xff, 0x86, 0x78, 0x09, 0x6b, 0x58, - 0xb6, 0xa4, 0x1a, 0xfd, 0x3f, 0xa2, 0x65, 0x25, 0x59, 0x6f, 0x11, 0x21, 0xac, 0x21, 0x2f, 0xcd, - 0x37, 0x50, 0x5b, 0xb1, 0xa2, 0x3a, 0x00, 0x26, 0xd4, 0xbb, 0x66, 0xf4, 0xf3, 0x0d, 0xa5, 0x91, - 0x6d, 0xe6, 0x71, 0x4c, 0xc3, 0x46, 0x0b, 0x97, 0x3a, 0x0e, 0x25, 0xde, 0x95, 0x35, 0xe5, 0x9d, - 0x9f, 0xc5, 0x49, 0xa5, 0xf9, 0x57, 0x1e, 0x4a, 0x1c, 0x5b, 0x90, 0xed, 0xd3, 0x1c, 0xaa, 0x6f, - 0xe4, 0xd0, 0xbf, 0x67, 0xcf, 0x23, 0x50, 0x07, 0x4b, 0xe7, 0x84, 0x0f, 0xf2, 0x80, 0x3c, 0x15, - 0x19, 0xcd, 0x95, 0x38, 0x34, 0xa3, 0xe7, 0xc9, 0x09, 0x21, 0x78, 0x53, 0x8b, 0x71, 0x2d, 0x30, - 0xe0, 0xe4, 0x20, 0x79, 0x01, 0x55, 0xc9, 0x21, 0x11, 0x58, 0x4c, 0xd6, 0x3f, 0x69, 0xc5, 0x29, - 0x6f, 0xd6, 0xef, 0x11, 0x85, 0x04, 0x82, 0x9a, 0xec, 0xf7, 0xb4, 0x1d, 0xaf, 0x44, 0x30, 0xe2, - 0x86, 0x3c, 0x12, 0x20, 0x5a, 0x92, 0xb8, 0x29, 0x33, 0x4e, 0xfb, 0xa3, 0x97, 0x50, 0x8b, 0xd1, - 0x48, 0x80, 0x04, 0x7c, 0xb9, 0xbb, 0x86, 0x79, 0x02, 0x66, 0x35, 0x06, 0xf5, 0xe1, 0x76, 0x8a, - 0x41, 0x02, 0xac, 0x94, 0x6c, 0xec, 0xb5, 0x4e, 0x78, 0x7d, 0x2c, 0x7a, 0x03, 0x77, 0x56, 0x08, - 0x24, 0x60, 0x03, 0xbe, 0xdc, 0xdf, 0xc8, 0x3f, 0x01, 0xbc, 0x29, 0x1e, 0x9d, 0xae, 0x30, 0xb0, - 0x92, 0x62, 0x74, 0x8a, 0x81, 0x72, 0x27, 0x93, 0x7a, 0x73, 0x04, 0x7a, 0x7a, 0xbe, 0xa2, 0x47, - 0xf1, 0x63, 0x26, 0x1b, 0x3f, 0x2d, 0x25, 0x91, 0xc3, 0x23, 0x6d, 0xe5, 0xd4, 0xce, 0xac, 0x39, - 0xb5, 0xcd, 0x43, 0xce, 0xda, 0x54, 0x0f, 0x3d, 0x86, 0x5a, 0xc7, 0xb9, 0xb2, 0xa6, 0xf6, 0x38, - 0x76, 0xa2, 0xb3, 0x7c, 0x39, 0xbc, 0x6a, 0x30, 0x77, 0x00, 0xad, 0x0e, 0x72, 0xf3, 0x36, 0xdc, - 0x5a, 0xd3, 0x6a, 0xe6, 0x29, 0xcf, 0x97, 0x9a, 0xd1, 0x4f, 0xa0, 0x28, 0x8a, 0x28, 0x3e, 0x6a, - 0x36, 0x1e, 0xbf, 0xd2, 0x4f, 0x24, 0x4d, 0xf5, 0x9c, 0xf9, 0x35, 0x4f, 0xba, 0x32, 0xbd, 0x6f, - 0x80, 0xbf, 0x0b, 0x3b, 0xeb, 0xfa, 0xd3, 0x7c, 0x05, 0x77, 0x36, 0xcc, 0xf9, 0x9b, 0x64, 0xd9, - 0x03, 0x63, 0x53, 0xe3, 0x9a, 0x3d, 0xb8, 0xbb, 0x71, 0xfa, 0xdf, 0x24, 0xd7, 0x3d, 0xd8, 0xdb, - 0xdc, 0xcd, 0x66, 0x97, 0xaf, 0x64, 0xed, 0xd9, 0x70, 0x93, 0x64, 0xff, 0x09, 0x16, 0xbf, 0xb6, - 0xd1, 0xcd, 0x41, 0x34, 0x44, 0xd9, 0x90, 0x8d, 0x7d, 0xa8, 0xf1, 0x67, 0xb4, 0x03, 0xf9, 0x60, - 0xc2, 0x06, 0x1f, 0x69, 0x81, 0xc0, 0x8e, 0x92, 0x20, 0x8a, 0xfb, 0x67, 0xb9, 0x7f, 0x4c, 0x63, - 0xfe, 0x9c, 0xe3, 0x0e, 0xf2, 0xe4, 0xd9, 0x03, 0xf5, 0x94, 0x58, 0x74, 0xe1, 0xf1, 0xd6, 0x65, - 0xce, 0xa1, 0xcc, 0xee, 0x4c, 0xed, 0x1e, 0x47, 0xd7, 0x70, 0xa6, 0xdd, 0x63, 0xe7, 0x49, 0x9f, - 0xf8, 0xbe, 0xed, 0x3a, 0x9d, 0x63, 0x8e, 0xac, 0xe1, 0x48, 0xc1, 0xac, 0x87, 0xa3, 0x91, 0xbb, - 0x70, 0xd8, 0x69, 0x13, 0x1c, 0x06, 0x91, 0x02, 0x99, 0x50, 0x6e, 0xbb, 0x8e, 0x43, 0x46, 0x34, - 0x08, 0xcf, 0x73, 0x87, 0x84, 0x8e, 0xad, 0xe5, 0xb5, 0x4f, 0xbc, 0x9e, 0x35, 0x0b, 0x8e, 0x01, - 0x0d, 0x87, 0x32, 0x7a, 0x08, 0xd5, 0xfe, 0xa5, 0x3d, 0x4f, 0x5d, 0x53, 0x72, 0x38, 0xa5, 0x45, - 0x2f, 0x00, 0x25, 0x34, 0x5d, 0x7e, 0xa2, 0xaa, 0x8d, 0x2c, 0x3f, 0xc1, 0xc2, 0xcf, 0x6c, 0x7e, - 0x47, 0x59, 0xe3, 0xc9, 0x3e, 0x50, 0xf9, 0x92, 0x89, 0xc7, 0x27, 0xb9, 0x86, 0xa5, 0xc8, 0xae, - 0x20, 0xbe, 0x78, 0x59, 0xe7, 0xad, 0xcb, 0x47, 0xb4, 0x86, 0xe3, 0x2a, 0xb6, 0x7e, 0xdb, 0xc1, - 0x0b, 0xa7, 0xff, 0x6e, 0xca, 0x87, 0xae, 0x8a, 0x43, 0x39, 0xb0, 0x05, 0x1d, 0xcc, 0x27, 0x27, - 0xb7, 0x05, 0x32, 0xdb, 0x32, 0x3b, 0xec, 0x38, 0x3e, 0x05, 0x55, 0x1c, 0xd3, 0xb0, 0x35, 0x0d, - 0xaf, 0x8f, 0xc8, 0xc4, 0x76, 0x8c, 0x2a, 0x37, 0x4a, 0x91, 0x45, 0x5a, 0x0b, 0xea, 0x8e, 0x02, - 0xdc, 0xed, 0x20, 0x32, 0xd2, 0x04, 0xc8, 0x1d, 0x67, 0xe4, 0xf5, 0xe9, 0x8c, 0x1a, 0xba, 0x44, - 0x96, 0x1a, 0x56, 0xd5, 0x28, 0x0f, 0xf7, 0xa9, 0x71, 0x9f, 0x94, 0x76, 0xbf, 0x0e, 0xe5, 0xf8, - 0x8d, 0x0d, 0x15, 0x20, 0xd3, 0xef, 0xe8, 0x5b, 0xec, 0x17, 0xb7, 0x75, 0x65, 0x7f, 0x3f, 0xb8, - 0x68, 0xb3, 0xae, 0xac, 0x02, 0xb0, 0xde, 0x9a, 0xd9, 0x3e, 0xb5, 0x47, 0xfa, 0x16, 0xda, 0x86, - 0xd2, 0x39, 0xab, 0x91, 0x50, 0x28, 0xfb, 0xdf, 0x83, 0x16, 0x5e, 0xb3, 0x11, 0x40, 0xe1, 0x70, - 0x44, 0xed, 0x2b, 0xa2, 0x6f, 0xa1, 0x32, 0xa8, 0xf2, 0x02, 0xac, 0x2b, 0x0c, 0x27, 0x28, 0x0f, - 0xb5, 0x9d, 0x89, 0x9e, 0x41, 0x15, 0xd0, 0x84, 0x4c, 0xc6, 0x7a, 0x96, 0x39, 0x1f, 0x0e, 0x5d, - 0x8f, 0x1b, 0x73, 0xa8, 0x04, 0x45, 0x2e, 0x91, 0xb1, 0x9e, 0xdf, 0xff, 0x41, 0xe1, 0x19, 0xc4, - 0xe7, 0x89, 0x0a, 0x39, 0x76, 0x9d, 0xd3, 0xb7, 0x90, 0x06, 0x79, 0x7e, 0x51, 0xd3, 0x15, 0x96, - 0x36, 0x00, 0xd3, 0x33, 0x0c, 0x49, 0xbe, 0xab, 0x9e, 0x65, 0x48, 0x62, 0x11, 0x7a, 0x8e, 0xe5, - 0x0c, 0x47, 0x9b, 0x9e, 0x47, 0x35, 0xf9, 0x8d, 0x2f, 0xe8, 0xab, 0x17, 0xd0, 0xad, 0xe8, 0xcb, - 0x5d, 0x2a, 0x8b, 0x48, 0x87, 0xb2, 0xa4, 0x34, 0x23, 0xb4, 0xae, 0xb2, 0xd4, 0xc7, 0x27, 0x47, - 0xaf, 0x5f, 0xea, 0xda, 0xd1, 0xd1, 0x87, 0xdf, 0xea, 0xca, 0xfb, 0x8f, 0x75, 0xe5, 0xc3, 0xc7, - 0xba, 0xf2, 0xeb, 0xc7, 0xfa, 0xd6, 0x8f, 0xbf, 0xd7, 0x95, 0xef, 0x1e, 0xc7, 0xfe, 0x06, 0x99, - 0x59, 0xd4, 0xb3, 0x97, 0xae, 0x67, 0x4f, 0x6c, 0x47, 0x0a, 0x0e, 0x69, 0xcd, 0x2f, 0x27, 0xad, - 0xf9, 0xb0, 0x45, 0x97, 0xce, 0xb0, 0xc0, 0xff, 0xdf, 0x78, 0xf6, 0x77, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x28, 0x6b, 0x1e, 0x0e, 0x4d, 0x11, 0x00, 0x00, + // 1595 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xdd, 0x6e, 0xe3, 0xc6, + 0x15, 0x36, 0xf5, 0x4b, 0x1e, 0xfd, 0x98, 0x9a, 0x78, 0xbd, 0x8c, 0xbb, 0x55, 0x04, 0x22, 0x58, + 0x28, 0x46, 0x6a, 0x35, 0x1b, 0xa4, 0x17, 0x2d, 0xb0, 0x80, 0x2d, 0xdb, 0x5b, 0x01, 0xb1, 0x6c, + 0x8c, 0x94, 0x06, 0xe9, 0x4d, 0x41, 0x49, 0x13, 0x99, 0xb0, 0x44, 0x2a, 0xe4, 0xc8, 0x90, 0x9f, + 0xa5, 0x37, 0xed, 0xdb, 0xe4, 0x32, 0x0f, 0x50, 0x14, 0xed, 0x16, 0xbd, 0xe9, 0x6d, 0x5f, 0xa0, + 0x98, 0xc3, 0x19, 0xfe, 0x49, 0x4a, 0x0a, 0xe7, 0xca, 0x3c, 0x7f, 0xdf, 0x19, 0x9d, 0x39, 0xdf, + 0x99, 0x19, 0x83, 0xc1, 0x37, 0xde, 0xd9, 0x2a, 0xf0, 0xb9, 0x4f, 0x8a, 0x7c, 0xe3, 0x9d, 0xfc, + 0x6a, 0xee, 0xf2, 0xfb, 0xf5, 0xe4, 0x6c, 0xea, 0x2f, 0x7b, 0x73, 0x7f, 0xee, 0xf7, 0xd0, 0x36, + 0x59, 0x7f, 0x8b, 0x12, 0x0a, 0xf8, 0x15, 0xc5, 0x9c, 0x1c, 0x72, 0x77, 0xc9, 0x42, 0xee, 0x2c, + 0x57, 0x52, 0xd1, 0x5c, 0x32, 0xee, 0xcc, 0x1c, 0xee, 0x48, 0x19, 0x16, 0xfe, 0xf4, 0x21, 0xfa, + 0xb6, 0xff, 0x53, 0x84, 0xea, 0x78, 0xe3, 0xdd, 0x30, 0xee, 0x90, 0x26, 0x14, 0x06, 0x97, 0x96, + 0xd6, 0xd1, 0xba, 0x75, 0x5a, 0x18, 0x5c, 0x92, 0xd7, 0x50, 0x19, 0x71, 0x87, 0xaf, 0x43, 0xab, + 0xd0, 0xd1, 0xba, 0xcd, 0x37, 0xcd, 0x33, 0xb1, 0xb0, 0xf1, 0xc6, 0x8b, 0xb4, 0x54, 0x5a, 0xc9, + 0x6f, 0x01, 0x46, 0x9e, 0xb3, 0x0a, 0xef, 0x7d, 0x3e, 0x1e, 0x59, 0xc5, 0x8e, 0xd6, 0xad, 0xbd, + 0x39, 0x3a, 0x4b, 0x56, 0x31, 0x56, 0x5f, 0x17, 0xa5, 0xef, 0xff, 0xfe, 0xd1, 0x01, 0x4d, 0x79, + 0x8b, 0xd8, 0xbb, 0x80, 0xad, 0x9c, 0x80, 0xcd, 0xc6, 0x23, 0xab, 0xf4, 0xd3, 0xb1, 0x89, 0x37, + 0xf9, 0x0d, 0xe8, 0x7d, 0x7f, 0xb9, 0x74, 0x45, 0xd6, 0xf2, 0x4f, 0x46, 0xc6, 0xbe, 0xe4, 0x73, + 0xd0, 0xc7, 0xc3, 0xd1, 0xbd, 0x13, 0xcc, 0x42, 0xab, 0xd2, 0x29, 0x76, 0x6b, 0x6f, 0x5a, 0x67, + 0x71, 0x89, 0xa4, 0x45, 0x05, 0x29, 0x47, 0xf2, 0x05, 0xc0, 0x97, 0xfe, 0xf4, 0x61, 0xec, 0x4c, + 0x16, 0x2c, 0xb4, 0xaa, 0x18, 0x76, 0x78, 0x86, 0x95, 0x8c, 0xf5, 0x6a, 0x8d, 0x89, 0x23, 0xe9, + 0x40, 0xe9, 0xc6, 0x9f, 0x31, 0x4b, 0xc7, 0x0a, 0xd6, 0x55, 0x05, 0x85, 0x8e, 0xa2, 0x85, 0xf4, + 0xc0, 0x18, 0x84, 0xfe, 0xc2, 0xe1, 0xae, 0xef, 0x59, 0x06, 0xba, 0xb5, 0x94, 0x5b, 0x6c, 0xa0, + 0x89, 0x0f, 0x39, 0x86, 0xca, 0x8d, 0x1b, 0x04, 0x7e, 0x60, 0x41, 0x47, 0xeb, 0xea, 0x54, 0x4a, + 0xa4, 0x03, 0x35, 0x91, 0x78, 0xc4, 0x82, 0x47, 0x77, 0xca, 0xac, 0x5a, 0x47, 0xeb, 0x1a, 0x34, + 0xad, 0xb2, 0xff, 0x5a, 0x80, 0x46, 0x7f, 0x28, 0x36, 0x50, 0x6e, 0x00, 0xf9, 0x18, 0x8a, 0xe3, + 0x8d, 0x87, 0x7b, 0x5e, 0x4b, 0xad, 0x8e, 0x71, 0x47, 0xfe, 0x16, 0x61, 0x26, 0xaf, 0xc0, 0xa0, + 0xcc, 0x99, 0x3d, 0xdd, 0x7a, 0x8b, 0x27, 0xec, 0x05, 0x9d, 0x26, 0x0a, 0x72, 0x0a, 0xe6, 0x95, + 0x27, 0x7e, 0x6d, 0xdf, 0x99, 0xde, 0xb3, 0xaf, 0x03, 0x97, 0x33, 0x6c, 0x02, 0x9d, 0x6e, 0xe9, + 0xc9, 0xc7, 0xd0, 0xb8, 0x74, 0x43, 0xa1, 0xfc, 0xec, 0xae, 0x7f, 0xbb, 0xe2, 0xb8, 0xe3, 0x3a, + 0xcd, 0x2a, 0x73, 0xb5, 0x2e, 0xff, 0xbf, 0xb5, 0xee, 0x41, 0xf5, 0x76, 0x25, 0x4a, 0x24, 0xb6, + 0x55, 0xc3, 0x18, 0xf9, 0x83, 0xa4, 0x5a, 0xc6, 0x28, 0x2f, 0x42, 0xa0, 0x74, 0xbd, 0x70, 0xe6, + 0x56, 0xb5, 0xa3, 0x75, 0x1b, 0x14, 0xbf, 0xed, 0x15, 0xd4, 0xfa, 0xc3, 0xdb, 0x15, 0x65, 0xdf, + 0xad, 0x59, 0xc8, 0x45, 0xb1, 0x6f, 0x57, 0x7d, 0xb1, 0x83, 0x1a, 0x3a, 0x49, 0x89, 0x58, 0x50, + 0xbd, 0x73, 0x9e, 0x16, 0xbe, 0x33, 0xc3, 0x82, 0xd4, 0xa9, 0x12, 0x49, 0x0f, 0x2a, 0x63, 0x27, + 0x98, 0x33, 0x2e, 0x99, 0xb0, 0xb7, 0xb7, 0xa4, 0x9b, 0xdd, 0x85, 0x7a, 0x94, 0x31, 0x5c, 0xf9, + 0x5e, 0x98, 0x81, 0xd6, 0x32, 0xd0, 0xf6, 0xbf, 0xcb, 0x00, 0xe3, 0x8d, 0xa7, 0xd6, 0x86, 0xdb, + 0x82, 0x9f, 0x92, 0xb6, 0x25, 0x9a, 0x28, 0xd4, 0xd6, 0x16, 0x7e, 0x7c, 0x6b, 0x5f, 0x43, 0xe5, + 0x86, 0xf1, 0x7b, 0x7f, 0x86, 0xab, 0x4d, 0x71, 0x3c, 0xd2, 0x52, 0x69, 0x8d, 0x4b, 0x55, 0x4a, + 0x4a, 0x45, 0xce, 0xc0, 0xe8, 0x0f, 0x65, 0x42, 0x49, 0x40, 0x13, 0xc3, 0x53, 0x05, 0xa4, 0x89, + 0x0b, 0xf9, 0x1d, 0x34, 0x22, 0x0e, 0xaa, 0x98, 0x68, 0x97, 0x5e, 0xa8, 0x94, 0x19, 0x23, 0xcd, + 0xfa, 0x92, 0x73, 0x38, 0xa4, 0xfe, 0x62, 0x31, 0x71, 0xa6, 0x0f, 0x2a, 0xbc, 0x8a, 0xe1, 0x2f, + 0x55, 0x78, 0xce, 0x4c, 0xf3, 0xfe, 0xe4, 0x2d, 0x34, 0xe5, 0xf4, 0x50, 0x08, 0x3a, 0x22, 0x1c, + 0x2b, 0x84, 0xac, 0x95, 0xe6, 0xbc, 0xc9, 0x25, 0x98, 0xef, 0x18, 0x97, 0xc3, 0x4f, 0x22, 0x18, + 0x88, 0x60, 0x29, 0x84, 0xbc, 0x9d, 0x6e, 0x45, 0x90, 0x3b, 0x38, 0x92, 0x93, 0x28, 0xea, 0x06, + 0x85, 0x04, 0x88, 0xf4, 0x2a, 0x5b, 0x8c, 0xac, 0x0f, 0xdd, 0x19, 0x49, 0xfe, 0x00, 0xc7, 0xea, + 0xa7, 0xe6, 0x30, 0x6b, 0x88, 0xd9, 0xce, 0x57, 0x28, 0x87, 0xba, 0x27, 0x9a, 0x5c, 0x41, 0x93, + 0xb2, 0xa5, 0xff, 0xc8, 0x6e, 0x64, 0x03, 0x5b, 0x75, 0xc4, 0xfb, 0x65, 0x8c, 0x97, 0xb1, 0xc6, + 0x65, 0xcb, 0xaa, 0xc9, 0xaf, 0x13, 0x5a, 0x36, 0xb2, 0xf5, 0x96, 0x11, 0xd2, 0x1a, 0xf3, 0xd2, + 0xfe, 0x06, 0x5a, 0x5b, 0x56, 0xd2, 0x06, 0xa0, 0x8c, 0x07, 0x4f, 0x82, 0x7e, 0xa1, 0xa5, 0x75, + 0x8a, 0xdd, 0x32, 0x4d, 0x69, 0xc4, 0x68, 0x41, 0x69, 0xe0, 0x71, 0x16, 0x3c, 0x3a, 0x0b, 0xec, + 0xfc, 0x22, 0xcd, 0x2a, 0xed, 0xff, 0x96, 0xa1, 0x86, 0xd8, 0x92, 0x6c, 0x3f, 0xce, 0xa1, 0xf6, + 0x5e, 0x0e, 0xfd, 0x7c, 0xf6, 0x7c, 0x02, 0xfa, 0x78, 0xe3, 0x5d, 0xe1, 0x20, 0x8f, 0xc8, 0xd3, + 0x50, 0xd1, 0xa8, 0xa4, 0xb1, 0x99, 0x7c, 0x91, 0x9d, 0x10, 0x92, 0x37, 0xad, 0x14, 0xd7, 0x22, + 0x03, 0xcd, 0x0e, 0x92, 0xb7, 0xd0, 0x54, 0x1c, 0x92, 0x81, 0xd5, 0x6c, 0xfd, 0xb3, 0x56, 0x9a, + 0xf3, 0x16, 0xfd, 0x9e, 0x50, 0x48, 0x22, 0xe8, 0xd9, 0x7e, 0xcf, 0xdb, 0xe9, 0x56, 0x84, 0x20, + 0x6e, 0xcc, 0x23, 0x09, 0x62, 0x64, 0x89, 0x9b, 0x33, 0xd3, 0xbc, 0x3f, 0x79, 0x07, 0xad, 0x14, + 0x8d, 0x24, 0x48, 0xc4, 0x97, 0x0f, 0x77, 0x30, 0x4f, 0xc2, 0x6c, 0xc7, 0x90, 0x11, 0xbc, 0xc8, + 0x31, 0x48, 0x82, 0xd5, 0xb2, 0x8d, 0xbd, 0xd3, 0x89, 0xee, 0x8e, 0x25, 0xdf, 0xc0, 0xcb, 0x2d, + 0x02, 0x49, 0xd8, 0x88, 0x2f, 0x1f, 0xed, 0xe5, 0x9f, 0x04, 0xde, 0x17, 0x4f, 0xae, 0xb7, 0x18, + 0xd8, 0xc8, 0x31, 0x3a, 0xc7, 0x40, 0xb5, 0x93, 0x59, 0xbd, 0x3d, 0x05, 0x33, 0x3f, 0x5f, 0xc9, + 0x27, 0xe9, 0x63, 0xa6, 0x98, 0x3e, 0x2d, 0x15, 0x91, 0xe3, 0x23, 0x6d, 0xeb, 0xd4, 0x2e, 0xec, + 0x38, 0xb5, 0xed, 0x73, 0x64, 0x6d, 0xae, 0x87, 0x3e, 0x85, 0xd6, 0xc0, 0x7b, 0x74, 0x16, 0xee, + 0x2c, 0x75, 0xa2, 0x8b, 0x7c, 0x25, 0xba, 0x6d, 0xb0, 0x8f, 0x80, 0x6c, 0x0f, 0x72, 0xfb, 0x05, + 0x7c, 0xb0, 0xa3, 0xd5, 0xec, 0x6b, 0xcc, 0x97, 0x9b, 0xd1, 0x9f, 0x41, 0x55, 0x16, 0x51, 0x5e, + 0x6a, 0xf6, 0x1e, 0xbf, 0xca, 0x4f, 0x26, 0xcd, 0xf5, 0x9c, 0xfd, 0x7b, 0x4c, 0xba, 0x35, 0xbd, + 0x9f, 0x81, 0x7f, 0x0c, 0x47, 0xbb, 0xfa, 0xd3, 0xfe, 0x12, 0x5e, 0xee, 0x99, 0xf3, 0xcf, 0xc9, + 0x72, 0x02, 0xd6, 0xbe, 0xc6, 0xb5, 0x87, 0xf0, 0xe1, 0xde, 0xe9, 0xff, 0x9c, 0x5c, 0xaf, 0xe0, + 0x64, 0x7f, 0x37, 0xdb, 0x37, 0xb8, 0x92, 0x9d, 0x67, 0xc3, 0x73, 0x92, 0xfd, 0x22, 0x5a, 0xfc, + 0xce, 0x46, 0xb7, 0xc7, 0xc9, 0x10, 0x15, 0x43, 0x36, 0x75, 0x51, 0xc3, 0x6f, 0x72, 0x04, 0xe5, + 0x68, 0xc2, 0x46, 0x97, 0xb4, 0x48, 0x10, 0x47, 0x49, 0x14, 0x85, 0xfe, 0x45, 0xf4, 0x4f, 0x69, + 0xec, 0xbf, 0x95, 0xd0, 0x41, 0x9d, 0x3c, 0x27, 0xa0, 0x5f, 0x33, 0x87, 0xaf, 0x03, 0x6c, 0x5d, + 0xe1, 0x1c, 0xcb, 0xe2, 0xcd, 0xd4, 0x1f, 0x22, 0xba, 0x41, 0x0b, 0xfd, 0xa1, 0x38, 0x4f, 0x46, + 0x2c, 0x0c, 0x5d, 0xdf, 0x1b, 0x5c, 0x22, 0xb2, 0x41, 0x13, 0x85, 0xb0, 0x9e, 0x4f, 0xa7, 0xfe, + 0xda, 0x13, 0xa7, 0x4d, 0x74, 0x18, 0x24, 0x0a, 0x62, 0x43, 0xbd, 0xef, 0x7b, 0x1e, 0x9b, 0xf2, + 0x28, 0xbc, 0x8c, 0x0e, 0x19, 0x9d, 0x58, 0xcb, 0x57, 0x21, 0x0b, 0x86, 0xce, 0x32, 0x3a, 0x06, + 0x0c, 0x1a, 0xcb, 0xe4, 0x35, 0x34, 0x47, 0x0f, 0xee, 0x2a, 0xf7, 0x4c, 0x29, 0xd1, 0x9c, 0x96, + 0xbc, 0x05, 0x92, 0xd1, 0xdc, 0xe0, 0x89, 0xaa, 0x77, 0x8a, 0x78, 0x82, 0xc5, 0xd7, 0x6c, 0x7c, + 0xa3, 0xec, 0xf0, 0x14, 0x17, 0x54, 0x5c, 0x32, 0x0b, 0x70, 0x92, 0x1b, 0x54, 0x89, 0xe2, 0x09, + 0x12, 0xca, 0x1f, 0xeb, 0x7d, 0xeb, 0xe3, 0x88, 0x36, 0x68, 0x5a, 0x25, 0xd6, 0xef, 0x7a, 0x74, + 0xed, 0x8d, 0xbe, 0x5b, 0xe0, 0xd0, 0xd5, 0x69, 0x2c, 0x47, 0xb6, 0xa8, 0x83, 0x71, 0x72, 0xa2, + 0x2d, 0x92, 0xc5, 0x96, 0xb9, 0x71, 0xc7, 0xe1, 0x14, 0xd4, 0x69, 0x4a, 0x23, 0xd6, 0x34, 0x79, + 0xba, 0x60, 0x73, 0xd7, 0xb3, 0x9a, 0x68, 0x54, 0xa2, 0x88, 0x74, 0xd6, 0xdc, 0x9f, 0x46, 0xb8, + 0x87, 0x51, 0x64, 0xa2, 0x89, 0x90, 0x07, 0xde, 0x34, 0x18, 0xf1, 0x25, 0xb7, 0x4c, 0x85, 0xac, + 0x34, 0xa2, 0xaa, 0x49, 0x1e, 0xf4, 0x69, 0xa1, 0x4f, 0x4e, 0x4b, 0xba, 0x70, 0x28, 0x4a, 0xf7, + 0xb5, 0xe3, 0x72, 0xf1, 0xf4, 0xf4, 0xd7, 0xdc, 0x22, 0x78, 0x03, 0xc9, 0xab, 0x4f, 0xdb, 0x50, + 0x4f, 0xbf, 0xed, 0x48, 0x05, 0x0a, 0xa3, 0x81, 0x79, 0x20, 0xfe, 0xd2, 0xbe, 0xa9, 0x9d, 0x9e, + 0x46, 0x4f, 0x72, 0xd1, 0xbf, 0x4d, 0x00, 0xd1, 0x85, 0x4b, 0x37, 0xe4, 0xee, 0xd4, 0x3c, 0x20, + 0x87, 0x50, 0xbb, 0x13, 0xd5, 0x94, 0x0a, 0xed, 0xf4, 0x4f, 0x60, 0xc4, 0x0f, 0x72, 0x02, 0x50, + 0x39, 0x9f, 0x72, 0xf7, 0x91, 0x99, 0x07, 0xa4, 0x0e, 0xba, 0x7a, 0x2a, 0x9b, 0x9a, 0xc0, 0x89, + 0x0a, 0xc9, 0x5d, 0x6f, 0x6e, 0x16, 0x48, 0x03, 0x0c, 0x29, 0xb3, 0x99, 0x59, 0x14, 0xce, 0xe7, + 0x13, 0x3f, 0x40, 0x63, 0x89, 0xd4, 0xa0, 0x8a, 0x12, 0x9b, 0x99, 0xe5, 0xd3, 0x3f, 0x6b, 0x98, + 0x41, 0x5e, 0x64, 0x74, 0x28, 0x89, 0x87, 0x9f, 0x79, 0x40, 0x0c, 0x28, 0xe3, 0x93, 0xce, 0xd4, + 0x44, 0xda, 0x08, 0xcc, 0x2c, 0x08, 0x24, 0x55, 0x15, 0xb3, 0x28, 0x90, 0xe4, 0x22, 0xcc, 0x92, + 0xc8, 0x19, 0x0f, 0x41, 0xb3, 0x4c, 0x5a, 0xea, 0x35, 0x20, 0x89, 0x6e, 0x56, 0xc8, 0x07, 0xc9, + 0x1d, 0x5f, 0x29, 0xab, 0xc4, 0x84, 0xba, 0x22, 0xbf, 0xa0, 0xbe, 0xa9, 0x8b, 0xd4, 0x97, 0x57, + 0x17, 0x5f, 0xbd, 0x33, 0x8d, 0x8b, 0x8b, 0x1f, 0xfe, 0xd9, 0xd6, 0xbe, 0x7f, 0xdf, 0xd6, 0x7e, + 0x78, 0xdf, 0xd6, 0xfe, 0xf1, 0xbe, 0x7d, 0xf0, 0x97, 0x7f, 0xb5, 0xb5, 0x3f, 0x7e, 0x9a, 0xfa, + 0x87, 0xc9, 0xd2, 0xe1, 0x81, 0xbb, 0xf1, 0x03, 0x77, 0xee, 0x7a, 0x4a, 0xf0, 0x58, 0x6f, 0xf5, + 0x30, 0xef, 0xad, 0x26, 0x3d, 0xbe, 0xf1, 0x26, 0x15, 0xfc, 0x4f, 0xc8, 0xe7, 0xff, 0x0b, 0x00, + 0x00, 0xff, 0xff, 0x0d, 0x97, 0x87, 0xa8, 0x77, 0x11, 0x00, 0x00, } func (m *TxnMeta) Marshal() (dAtA []byte, err error) { @@ -3207,6 +3216,13 @@ func (m *TxnOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.LockWaitTimeout != 0 { + i = encodeVarintTxn(dAtA, i, uint64(m.LockWaitTimeout)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x90 + } if m.InRollbackStmt { i-- if m.InRollbackStmt { @@ -3930,6 +3946,9 @@ func (m *TxnOptions) ProtoSize() (n int) { if m.InRollbackStmt { n += 3 } + if m.LockWaitTimeout != 0 { + n += 2 + sovTxn(uint64(m.LockWaitTimeout)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7497,6 +7516,25 @@ func (m *TxnOptions) Unmarshal(dAtA []byte) error { } } m.InRollbackStmt = bool(v != 0) + case 18: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LockWaitTimeout", wireType) + } + m.LockWaitTimeout = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTxn + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.LockWaitTimeout |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTxn(dAtA[iNdEx:]) diff --git a/pkg/sql/colexec/lockop/lock_op.go b/pkg/sql/colexec/lockop/lock_op.go index 034482fd03327..006502b62bed6 100644 --- a/pkg/sql/colexec/lockop/lock_op.go +++ b/pkg/sql/colexec/lockop/lock_op.go @@ -19,6 +19,7 @@ import ( "context" "encoding/hex" "fmt" + "math" "sort" "strings" "time" @@ -551,6 +552,15 @@ func doLock( } } + // Attach the current statement/session lock_wait_timeout to the lock options. + if d := lockWaitTimeout(proc, txnOp); d > 0 { + options.LockWaitDeadline = time.Now().Add(d).UnixNano() + options, err = refreshLockWaitOptions(options) + if err != nil { + return false, false, timestamp.Timestamp{}, err + } + } + start := time.Now() key := txnOp.AddWaitLock(tableID, rows, options) defer txnOp.RemoveWaitLock(key) @@ -781,6 +791,48 @@ type lockRetryState struct { useMemoryRetrySlot bool } +func lockWaitTimeout(proc *process.Process, txnOp client.TxnOperator) time.Duration { + if proc != nil && proc.GetResolveVariableFunc() != nil { + if v, err := proc.GetResolveVariableFunc()("lock_wait_timeout", true, false); err == nil { + switch n := v.(type) { + case int64: + if n > 0 { + return time.Duration(n) * time.Second + } + case int: + if n > 0 { + return time.Duration(n) * time.Second + } + case uint64: + if n > 0 { + return time.Duration(n) * time.Second + } + } + } + } + if proc != nil && proc.GetSessionInfo() != nil { + if seconds := proc.GetSessionInfo().LockWaitTimeout; seconds > 0 { + return time.Duration(seconds) * time.Second + } + } + return client.LockWaitTimeoutFromTxn(txnOp) +} + +func refreshLockWaitOptions(options lock.LockOptions) (lock.LockOptions, error) { + if options.LockWaitDeadline <= 0 { + return options, nil + } + remaining := time.Until(time.Unix(0, options.LockWaitDeadline)) + if remaining <= 0 { + return options, lockservice.ErrLockTimeout + } + options.LockWaitTimeout = int64(math.Ceil(remaining.Seconds())) + if options.LockWaitTimeout <= 0 { + options.LockWaitTimeout = 1 + } + return options, nil +} + func lockWithRetry( ctx context.Context, lockService lockservice.LockService, @@ -798,12 +850,20 @@ func lockWithRetry( var err error retryState := lockRetryState{} + options, err = refreshLockWaitOptions(options) + if err != nil { + return result, err + } result, err = LockWithMayUpgrade(ctx, lockService, tableID, rows, txnID, options, fetchFunc, vec, opts, pkType) if !canRetryLock(ctx, tableID, txnOp, err, &retryState) { return result, getLockRetryExitError(ctx, err) } for { + options, err = refreshLockWaitOptions(options) + if err != nil { + return result, err + } result, err = lockService.Lock(ctx, tableID, rows, txnID, options) if !canRetryLock(ctx, tableID, txnOp, err, &retryState) { return result, getLockRetryExitError(ctx, err) @@ -823,6 +883,11 @@ func LockWithMayUpgrade( opts LockOptions, pkType types.Type, ) (lock.Result, error) { + var err error + options, err = refreshLockWaitOptions(options) + if err != nil { + return lock.Result{}, err + } result, err := lockService.Lock(ctx, tableID, rows, txnID, options) if !moerr.IsMoErrCode(err, moerr.ErrLockNeedUpgrade) { return result, err @@ -841,6 +906,10 @@ func LockWithMayUpgrade( opts.filterCols, ) options.Granularity = ng + options, err = refreshLockWaitOptions(options) + if err != nil { + return lock.Result{}, err + } return lockService.Lock(ctx, tableID, nrows, txnID, options) } diff --git a/pkg/sql/colexec/lockop/lock_op_test.go b/pkg/sql/colexec/lockop/lock_op_test.go index 73b8ad406d8ae..3f8ff396e1c09 100644 --- a/pkg/sql/colexec/lockop/lock_op_test.go +++ b/pkg/sql/colexec/lockop/lock_op_test.go @@ -15,6 +15,7 @@ package lockop import ( + "bytes" "context" "math" "testing" @@ -75,6 +76,208 @@ func forceLockRetryMemoryPressure(t *testing.T, level lockRetryMemoryPressureLev }) } +func TestLockWaitTimeoutUsesCurrentSessionValue(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + txnOp := mock_frontend.NewMockTxnOperator(ctrl) + txnOp.EXPECT().TxnOptions().Return(txnpb.TxnOptions{ + LockWaitTimeout: int64(60 * time.Second), + }).AnyTimes() + + proc := process.NewTopProcess( + context.Background(), + mpool.MustNewZero(), + nil, + txnOp, + nil, + nil, + nil, + nil, + nil, + nil, + nil) + proc.SetResolveVariableFunc(func(varName string, isSystemVar, isGlobalVar bool) (interface{}, error) { + require.Equal(t, "lock_wait_timeout", varName) + require.True(t, isSystemVar) + require.False(t, isGlobalVar) + return int64(2), nil + }) + require.Equal(t, 2*time.Second, lockWaitTimeout(proc, txnOp)) + + proc.SetResolveVariableFunc(nil) + proc.GetSessionInfo().LockWaitTimeout = 3 + require.Equal(t, 3*time.Second, lockWaitTimeout(proc, txnOp)) + + proc.GetSessionInfo().LockWaitTimeout = 0 + require.Equal(t, 60*time.Second, lockWaitTimeout(proc, txnOp)) +} + +func TestLockOpHelpers(t *testing.T) { + op := NewArgument() + defer op.Release() + + require.Equal(t, opName, op.TypeName()) + + var buf bytes.Buffer + op.String(&buf) + require.Equal(t, opName+": lock-op()", buf.String()) + + parker := types.NewPacker() + defer parker.Close() + opts := DefaultLockOptions(parker). + WithLockSharding(lock.Sharding_ByRow). + WithLockGroup(7). + WithLockMode(lock.LockMode_Shared). + WithLockTable(true, true) + require.Equal(t, lock.Sharding_ByRow, opts.sharding) + require.Equal(t, uint32(7), opts.group) + require.Equal(t, lock.LockMode_Shared, opts.mode) + require.True(t, opts.lockTable) + require.True(t, opts.changeDef) +} + +func TestRefreshLockWaitOptionsUsesRemainingDeadline(t *testing.T) { + options := lock.LockOptions{ + LockWaitDeadline: time.Now().Add(1500 * time.Millisecond).UnixNano(), + LockWaitTimeout: 60, + } + + refreshed, err := refreshLockWaitOptions(options) + require.NoError(t, err) + require.Greater(t, refreshed.LockWaitTimeout, int64(0)) + require.LessOrEqual(t, refreshed.LockWaitTimeout, int64(2)) + require.Equal(t, options.LockWaitDeadline, refreshed.LockWaitDeadline) +} + +func TestRefreshLockWaitOptionsReturnsTimeoutAfterDeadline(t *testing.T) { + options := lock.LockOptions{LockWaitDeadline: time.Now().Add(-time.Second).UnixNano()} + + _, err := refreshLockWaitOptions(options) + require.ErrorIs(t, err, lockservice.ErrLockTimeout) +} + +func TestLockOpTargetHelpers(t *testing.T) { + op := NewArgument() + defer op.Release() + + expr := plan2.MakePlan2Int32ConstExprWithType(1) + op.AddLockTarget(11, &plan.ObjectRef{SchemaName: "db", ObjName: "t1"}, 0, types.T_int32.ToType(), -1, -1, expr, false) + op.AddLockTarget(22, &plan.ObjectRef{SchemaName: "db", ObjName: "t2"}, 1, types.T_int64.ToType(), -1, -1, nil, true) + + require.Equal(t, []*plan.Expr{expr}, op.GetLockRowsExpressions()) + + folded, err := op.RewriteLockRowsExpressions(func(e *plan.Expr) (*plan.Expr, bool, error) { + return plan2.MakePlan2Int32ConstExprWithType(2), true, nil + }) + require.NoError(t, err) + require.True(t, folded) + require.NotNil(t, op.targets[0].lockRows) + require.NotNil(t, op.targets[1].objRef) + + folded, err = op.RewriteLockRowsExpressions(func(e *plan.Expr) (*plan.Expr, bool, error) { + return e, false, nil + }) + require.NoError(t, err) + require.False(t, folded) + + dst := NewArgument() + defer dst.Release() + dst.CopyTargetsFrom(op) + require.Equal(t, len(op.targets), len(dst.targets)) + require.Equal(t, op.targets[0].tableID, dst.targets[0].tableID) + require.Equal(t, op.targets[1].objRef.ObjName, dst.targets[1].objRef.ObjName) + + pipelineTargets := op.CopyToPipelineTarget() + require.Len(t, pipelineTargets, 2) + require.Equal(t, uint64(11), pipelineTargets[0].TableId) + require.Equal(t, uint64(22), pipelineTargets[1].TableId) + + op.LockTable(11, true) + require.True(t, op.targets[0].lockTable) + require.True(t, op.targets[0].changeDef) + require.Equal(t, lock.LockMode_Exclusive, op.targets[0].mode) + + op.LockTableWithMode(22, lock.LockMode_Shared, false) + require.True(t, op.targets[1].lockTable) + require.False(t, op.targets[1].changeDef) + require.Equal(t, lock.LockMode_Shared, op.targets[1].mode) +} + +func TestAddLockTargetWithPartitionAndMode(t *testing.T) { + op := NewArgument() + defer op.Release() + + one := op.AddLockTargetWithPartitionAndMode( + []uint64{33}, + lock.LockMode_Shared, + 0, + types.T_int32.ToType(), + 1, + nil, + true, + 2, + ) + require.Len(t, one.targets, 1) + require.Equal(t, uint64(33), one.targets[0].tableID) + require.Equal(t, int32(-1), one.targets[0].partitionColumnIndexInBatch) + + many := op.AddLockTargetWithPartition( + []uint64{44, 55}, + 0, + types.T_int64.ToType(), + 1, + nil, + false, + 3, + ) + require.Len(t, many.targets, 3) + require.Equal(t, uint64(44), many.targets[1].tableID) + require.Equal(t, uint64(55), many.targets[2].tableID) + require.Equal(t, int32(3), many.targets[1].filterColIndexInBatch) + require.NotNil(t, many.targets[1].filter) +} + +func TestHasNewVersionInRange(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + eng := mock_frontend.NewMockEngine(ctrl) + rel := mock_frontend.NewMockRelation(ctrl) + txnOp := mock_frontend.NewMockTxnOperator(ctrl) + txnOp.EXPECT().Txn().Return(txnpb.TxnMeta{ID: []byte("txn1")}).AnyTimes() + proc := process.NewTopProcess( + context.Background(), + mpool.MustNewZero(), + nil, + txnOp, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + ) + analyzer := process.NewTempAnalyzer() + bat := batch.New(nil) + + changed, err := hasNewVersionInRange(proc, rel, analyzer, 1, eng, nil, 0, -1, timestamp.Timestamp{}, timestamp.Timestamp{}) + require.NoError(t, err) + require.False(t, changed) + + eng.EXPECT().GetRelationById(gomock.Any(), txnOp, uint64(2)).Return("", "", nil, assert.AnError) + changed, err = hasNewVersionInRange(proc, nil, analyzer, 2, eng, bat, 0, -1, timestamp.Timestamp{}, timestamp.Timestamp{}) + require.Error(t, err) + require.False(t, changed) + + eng.EXPECT().GetRelationById(gomock.Any(), txnOp, uint64(3)).Return("", "", rel, nil) + rel.EXPECT().PrimaryKeysMayBeModified(gomock.Any(), gomock.Any(), gomock.Any(), bat, int32(0), int32(-1)).Return(true, nil) + changed, err = hasNewVersionInRange(proc, nil, analyzer, 3, eng, bat, 0, -1, timestamp.Timestamp{}, timestamp.Timestamp{}) + require.NoError(t, err) + require.True(t, changed) +} + func TestLockWithRetryReturnsBackendErrorWhenDeadlineExceededStopsBoundedRetry(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() @@ -735,6 +938,8 @@ func TestLockWithRetryFailsFastWhenBackendRetryBudgetDisabled(t *testing.T) { } func TestLockWithRetryRetriesInsideLoopAndReturnsSecondResult(t *testing.T) { + forceLockRetryMemoryPressure(t, lockRetryMemoryPressureNormal) + ctrl := gomock.NewController(t) defer ctrl.Finish() diff --git a/pkg/txn/client/operator.go b/pkg/txn/client/operator.go index a0ac4c9929ac5..0d17de66ed23b 100644 --- a/pkg/txn/client/operator.go +++ b/pkg/txn/client/operator.go @@ -139,6 +139,14 @@ func WithTxnLockService(lockService lockservice.LockService) TxnOption { } } +// WithTxnLockWaitTimeout sets the session-level lock wait timeout on the txn. +// If set, the lock service will use this value instead of the global config. +func WithTxnLockWaitTimeout(timeout time.Duration) TxnOption { + return func(tc *txnOperator) { + tc.opts.options.LockWaitTimeout = int64(timeout) + } +} + // WithTxnCreateBy set txn create by. func WithTxnCreateBy( accountID uint32, @@ -648,6 +656,15 @@ func (tc *txnOperator) GetWaitActiveCost() time.Duration { return tc.reset.waitActiveCost } +// LockWaitTimeoutFromTxn returns the lock wait timeout from a txn operator, or 0. +// The timeout is stored in TxnOptions as a time.Duration in nanoseconds. +func LockWaitTimeoutFromTxn(op TxnOperator) time.Duration { + if op == nil { + return 0 + } + return time.Duration(op.TxnOptions().LockWaitTimeout) +} + func (tc *txnOperator) notifyActive() { if tc.reset.waiter == nil { panic("BUG: notify active on non-waiter txn operator") diff --git a/pkg/txn/client/operator_test.go b/pkg/txn/client/operator_test.go index f53bdb0efdf1d..6686e958c569b 100644 --- a/pkg/txn/client/operator_test.go +++ b/pkg/txn/client/operator_test.go @@ -1184,3 +1184,23 @@ func TestCancelAndWaitRunningSQL_Timeout(t *testing.T) { }, ) } + +func TestWithTxnLockWaitTimeout(t *testing.T) { + runOperatorTests( + t, + func(ctx context.Context, tc *txnOperator, _ *testTxnSender) { + require.Equal(t, time.Duration(0), LockWaitTimeoutFromTxn(tc)) + }, + WithTxnLockWaitTimeout(0), + ) + + runOperatorTests( + t, + func(ctx context.Context, tc *txnOperator, _ *testTxnSender) { + require.Equal(t, 60*time.Second, LockWaitTimeoutFromTxn(tc)) + wrapped := struct{ TxnOperator }{TxnOperator: tc} + require.Equal(t, 60*time.Second, LockWaitTimeoutFromTxn(wrapped)) + }, + WithTxnLockWaitTimeout(60*time.Second), + ) +} diff --git a/pkg/vm/process/process_codec.go b/pkg/vm/process/process_codec.go index fe063c0d792fa..9646d1f67170f 100644 --- a/pkg/vm/process/process_codec.go +++ b/pkg/vm/process/process_codec.go @@ -16,6 +16,7 @@ package process import ( "context" + "math" "time" "github.com/matrixorigin/matrixone/pkg/common/mpool" @@ -89,14 +90,15 @@ func (proc *Process) BuildProcessInfo( } procInfo.SessionInfo = pipeline.SessionInfo{ - User: proc.Base.SessionInfo.GetUser(), - Host: proc.Base.SessionInfo.GetHost(), - Role: proc.Base.SessionInfo.GetRole(), - ConnectionId: proc.Base.SessionInfo.GetConnectionID(), - Database: proc.Base.SessionInfo.GetDatabase(), - Version: proc.Base.SessionInfo.GetVersion(), - TimeZone: timeBytes, - QueryId: proc.Base.SessionInfo.QueryId, + User: proc.Base.SessionInfo.GetUser(), + Host: proc.Base.SessionInfo.GetHost(), + Role: proc.Base.SessionInfo.GetRole(), + ConnectionId: proc.Base.SessionInfo.GetConnectionID(), + Database: proc.Base.SessionInfo.GetDatabase(), + Version: proc.Base.SessionInfo.GetVersion(), + TimeZone: timeBytes, + QueryId: proc.Base.SessionInfo.QueryId, + LockWaitTimeout: resolveLockWaitTimeoutSeconds(proc), } } { // log info @@ -294,14 +296,15 @@ func ConvertToProcessSessionInfo( sei pipeline.SessionInfo, ) (SessionInfo, error) { sessionInfo := SessionInfo{ - User: sei.User, - Host: sei.Host, - Role: sei.Role, - ConnectionID: sei.ConnectionId, - Database: sei.Database, - Version: sei.Version, - Account: sei.Account, - QueryId: sei.QueryId, + User: sei.User, + Host: sei.Host, + Role: sei.Role, + ConnectionID: sei.ConnectionId, + Database: sei.Database, + Version: sei.Version, + Account: sei.Account, + QueryId: sei.QueryId, + LockWaitTimeout: sei.LockWaitTimeout, } t := time.Time{} err := t.UnmarshalBinary(sei.TimeZone) @@ -311,3 +314,40 @@ func ConvertToProcessSessionInfo( sessionInfo.TimeZone = t.Location() return sessionInfo, nil } + +func resolveLockWaitTimeoutSeconds(proc *Process) int64 { + if proc == nil || proc.GetResolveVariableFunc() == nil { + return procSessionLockWaitTimeout(proc) + } + if v, err := proc.GetResolveVariableFunc()("lock_wait_timeout", true, false); err == nil { + if seconds := lockWaitTimeoutSeconds(v); seconds > 0 { + return seconds + } + } + return procSessionLockWaitTimeout(proc) +} + +func procSessionLockWaitTimeout(proc *Process) int64 { + if proc == nil || proc.GetSessionInfo() == nil { + return 0 + } + return proc.GetSessionInfo().LockWaitTimeout +} + +func lockWaitTimeoutSeconds(v any) int64 { + switch n := v.(type) { + case int64: + if n > 0 { + return n + } + case int: + if n > 0 { + return int64(n) + } + case uint64: + if n > 0 && n <= math.MaxInt64 { + return int64(n) + } + } + return 0 +} diff --git a/pkg/vm/process/process_codec_test.go b/pkg/vm/process/process_codec_test.go new file mode 100644 index 0000000000000..07e45eabf42a7 --- /dev/null +++ b/pkg/vm/process/process_codec_test.go @@ -0,0 +1,231 @@ +// Copyright 2021-2024 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package process + +import ( + "context" + "testing" + "time" + + "github.com/google/uuid" + "github.com/matrixorigin/matrixone/pkg/common/mpool" + rt "github.com/matrixorigin/matrixone/pkg/common/runtime" + "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/pb/metadata" + "github.com/matrixorigin/matrixone/pkg/pb/pipeline" + txnpb "github.com/matrixorigin/matrixone/pkg/pb/txn" + "github.com/matrixorigin/matrixone/pkg/txn/client" + "github.com/stretchr/testify/require" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +type fakeCodecTxnOperator struct { + client.TxnOperator + snapshot txnpb.CNTxnSnapshot +} + +func (f fakeCodecTxnOperator) Snapshot() (txnpb.CNTxnSnapshot, error) { + return f.snapshot, nil +} + +type fakeCodecTxnClient struct { + client.TxnClient + op client.TxnOperator +} + +func (f fakeCodecTxnClient) NewWithSnapshot(snapshot txnpb.CNTxnSnapshot) (client.TxnOperator, error) { + return f.op, nil +} + +func newCodecTestProcess(t *testing.T) (*Process, client.TxnOperator) { + t.Helper() + + txnOp := fakeCodecTxnOperator{snapshot: txnpb.CNTxnSnapshot{ + Txn: txnpb.TxnMeta{ID: []byte("txn1")}, + }} + + ctx := defines.AttachAccountId(context.Background(), 42) + proc := NewTopProcess( + ctx, + mpool.MustNewZero(), + nil, + txnOp, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + ) + proc.SetQueryId("query-1") + proc.Base.UnixTime = 12345 + proc.Base.SessionInfo = SessionInfo{ + Account: "acc", + User: "user", + Host: "host", + Role: "role", + ConnectionID: 99, + Database: "db1", + Version: "v1", + TimeZone: time.FixedZone("UTC+8", 8*3600), + LockWaitTimeout: 7, + QueryId: []string{"stmt-qid"}, + LogLevel: zap.WarnLevel, + SessionId: uuid.MustParse("11111111-2222-3333-4444-555555555555"), + } + sp := NewStmtProfile(uuid.MustParse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"), uuid.MustParse("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb")) + sp.SetTxnId([]byte("txn-profile-123456")) + sp.SetStmtId(uuid.MustParse("cccccccc-cccc-cccc-cccc-cccccccccccc")) + proc.SetStmtProfile(sp) + + vec := vector.NewVec(types.T_text.ToType()) + require.NoError(t, vector.AppendBytes(vec, []byte("a"), false, proc.Mp())) + require.NoError(t, vector.AppendBytes(vec, []byte("b"), true, proc.Mp())) + proc.SetPrepareParams(vec) + return proc, txnOp +} + +func TestProcessCodecHelpers(t *testing.T) { + t.Run("limitation conversion", func(t *testing.T) { + lim := Limitation{Size: 1, BatchRows: 2, BatchSize: 3, PartitionRows: 4, ReaderSize: 5} + pb := convertToPipelineLimitation(lim) + require.Equal(t, lim.Size, pb.Size) + require.Equal(t, lim.BatchRows, pb.BatchRows) + require.Equal(t, lim.BatchSize, pb.BatchSize) + require.Equal(t, lim.PartitionRows, pb.PartitionRows) + require.Equal(t, lim.ReaderSize, pb.ReaderSize) + require.Equal(t, lim, ConvertToProcessLimitation(pb)) + }) + + t.Run("log level mapping", func(t *testing.T) { + require.Equal(t, pipeline.SessionLoggerInfo_Debug, zapLogLevel2EnumLogLevel(zap.DebugLevel)) + require.Equal(t, pipeline.SessionLoggerInfo_Info, zapLogLevel2EnumLogLevel(zapcore.Level(99))) + require.Equal(t, zap.WarnLevel, EnumLogLevel2ZapLogLevel(pipeline.SessionLoggerInfo_Warn)) + require.Equal(t, zap.InfoLevel, EnumLogLevel2ZapLogLevel(pipeline.SessionLoggerInfo_LogLevel(99))) + }) + + t.Run("session info conversion", func(t *testing.T) { + timeBytes, err := time.Now().In(time.UTC).MarshalBinary() + require.NoError(t, err) + info, err := ConvertToProcessSessionInfo(pipeline.SessionInfo{ + User: "u", + Host: "h", + Role: "r", + ConnectionId: 1, + Database: "d", + Version: "v", + Account: "a", + QueryId: []string{"q1"}, + TimeZone: timeBytes, + LockWaitTimeout: 9, + }) + require.NoError(t, err) + require.Equal(t, "u", info.User) + require.Equal(t, int64(9), info.LockWaitTimeout) + require.Equal(t, "UTC", info.TimeZone.String()) + + info, err = ConvertToProcessSessionInfo(pipeline.SessionInfo{TimeZone: []byte("bad")}) + require.NoError(t, err) + require.Nil(t, info.TimeZone) + }) + + t.Run("lock wait timeout resolution", func(t *testing.T) { + require.Equal(t, int64(0), procSessionLockWaitTimeout(nil)) + require.Equal(t, int64(0), resolveLockWaitTimeoutSeconds(nil)) + require.Equal(t, int64(3), lockWaitTimeoutSeconds(int64(3))) + require.Equal(t, int64(4), lockWaitTimeoutSeconds(int(4))) + require.Equal(t, int64(5), lockWaitTimeoutSeconds(uint64(5))) + require.Equal(t, int64(0), lockWaitTimeoutSeconds(uint64(^uint64(0)))) + require.Equal(t, int64(0), lockWaitTimeoutSeconds("bad")) + + proc := &Process{Base: &BaseProcess{SessionInfo: SessionInfo{LockWaitTimeout: 7}}} + require.Equal(t, int64(7), resolveLockWaitTimeoutSeconds(proc)) + + proc.SetResolveVariableFunc(func(string, bool, bool) (interface{}, error) { + return int64(11), nil + }) + require.Equal(t, int64(11), resolveLockWaitTimeoutSeconds(proc)) + + proc.SetResolveVariableFunc(func(string, bool, bool) (interface{}, error) { + return int64(0), nil + }) + require.Equal(t, int64(7), resolveLockWaitTimeoutSeconds(proc)) + }) +} + +func TestBuildProcessInfoAndMockProcessInfoWithPro(t *testing.T) { + proc, _ := newCodecTestProcess(t) + info, err := proc.BuildProcessInfo("select 1") + require.NoError(t, err) + require.Equal(t, "query-1", info.Id) + require.Equal(t, "select 1", info.Sql) + require.Equal(t, uint32(42), info.AccountId) + require.Equal(t, int64(2), info.PrepareParams.Length) + require.Equal(t, []bool{false, true}, info.PrepareParams.Nulls) + require.Equal(t, uint64(99), info.SessionInfo.ConnectionId) + require.Equal(t, int64(7), info.SessionInfo.LockWaitTimeout) + require.Equal(t, pipeline.SessionLoggerInfo_Warn, info.SessionLogger.LogLevel) + + mockInfo, err := MockProcessInfoWithPro("select 2", proc) + require.NoError(t, err) + require.Equal(t, "select 2", mockInfo.Sql) + require.Equal(t, "UTC", proc.Base.SessionInfo.TimeZone.String()) +} + +func TestCodecServiceEncodeDecodeAndLookup(t *testing.T) { + proc, _ := newCodecTestProcess(t) + decodedTxn := fakeCodecTxnOperator{} + txnClient := fakeCodecTxnClient{op: decodedTxn} + + codec := NewCodecService(txnClient, nil, nil, nil, nil, nil, nil, nil) + svc := codec.(*codecService) + require.NotNil(t, svc.mp) + + data, err := svc.Encode(proc, "select 3") + require.NoError(t, err) + require.NotEmpty(t, data) + + info, err := proc.BuildProcessInfo("select 3") + require.NoError(t, err) + + decodedProc, err := svc.Decode(context.Background(), info) + require.NoError(t, err) + require.Equal(t, info.Id, decodedProc.QueryId()) + require.Equal(t, info.UnixTime, decodedProc.Base.UnixTime) + require.Equal(t, info.SessionInfo.User, decodedProc.Base.SessionInfo.User) + require.Equal(t, info.SessionInfo.LockWaitTimeout, decodedProc.Base.SessionInfo.LockWaitTimeout) + require.NotNil(t, decodedProc.GetPrepareParams()) + require.Equal(t, 2, decodedProc.GetPrepareParams().Length()) + require.True(t, decodedProc.GetPrepareParams().GetNulls().Contains(1)) + + rtSvc := "codec-test-svc" + runtime := rt.DefaultRuntime() + rt.SetupServiceBasedRuntime(rtSvc, runtime) + runtime.SetGlobalVariables(rt.ProcessCodecService, svc) + require.Same(t, svc, GetCodecService(rtSvc)) +} + +func TestGetCodecServicePanicsWhenMissing(t *testing.T) { + rtSvc := "codec-missing-svc" + runtime := rt.NewRuntime(metadata.ServiceType_CN, rtSvc, nil) + rt.SetupServiceBasedRuntime(rtSvc, runtime) + require.Panics(t, func() { + _ = GetCodecService(rtSvc) + }) +} diff --git a/pkg/vm/process/types.go b/pkg/vm/process/types.go index ff5edea231c12..7c2cb51df7364 100644 --- a/pkg/vm/process/types.go +++ b/pkg/vm/process/types.go @@ -113,6 +113,7 @@ type SessionInfo struct { Database string Version string TimeZone *time.Location + LockWaitTimeout int64 StorageEngine engine.Engine QueryId []string ResultColTypes []types.Type diff --git a/proto/lock.proto b/proto/lock.proto index 956bd914fc6c9..577e3978c797b 100644 --- a/proto/lock.proto +++ b/proto/lock.proto @@ -60,6 +60,8 @@ message LockOptions { uint32 Group = 7; Sharding Sharding = 8; timestamp.Timestamp SnapShotTs = 9 [(gogoproto.nullable) = false]; + int64 LockWaitTimeout = 10; + int64 LockWaitDeadline = 11; } // LockTable describes which CN manages a Table's Locks. diff --git a/proto/pipeline.proto b/proto/pipeline.proto index d6218d8dac60c..4a3572780a38a 100644 --- a/proto/pipeline.proto +++ b/proto/pipeline.proto @@ -567,6 +567,7 @@ message SessionInfo { bytes time_zone = 7; string account = 8; repeated string query_id = 9; + int64 lock_wait_timeout = 10; } message SessionLoggerInfo { diff --git a/proto/txn.proto b/proto/txn.proto index e359ad6ce857d..ad9d7822745eb 100644 --- a/proto/txn.proto +++ b/proto/txn.proto @@ -380,4 +380,5 @@ message TxnOptions { bool autocommit = 15;//AUTOCOMMIT bool inIncrStmt = 16; bool inRollbackStmt = 17; + int64 lockWaitTimeout = 18; } \ No newline at end of file diff --git a/test/distributed/cases/pessimistic_transaction/lock_wait_timeout_remote.result b/test/distributed/cases/pessimistic_transaction/lock_wait_timeout_remote.result new file mode 100644 index 0000000000000..a3759c7b20619 --- /dev/null +++ b/test/distributed/cases/pessimistic_transaction/lock_wait_timeout_remote.result @@ -0,0 +1,20 @@ +drop database if exists lock_wait_timeout_remote_db; +create database lock_wait_timeout_remote_db; +use lock_wait_timeout_remote_db; +create table t(a int primary key, b varchar(64)); +insert into t values (1, 'ONLY_FULL_GROUP_BY'), (2, 'STRICT_TRANS_TABLES'), (3, 'x'); +set @@sql_mode = 'ONLY_FULL_GROUP_BY'; +begin; +set session lock_wait_timeout = 1; +use lock_wait_timeout_remote_db; +set @@sql_mode = 'ONLY_FULL_GROUP_BY'; +begin; +select a, b from t where b = @@sql_mode for update; +➤ a[4,32,0] ¦ b[12,-1,0] 𝄀 +1 ¦ ONLY_FULL_GROUP_BY +select a, b from t where b = @@sql_mode for update; +invalid state lock timeout +rollback; +rollback; +set @@sql_mode = default; +drop database lock_wait_timeout_remote_db; diff --git a/test/distributed/cases/pessimistic_transaction/lock_wait_timeout_remote.sql b/test/distributed/cases/pessimistic_transaction/lock_wait_timeout_remote.sql new file mode 100644 index 0000000000000..2d1fcbcef3c8b --- /dev/null +++ b/test/distributed/cases/pessimistic_transaction/lock_wait_timeout_remote.sql @@ -0,0 +1,34 @@ +-- @suite +-- @case +-- @desc:test lock_wait_timeout changed after BEGIN is honored on remote lock wait path +-- @label:bvt + +drop database if exists lock_wait_timeout_remote_db; +create database lock_wait_timeout_remote_db; +use lock_wait_timeout_remote_db; + +create table t(a int primary key, b varchar(64)); +insert into t values (1, 'ONLY_FULL_GROUP_BY'), (2, 'STRICT_TRANS_TABLES'), (3, 'x'); + +set @@sql_mode = 'ONLY_FULL_GROUP_BY'; + +begin; +set session lock_wait_timeout = 1; + +-- @session:id=1{ +use lock_wait_timeout_remote_db; +set @@sql_mode = 'ONLY_FULL_GROUP_BY'; +begin; +select a, b from t where b = @@sql_mode for update; +-- @session} + +-- @regex("(?s)(invalid state lock timeout|lock timeout|context deadline exceeded)",true) +select a, b from t where b = @@sql_mode for update; +rollback; + +-- @session:id=1{ +rollback; +-- @session} + +set @@sql_mode = default; +drop database lock_wait_timeout_remote_db;