Commit 80bdb1bb authored by 张振华's avatar 张振华

guess

parent 9fe46fb1
...@@ -6,62 +6,59 @@ package executor ...@@ -6,62 +6,59 @@ package executor
import ( import (
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
pkt "github.com/33cn/plugin/plugin/dapp/pokerbull/types" pkt "github.com/33cn/plugin/plugin/dapp/guess/types"
) )
func (c *PokerBull) updateIndex(log *pkt.ReceiptPBGame) (kvs []*types.KeyValue) { func (c *Guess) updateIndex(log *pkt.ReceiptGuessGame) (kvs []*types.KeyValue) {
//先保存本次Action产生的索引 //新创建游戏
kvs = append(kvs, addPBGameStatusAndPlayer(log.Status, log.PlayerNum, log.Value, log.Index, log.GameId)) if log.Status == pkt.GuessGameStatusStart{
kvs = append(kvs, addPBGameStatusIndexKey(log.Status, log.GameId, log.Index)) //kvs = append(kvs, addGuessGameAddrIndexKey(log.Status, log.Addr, log.GameId, log.Index))
kvs = append(kvs, addPBGameAddrIndexKey(log.Status, log.Addr, log.GameId, log.Index)) kvs = append(kvs, addGuessGameStatusIndexKey(log.Status, log.GameId, log.Index))
kvs = append(kvs, addGuessGameAdminIndexKey(log.Status, log.Addr, log.GameId, log.Index))
kvs = append(kvs, addGuessGameAdminStatusIndexKey(log.Status, log.AdminAddr, log.GameId, log.Index))
kvs = append(kvs, addGuessGameCategoryStatusIndexKey(log.Status, log.Category, log.GameId, log.Index))
} else if log.Status == pkt.GuessGameStatusBet {
//如果是下注状态,则有用户进行了下注操作
kvs = append(kvs, addGuessGameAddrIndexKey(log.Status, log.Addr, log.GameId, log.Index))
kvs = append(kvs, addGuessGameAddrStatusIndexKey(log.Status, log.Addr, log.GameId, log.Index))
/* kvs = append(kvs, addGuessGameStatusIndexKey(log.Status, log.GameId, log.Index))
//状态更新 kvs = append(kvs, addGuessGameAdminStatusIndexKey(log.Status, log.AdminAddr, log.GameId, log.Index))
if log.Status == pkt.PBGameActionStart { kvs = append(kvs, addGuessGameAddrStatusIndexKey(log.Status, log.Addr, log.GameId, log.Index))
kvs = append(kvs, delPBGameStatusAndPlayer(pkt.PBGameActionStart, log.PlayerNum, log.Value, log.PrevIndex)) kvs = append(kvs, addGuessGameCategoryStatusIndexKey(log.Status, log.Category, log.GameId, log.Index))
kvs = append(kvs, delPBGameStatusIndexKey(pkt.PBGameActionStart, log.PrevIndex)) //对于老状态进行删除
} kvs = append(kvs, delGuessGameStatusIndexKey(log.PreStatus, log.PreIndex))
kvs = append(kvs, delGuessGameAdminStatusIndexKey(log.PreStatus, log.AdminAddr, log.PreIndex))
if log.Status == pkt.PBGameActionContinue { kvs = append(kvs, delGuessGameCategoryStatusIndexKey(log.PreStatus, log.Category, log.PreIndex))
kvs = append(kvs, delPBGameStatusAndPlayer(pkt.PBGameActionStart, log.PlayerNum, log.Value, log.PrevIndex)) }else if log.StatusChange {
kvs = append(kvs, delPBGameStatusAndPlayer(pkt.PBGameActionContinue, log.PlayerNum, log.Value, log.PrevIndex)) //其他状态时的状态发生变化,要将老状态对应的记录删除,同时加入新状态记录;对于每个地址的下注记录也需要遍历处理。
kvs = append(kvs, delPBGameStatusIndexKey(pkt.PBGameActionStart, log.PrevIndex)) kvs = append(kvs, addGuessGameStatusIndexKey(log.Status, log.GameId, log.Index))
kvs = append(kvs, delPBGameStatusIndexKey(pkt.PBGameActionContinue, log.PrevIndex)) kvs = append(kvs, addGuessGameAdminStatusIndexKey(log.Status, log.AdminAddr, log.GameId, log.Index))
} kvs = append(kvs, addGuessGameCategoryStatusIndexKey(log.Status, log.Category, log.GameId, log.Index))
if log.Status == pkt.PBGameActionQuit {
kvs = append(kvs, delPBGameStatusAndPlayer(pkt.PBGameActionStart, log.PlayerNum, log.Value, log.PrevIndex))
kvs = append(kvs, delPBGameStatusAndPlayer(pkt.PBGameActionContinue, log.PlayerNum, log.Value, log.PrevIndex))
kvs = append(kvs, delPBGameStatusIndexKey(pkt.PBGameActionStart, log.PrevIndex))
kvs = append(kvs, delPBGameStatusIndexKey(pkt.PBGameActionContinue, log.PrevIndex))
}*/ kvs = append(kvs, delGuessGameStatusIndexKey(log.PreStatus, log.PreIndex))
kvs = append(kvs, delGuessGameAdminStatusIndexKey(log.PreStatus, log.AdminAddr, log.PreIndex))
kvs = append(kvs, delGuessGameCategoryStatusIndexKey(log.PreStatus, log.Category, log.PreIndex))
//结束一局,更新所有玩家地址状态
if !log.IsWaiting { //从game中遍历每个地址的记录进行新增和删除
for _, v := range log.Players { kvs = append(kvs, addGuessGameAddrStatusIndexKey(log.Status, log.Addr, log.GameId, log.Index))
if v != log.Addr { kvs = append(kvs, delGuessGameAddrStatusIndexKey(log.Status, log.Addr, log.Index))
kvs = append(kvs, addGuessGameAddrIndexKey(log.Status, v, log.GameId, log.Index))
}
kvs = append(kvs, delPBGameAddrIndexKey(v, log.PrevIndex))
}
kvs = append(kvs, delPBGameStatusAndPlayer(log.PreStatus, log.PlayerNum, log.Value, log.PrevIndex))
kvs = append(kvs, delPBGameStatusIndexKey(log.PreStatus, log.PrevIndex))
} }
return kvs return kvs
} }
func (c *PokerBull) execLocal(receipt *types.ReceiptData) (*types.LocalDBSet, error) { func (c *Guess) execLocal(receipt *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{} dbSet := &types.LocalDBSet{}
if receipt.GetTy() != types.ExecOk { if receipt.GetTy() != types.ExecOk {
return dbSet, nil return dbSet, nil
} }
for i := 0; i < len(receipt.Logs); i++ { for i := 0; i < len(receipt.Logs); i++ {
item := receipt.Logs[i] item := receipt.Logs[i]
if item.Ty == pkt.TyLogPBGameStart || item.Ty == pkt.TyLogPBGameContinue || item.Ty == pkt.TyLogPBGameQuit { if item.Ty >= pkt.TyLogGuessGameStart && item.Ty <= pkt.TyLogGuessGameTimeout {
var Gamelog pkt.ReceiptPBGame var Gamelog pkt.ReceiptGuessGame
err := types.Decode(item.Log, &Gamelog) err := types.Decode(item.Log, &Gamelog)
if err != nil { if err != nil {
panic(err) //数据错误了,已经被修改了 panic(err) //数据错误了,已经被修改了
...@@ -73,14 +70,14 @@ func (c *PokerBull) execLocal(receipt *types.ReceiptData) (*types.LocalDBSet, er ...@@ -73,14 +70,14 @@ func (c *PokerBull) execLocal(receipt *types.ReceiptData) (*types.LocalDBSet, er
return dbSet, nil return dbSet, nil
} }
func (c *PokerBull) ExecLocal_Start(payload *pkt.PBGameStart, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) { func (c *Guess) ExecLocal_Start(payload *pkt.PBGameStart, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
return c.execLocal(receiptData) return c.execLocal(receiptData)
} }
func (c *PokerBull) ExecLocal_Continue(payload *pkt.PBGameContinue, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) { func (c *Guess) ExecLocal_Continue(payload *pkt.PBGameContinue, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
return c.execLocal(receiptData) return c.execLocal(receiptData)
} }
func (c *PokerBull) ExecLocal_Quit(payload *pkt.PBGameQuit, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) { func (c *Guess) ExecLocal_Quit(payload *pkt.PBGameQuit, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
return c.execLocal(receiptData) return c.execLocal(receiptData)
} }
...@@ -45,43 +45,101 @@ func (g *Guess) GetDriverName() string { ...@@ -45,43 +45,101 @@ func (g *Guess) GetDriverName() string {
return pkt.GuessX return pkt.GuessX
} }
//addr prefix
func calcGuessGameAddrPrefix(addr string) []byte { func calcGuessGameAddrPrefix(addr string) []byte {
key := fmt.Sprintf("LODB-guess-addr:%s:", addr) key := fmt.Sprintf("LODB-guess-addr:%s:", addr)
return []byte(key) return []byte(key)
} }
//addr index
func calcGuessGameAddrKey(addr string, index int64) []byte { func calcGuessGameAddrKey(addr string, index int64) []byte {
key := fmt.Sprintf("LODB-guess-addr:%s:%018d", addr, index) key := fmt.Sprintf("LODB-guess-addr:%s:%018d", addr, index)
return []byte(key) return []byte(key)
} }
//status prefix
func calcGuessGameStatusPrefix(status int32) []byte { func calcGuessGameStatusPrefix(status int32) []byte {
key := fmt.Sprintf("LODB-guess-status-index:%d:", status) key := fmt.Sprintf("LODB-guess-status-index:%d:", status)
return []byte(key) return []byte(key)
} }
//status index
func calcGuessGameStatusKey(status int32, index int64) []byte { func calcGuessGameStatusKey(status int32, index int64) []byte {
key := fmt.Sprintf("LODB-guess-status-index:%d:%018d", status, index) key := fmt.Sprintf("LODB-guess-status-index:%d:%018d", status, index)
return []byte(key) return []byte(key)
} }
func calcGuessGameStatusAndPlayerKey(category string, status, index int64) []byte { //addr status prefix
key := fmt.Sprintf("LODB-guess-category-status:%s:%d:%018d", category, status, index) func calcGuessGameAddrStatusPrefix(addr string, status int32) []byte {
key := fmt.Sprintf("LODB-guess-addr-status-index:%s:%d:", addr, status)
return []byte(key) return []byte(key)
} }
func calcGuessGameStatusAndPlayerPrefix(category string, status int32) []byte { //addr status index
var key string func calcGuessGameAddrStatusKey(addr string, status int32, index int64) []byte {
key = fmt.Sprintf("LODB-guess-category-status:%s:%d", category, status) key := fmt.Sprintf("LODB-guess-addr-status-index:%s:%d:%018d", addr, status, index)
return []byte(key)
}
//admin prefix
func calcGuessGameAdminPrefix(addr string) []byte {
key := fmt.Sprintf("LODB-guess-admin:%s:", addr)
return []byte(key)
}
//admin index
func calcGuessGameAdminKey(addr string, index int64) []byte {
key := fmt.Sprintf("LODB-guess-admin:%s:%018d", addr, index)
return []byte(key)
}
//admin status prefix
func calcGuessGameAdminStatusPrefix(admin string, status int32) []byte {
key := fmt.Sprintf("LODB-guess-admin-status-index:%s:%d:", admin, status)
return []byte(key)
}
//admin status index
func calcGuessGameAdminStatusKey(admin string, status int32, index int64) []byte {
key := fmt.Sprintf("LODB-guess-admin-status-index:%s:%d:%018d", admin, status, index)
return []byte(key)
}
func calcGuessGameCategoryStatusPrefix(category string, status int32) []byte {
key := fmt.Sprintf("LODB-guess-category-status-index:%s:%d:", category, status)
return []byte(key) return []byte(key)
} }
func calcGuessGameCategoryStatusKey(category string, status int32, index int64) []byte {
key := fmt.Sprintf("LODB-guess-category-status-index:%s:%d:%018d", category, status, index)
return []byte(key)
}
func addGuessGameAddrIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAddrKey(addr, index)
record := &pkt.GuessGameRecord{
GameId: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
return kv
}
func delGuessGameAddrIndexKey(addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAddrKey(addr, index)
kv.Value = nil
return kv
}
func addGuessGameStatusIndexKey(status int32, gameID string, index int64) *types.KeyValue { func addGuessGameStatusIndexKey(status int32, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{} kv := &types.KeyValue{}
kv.Key = calcGuessGameStatusKey(status, index) kv.Key = calcGuessGameStatusKey(status, index)
record := &pkt.PBGameIndexRecord{ record := &pkt.GuessGameRecord{
GameId: gameID, GameId: gameID,
Status: status,
Index: index, Index: index,
} }
kv.Value = types.Encode(record) kv.Value = types.Encode(record)
...@@ -95,10 +153,10 @@ func delGuessGameStatusIndexKey(status int32, index int64) *types.KeyValue { ...@@ -95,10 +153,10 @@ func delGuessGameStatusIndexKey(status int32, index int64) *types.KeyValue {
return kv return kv
} }
func addGuessGameAddrIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue { func addGuessGameAddrStatusIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{} kv := &types.KeyValue{}
kv.Key = calcGuessGameAddrKey(addr, index) kv.Key = calcGuessGameAddrStatusKey(addr, status, index)
record := &pkt.PBGameRecord{ record := &pkt.GuessGameRecord{
GameId: gameID, GameId: gameID,
Status: status, Status: status,
Index: index, Index: index,
...@@ -107,27 +165,66 @@ func addGuessGameAddrIndexKey(status int32, addr, gameID string, index int64) *t ...@@ -107,27 +165,66 @@ func addGuessGameAddrIndexKey(status int32, addr, gameID string, index int64) *t
return kv return kv
} }
func delGuessGameAddrIndexKey(addr string, index int64) *types.KeyValue { func delGuessGameAddrStatusIndexKey(status int32, addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{} kv := &types.KeyValue{}
kv.Key = calcGuessGameAddrKey(addr, index) kv.Key = calcGuessGameAddrStatusKey(addr, status, index)
kv.Value = nil
return kv
}
func addGuessGameAdminIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAdminKey(addr, index)
record := &pkt.GuessGameRecord{
GameId: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
return kv
}
func delGuessGameAdminIndexKey(addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAdminKey(addr, index)
kv.Value = nil kv.Value = nil
return kv return kv
} }
func addPBGameStatusAndPlayer(status int32, player int32, value, index int64, gameId string) *types.KeyValue { func addGuessGameAdminStatusIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{} kv := &types.KeyValue{}
kv.Key = calcGuessGameStatusAndPlayerKey(status, player, value, index) kv.Key = calcGuessGameAdminStatusKey(addr, status, index)
record := &pkt.PBGameIndexRecord{ record := &pkt.GuessGameRecord{
GameId: gameId, GameId: gameID,
Status: status,
Index: index, Index: index,
} }
kv.Value = types.Encode(record) kv.Value = types.Encode(record)
return kv return kv
} }
func delPBGameStatusAndPlayer(status int32, player int32, value, index int64) *types.KeyValue { func delGuessGameAdminStatusIndexKey(status int32, addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{} kv := &types.KeyValue{}
kv.Key = calcGuessGameStatusAndPlayerKey(status, player, value, index) kv.Key = calcGuessGameAdminStatusKey(addr, status, index)
kv.Value = nil kv.Value = nil
return kv return kv
} }
func addGuessGameCategoryStatusIndexKey(status int32, category, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameCategoryStatusKey(category, status, index)
record := &pkt.GuessGameRecord{
GameId: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
return kv
}
func delGuessGameCategoryStatusIndexKey(status int32, category string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameCategoryStatusKey(category, status, index)
kv.Value = nil
return kv
}
\ No newline at end of file
...@@ -207,7 +207,7 @@ func (action *Action) getIndex() int64 { ...@@ -207,7 +207,7 @@ func (action *Action) getIndex() int64 {
return action.height*types.MaxTxsPerBlock + int64(action.index) return action.height*types.MaxTxsPerBlock + int64(action.index)
} }
func (action *Action) GetReceiptLog(game *pkt.GuessGame) *types.ReceiptLog { func (action *Action) GetReceiptLog(game *pkt.GuessGame, statusChange bool) *types.ReceiptLog {
log := &types.ReceiptLog{} log := &types.ReceiptLog{}
r := &pkt.ReceiptGuessGame{} r := &pkt.ReceiptGuessGame{}
r.Addr = action.fromaddr r.Addr = action.fromaddr
...@@ -225,8 +225,13 @@ func (action *Action) GetReceiptLog(game *pkt.GuessGame) *types.ReceiptLog { ...@@ -225,8 +225,13 @@ func (action *Action) GetReceiptLog(game *pkt.GuessGame) *types.ReceiptLog {
log.Ty = pkt.TyLogGuessGameTimeout log.Ty = pkt.TyLogGuessGameTimeout
} }
r.Index = game.Index
r.GameId = game.GameId r.GameId = game.GameId
r.Status = game.Status r.Status = game.Status
r.AdminAddr = game.AdminAddr
r.PreStatus = game.PreStatus
r.StatusChange = statusChange
r.PreIndex = game.PreIndex
log.Log = types.Encode(r) log.Log = types.Encode(r)
return log return log
} }
...@@ -456,8 +461,7 @@ func (action *Action) genTxRnd(txhash []byte) (int64, error) { ...@@ -456,8 +461,7 @@ func (action *Action) genTxRnd(txhash []byte) (int64, error) {
// 新建一局游戏 // 新建一局游戏
func (action *Action) newGame(gameId string, start *pkt.GuessGameStart) (*pkt.GuessGame, error) { func (action *Action) newGame(gameId string, start *pkt.GuessGameStart) (*pkt.GuessGame, error) {
var game *pkt.GuessGame game := &pkt.GuessGame{
game = &pkt.GuessGame{
GameId: gameId, GameId: gameId,
Status: pkt.GuessGameActionStart, Status: pkt.GuessGameActionStart,
//StartTime: action.blocktime, //StartTime: action.blocktime,
...@@ -507,7 +511,8 @@ func (action *Action) GameStart(start *pkt.GuessGameStart) (*types.Receipt, erro ...@@ -507,7 +511,8 @@ func (action *Action) GameStart(start *pkt.GuessGameStart) (*types.Receipt, erro
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
if _, ok := getOptions(start.Options); !ok { options, ok := GetOptions(start.Options)
if !ok {
logger.Error("GameStart", "addr", action.fromaddr, "execaddr", action.execaddr, logger.Error("GameStart", "addr", action.fromaddr, "execaddr", action.execaddr,
"err", fmt.Sprintf("The options is illegal:%s", start.Options)) "err", fmt.Sprintf("The options is illegal:%s", start.Options))
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
...@@ -536,16 +541,23 @@ func (action *Action) GameStart(start *pkt.GuessGameStart) (*types.Receipt, erro ...@@ -536,16 +541,23 @@ func (action *Action) GameStart(start *pkt.GuessGameStart) (*types.Receipt, erro
} }
gameId := common.ToHex(action.txhash) gameId := common.ToHex(action.txhash)
var game *pkt.GuessGame = nil
game, err := action.newGame(gameId, start) game, err := action.newGame(gameId, start)
if err != nil { if err != nil {
return nil, err return nil, err
} }
game.StartTime = action.blocktime game.StartTime = action.blocktime
game.AdminAddr = action.fromaddr game.AdminAddr = action.fromaddr
game.PreIndex = 0
game.Index = action.getIndex() game.Index = action.getIndex()
game.Status = pkt.GuessGameStatusStart game.Status = pkt.GuessGameStatusStart
receiptLog := action.GetReceiptLog(game) game.BetStat.TotalBetTimes = 0
game.BetStat.TotalBetsNumber = 0
for i := 0; i < len(options); i++ {
item := &pkt.GuessBetStatItem{Option: options[i], BetsNumber: 0, BetsTimes: 0}
game.BetStat.Items = append(game.BetStat.Items, item)
}
receiptLog := action.GetReceiptLog(game, false)
logs = append(logs, receiptLog) logs = append(logs, receiptLog)
kv = append(kv, action.saveGame(game)...) kv = append(kv, action.saveGame(game)...)
...@@ -582,6 +594,7 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) { ...@@ -582,6 +594,7 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) {
return nil, err return nil, err
} }
prevStatus := game.Status
if game.Status != pkt.GuessGameStatusStart && game.Status != pkt.GuessGameStatusBet && game.Status != pkt.GuessGameStatusStopBet{ if game.Status != pkt.GuessGameStatusStart && game.Status != pkt.GuessGameStatusBet && game.Status != pkt.GuessGameStatusStopBet{
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Status error", logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Status error",
game.GetStatus()) game.GetStatus())
...@@ -591,25 +604,28 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) { ...@@ -591,25 +604,28 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) {
canBet := action.RefreshStatusByTime(game) canBet := action.RefreshStatusByTime(game)
if canBet == false { if canBet == false {
receiptLog := action.GetReceiptLog(game) var receiptLog *types.ReceiptLog
if prevStatus != game.Status {
receiptLog = action.GetReceiptLog(game, true)
} else {
receiptLog = action.GetReceiptLog(game, false)
}
logs = append(logs, receiptLog) logs = append(logs, receiptLog)
kv = append(kv, action.saveGame(game)...) kv = append(kv, action.saveGame(game)...)
return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil
} }
//如果当前游戏状态可以下注,统一设定游戏状态为GuessGameStatusBet
game.Status = pkt.GuessGameStatusBet
//检查竞猜选项是否合法 //检查竞猜选项是否合法
options, legal := getOptions(game.GetOptions()) options, legal := GetOptions(game.GetOptions())
if !legal || len(options) == 0{ if !legal || len(options) == 0{
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Game Options illegal", logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Game Options illegal",
game.GetOptions()) game.GetOptions())
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
if !isLegalOption(options, pbBet.GetOption()) { if !IsLegalOption(options, pbBet.GetOption()) {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Option illegal", logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Option illegal",
pbBet.GetOption()) pbBet.GetOption())
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
...@@ -639,33 +655,44 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) { ...@@ -639,33 +655,44 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) {
logger.Error("GameCreate.ExecFrozen", "addr", action.fromaddr, "execaddr", action.execaddr, "amount", checkValue, "err", err.Error()) logger.Error("GameCreate.ExecFrozen", "addr", action.fromaddr, "execaddr", action.execaddr, "amount", checkValue, "err", err.Error())
return nil, err return nil, err
} }
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
bet := &pkt.GuessBet{ Option: pbBet.GetOption(), BetsNumber: pbBet.BetsNum} //如果当前游戏状态可以下注,统一设定游戏状态为GuessGameStatusBet
player := &pkt.GuessPlayer{ Addr: action.fromaddr, Bet: bet} action.ChangeStatus(game, pkt.GuessGameStatusBet)
game.Plays = append(game.Plays, player) action.AddGuessBet(game, pbBet)
exist := false var receiptLog *types.ReceiptLog
for i := 0; i < len(game.Bets); i ++ { if prevStatus != game.Status {
if game.Bets[i].Option == pbBet.GetOption() { receiptLog = action.GetReceiptLog(game, true)
exist = true } else {
game.Bets[i].BetsNumber += pbBet.GetBetsNum() receiptLog = action.GetReceiptLog(game, false)
}
} }
logs = append(logs, receiptLog)
kv = append(kv, action.saveGame(game)...)
if !exist { return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil
game.Bets = append(game.Bets, bet) }
}
game.BetsNumber += pbBet.GetBetsNum() func (action *Action) AddGuessBet(game *pkt.GuessGame, pbBet *pkt.GuessGameBet) {
bet := &pkt.GuessBet{ Option: pbBet.GetOption(), BetsNumber: pbBet.BetsNum, Index: game.Index}
player := &pkt.GuessPlayer{ Addr: action.fromaddr, Bet: bet}
game.Plays = append(game.Plays, player)
logs = append(logs, receipt.Logs...) for i := 0; i < len(game.BetStat.Items); i ++ {
kv = append(kv, receipt.KV...) if game.BetStat.Items[i].Option == pbBet.GetOption() {
//针对具体选项更新统计项
game.BetStat.Items[i].BetsNumber += pbBet.GetBetsNum()
game.BetStat.Items[i].BetsTimes++
receiptLog := action.GetReceiptLog(game) //更新整体统计
logs = append(logs, receiptLog) game.BetStat.TotalBetsNumber += pbBet.GetBetsNum()
kv = append(kv, action.saveGame(game)...) game.BetStat.TotalBetTimes++
break
}
}
return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil game.BetsNumber += pbBet.GetBetsNum()
} }
func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt, error) { func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt, error) {
...@@ -686,6 +713,7 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt ...@@ -686,6 +713,7 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
prevStatus := game.Status
if game.Status != pkt.GuessGameStatusStart && game.Status != pkt.GuessGameStatusBet && game.Status != pkt.GuessGameStatusStopBet{ if game.Status != pkt.GuessGameStatusStart && game.Status != pkt.GuessGameStatusBet && game.Status != pkt.GuessGameStatusStopBet{
logger.Error("GamePublish", "addr", action.fromaddr, "execaddr", action.execaddr, "Status error", logger.Error("GamePublish", "addr", action.fromaddr, "execaddr", action.execaddr, "Status error",
game.GetStatus()) game.GetStatus())
...@@ -693,20 +721,19 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt ...@@ -693,20 +721,19 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt
} }
//检查竞猜选项是否合法 //检查竞猜选项是否合法
options, legal := getOptions(game.GetOptions()) options, legal := GetOptions(game.GetOptions())
if !legal || len(options) == 0{ if !legal || len(options) == 0{
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Game Options illegal", logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Game Options illegal",
game.GetOptions()) game.GetOptions())
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
if !isLegalOption(options, publish.GetResult()) { if !IsLegalOption(options, publish.GetResult()) {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Option illegal", logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Option illegal",
publish.GetResult()) publish.GetResult())
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
game.Status = pkt.GuessGameStatusPublish
game.Result = publish.Result game.Result = publish.Result
//先遍历所有下注数据,对于输家,转移资金到Admin账户合约地址; //先遍历所有下注数据,对于输家,转移资金到Admin账户合约地址;
...@@ -723,14 +750,15 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt ...@@ -723,14 +750,15 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...) kv = append(kv, receipt.KV...)
} }
action.ChangeStatus(game, pkt.GuessGameStatusPublish)
//计算竞猜正确的筹码总数 //计算竞猜正确的筹码总数
totalBetsNumber := uint32(0) totalBetsNumber := game.BetStat.TotalBetsNumber
winBetsNumber := uint32(0) winBetsNumber := uint32(0)
for j := 0; j < len(game.Bets); j++ { for j := 0; j < len(game.BetStat.Items); j++ {
if game.Bets[j].Option == game.Result { if game.BetStat.Items[j].Option == game.Result {
winBetsNumber = game.Bets[j].BetsNumber winBetsNumber = game.BetStat.Items[j].BetsNumber
} }
totalBetsNumber += game.Bets[j].BetsNumber
} }
//再遍历赢家,按照投注占比分配所有筹码 //再遍历赢家,按照投注占比分配所有筹码
...@@ -763,7 +791,12 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt ...@@ -763,7 +791,12 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt
kv = append(kv, receipt.KV...) kv = append(kv, receipt.KV...)
} }
receiptLog := action.GetReceiptLog(game) var receiptLog *types.ReceiptLog
if prevStatus != game.Status {
receiptLog = action.GetReceiptLog(game, true)
} else {
receiptLog = action.GetReceiptLog(game, false)
}
logs = append(logs, receiptLog) logs = append(logs, receiptLog)
kv = append(kv, action.saveGame(game)...) kv = append(kv, action.saveGame(game)...)
...@@ -781,6 +814,14 @@ func (action *Action) GameAbort(pbend *pkt.GuessGameAbort) (*types.Receipt, erro ...@@ -781,6 +814,14 @@ func (action *Action) GameAbort(pbend *pkt.GuessGameAbort) (*types.Receipt, erro
return nil, err return nil, err
} }
if game.Status == pkt.GuessGameStatusPublish || game.Status == pkt.GuessGameStatusAbort{
logger.Error("GameAbort", "addr", action.fromaddr, "execaddr", action.execaddr, "game status not allow abort",
game.Status)
return nil, err
}
preStatus := game.Status
//根据区块链高度或时间刷新游戏状态。 //根据区块链高度或时间刷新游戏状态。
action.RefreshStatusByTime(game) action.RefreshStatusByTime(game)
...@@ -805,16 +846,21 @@ func (action *Action) GameAbort(pbend *pkt.GuessGameAbort) (*types.Receipt, erro ...@@ -805,16 +846,21 @@ func (action *Action) GameAbort(pbend *pkt.GuessGameAbort) (*types.Receipt, erro
logs = append(logs, receipt.Logs...) logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...) kv = append(kv, receipt.KV...)
} }
game.Status = pkt.GuessGameStatusAbort
game.Index = action.getIndex(game)
receiptLog := action.GetReceiptLog(game) if game.Status != preStatus {
//说明action.RefreshStatusByTime(game)调用时已经更新过状态和index了,这里直接再改状态就行了。
game.Status = pkt.GuessGameStatusAbort
} else {
action.ChangeStatus(game, pkt.GuessGameStatusAbort)
}
receiptLog := action.GetReceiptLog(game, true)
logs = append(logs, receiptLog) logs = append(logs, receiptLog)
kv = append(kv, action.saveGame(game)...) kv = append(kv, action.saveGame(game)...)
return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil
} }
func getOptions(strOptions string) (options []string, legal bool){ func GetOptions(strOptions string) (options []string, legal bool){
legal = true legal = true
items := strings.Split(strOptions, ";") items := strings.Split(strOptions, ";")
for i := 0 ; i < len(items); i++ { for i := 0 ; i < len(items); i++ {
...@@ -832,7 +878,7 @@ func getOptions(strOptions string) (options []string, legal bool){ ...@@ -832,7 +878,7 @@ func getOptions(strOptions string) (options []string, legal bool){
return options, legal return options, legal
} }
func isLegalOption(options []string, option string) bool { func IsLegalOption(options []string, option string) bool {
for i := 0; i < len(options); i++ { for i := 0; i < len(options); i++ {
if options[i] == option { if options[i] == option {
return true return true
...@@ -842,15 +888,25 @@ func isLegalOption(options []string, option string) bool { ...@@ -842,15 +888,25 @@ func isLegalOption(options []string, option string) bool {
return false return false
} }
func (action *Action) ChangeStatus(game *pkt.GuessGame, destStatus uint32) {
if game.Status != destStatus {
game.PreStatus = game.Status
game.PreIndex = game.Index
game.Status = destStatus
game.Index = action.getIndex()
}
return
}
func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) (canBet bool) { func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) (canBet bool) {
// 检查区块高度是否超过最大下注高度限制,看是否可以下注 // 检查区块高度是否超过最大下注高度限制,看是否可以下注
if game.GetMaxHeight() <= action.height { if game.GetMaxHeight() <= action.height {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Height over limit", logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Height over limit",
action.height, "MaxHeight", game.GetMaxHeight()) action.height, "MaxHeight", game.GetMaxHeight())
if game.GetExpireHeight() > action.height { if game.GetExpireHeight() > action.height {
game.Status = pkt.GuessGameStatusStopBet action.ChangeStatus(game, pkt.GuessGameStatusStopBet)
} else { } else {
game.Status = pkt.GuessGameStatusTimeOut action.ChangeStatus(game, pkt.GuessGameStatusTimeOut)
} }
canBet = false canBet = false
...@@ -881,9 +937,9 @@ func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) (canBet bool) { ...@@ -881,9 +937,9 @@ func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) (canBet bool) {
game.GetMaxTime()) game.GetMaxTime())
if tNow.After(tExpire) { if tNow.After(tExpire) {
game.Status = pkt.GuessGameStatusTimeOut action.ChangeStatus(game, pkt.GuessGameStatusTimeOut)
} else { } else {
game.Status = pkt.GuessGameStatusStopBet action.ChangeStatus(game, pkt.GuessGameStatusStopBet)
} }
canBet = false canBet = false
...@@ -896,16 +952,13 @@ func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) (canBet bool) { ...@@ -896,16 +952,13 @@ func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) (canBet bool) {
} }
func (action *Action) CheckTime(start *pkt.GuessGameStart) bool { func (action *Action) CheckTime(start *pkt.GuessGameStart) bool {
MinBetTimeInterval = 2 //2h
MinBetTimeoutInterval = 24 //24h
if action.height + MinBetBlockNum > start.MaxHeight || start.MaxHeight + MinBetTimeoutNum > start.ExpireHeight { if action.height + MinBetBlockNum > start.MaxHeight || start.MaxHeight + MinBetTimeoutNum > start.ExpireHeight {
return false return false
} }
tNow := time.Now() tNow := time.Now()
d1, _ := time.ParseDuration(MinBetTimeInterval) d1, _ := time.ParseDuration(MinBetTimeInterval) //最短开奖时间
d2, _ := time.ParseDuration(MinBetTimeoutInterval) d2, _ := time.ParseDuration(MinBetTimeoutInterval) //最短游戏过期时间
if len(start.GetMaxTime()) == 0 { if len(start.GetMaxTime()) == 0 {
tNow.Add(d1) tNow.Add(d1)
start.MaxTime = tNow.Format("2006-01-02 15:04:05") start.MaxTime = tNow.Format("2006-01-02 15:04:05")
......
...@@ -21,15 +21,15 @@ message GuessGame { ...@@ -21,15 +21,15 @@ message GuessGame {
uint32 oneBet = 13; //一注等于多少bty或者token uint32 oneBet = 13; //一注等于多少bty或者token
uint32 maxBets = 14; //单次可以下多少注,默认100 uint32 maxBets = 14; //单次可以下多少注,默认100
uint32 maxBetsNumber = 15; //最多可以下多少注 uint32 maxBetsNumber = 15; //最多可以下多少注
uint32 fee = 16; //收取费用,不带则表示不收费 uint64 fee = 16; //收取费用,不带则表示不收费
string feeAddr = 17; //收费地址 string feeAddr = 17; //收费地址
string expire = 18; //游戏过期时间 string expire = 18; //游戏过期时间
int64 expireHeight = 19; //游戏过期区块高度 int64 expireHeight = 19; //游戏过期区块高度
string adminAddr = 20; //游戏创建者地址,只有该地址可以开奖 string adminAddr = 20; //游戏创建者地址,只有该地址可以开奖
uint32 betsNumber = 21; //已下注数,如果数量达到maxBetsNumber,则不允许再下注 uint32 betsNumber = 21; //已下注数,如果数量达到maxBetsNumber,则不允许再下注
repeated GuessPlayer plays = 22; //参与游戏下注的玩家投注信息 repeated GuessPlayer plays = 22; //参与游戏下注的玩家投注信息
string result = 23; string result = 23; //公布的中奖结果
repeated GuessBet bets = 24; GuessBetStat betStat = 24;
int64 index = 25; int64 index = 25;
int64 preIndex = 26; int64 preIndex = 26;
} }
...@@ -48,7 +48,17 @@ message GuessBet { ...@@ -48,7 +48,17 @@ message GuessBet {
int64 preIndex = 6; int64 preIndex = 6;
} }
message GuessBetStat {
uint32 totalBetTimes = 1;
uint32 totalBetsNumber = 2;
repeated GuessBetStatItem items = 3;
}
message GuessBetStatItem {
string option = 1;
uint32 betsNumber = 2;
uint32 betsTimes = 3;
}
//斗牛游戏内容 //斗牛游戏内容
message PokerBull { message PokerBull {
...@@ -264,12 +274,16 @@ message ReceiptPBGame { ...@@ -264,12 +274,16 @@ message ReceiptPBGame {
message ReceiptGuessGame { message ReceiptGuessGame {
string gameId = 1; string gameId = 1;
uint32 status = 2; uint32 preStatus = 2;
string addr = 3; uint32 status = 3;
int64 index = 4; string addr = 4;
string adminAddr = 5;
int64 preIndex = 6;
int64 index = 7;
string category = 8;
bool statusChange = 9;
} }
message GuessStartTxReq { message GuessStartTxReq {
string topic = 1; string topic = 1;
string options = 2; string options = 2;
......
...@@ -40,7 +40,7 @@ type GuessGame struct { ...@@ -40,7 +40,7 @@ type GuessGame struct {
OneBet uint32 `protobuf:"varint,13,opt,name=oneBet,proto3" json:"oneBet,omitempty"` OneBet uint32 `protobuf:"varint,13,opt,name=oneBet,proto3" json:"oneBet,omitempty"`
MaxBets uint32 `protobuf:"varint,14,opt,name=maxBets,proto3" json:"maxBets,omitempty"` MaxBets uint32 `protobuf:"varint,14,opt,name=maxBets,proto3" json:"maxBets,omitempty"`
MaxBetsNumber uint32 `protobuf:"varint,15,opt,name=maxBetsNumber,proto3" json:"maxBetsNumber,omitempty"` MaxBetsNumber uint32 `protobuf:"varint,15,opt,name=maxBetsNumber,proto3" json:"maxBetsNumber,omitempty"`
Fee uint32 `protobuf:"varint,16,opt,name=fee,proto3" json:"fee,omitempty"` Fee uint64 `protobuf:"varint,16,opt,name=fee,proto3" json:"fee,omitempty"`
FeeAddr string `protobuf:"bytes,17,opt,name=feeAddr,proto3" json:"feeAddr,omitempty"` FeeAddr string `protobuf:"bytes,17,opt,name=feeAddr,proto3" json:"feeAddr,omitempty"`
Expire string `protobuf:"bytes,18,opt,name=expire,proto3" json:"expire,omitempty"` Expire string `protobuf:"bytes,18,opt,name=expire,proto3" json:"expire,omitempty"`
ExpireHeight int64 `protobuf:"varint,19,opt,name=expireHeight,proto3" json:"expireHeight,omitempty"` ExpireHeight int64 `protobuf:"varint,19,opt,name=expireHeight,proto3" json:"expireHeight,omitempty"`
...@@ -48,7 +48,7 @@ type GuessGame struct { ...@@ -48,7 +48,7 @@ type GuessGame struct {
BetsNumber uint32 `protobuf:"varint,21,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"` BetsNumber uint32 `protobuf:"varint,21,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"`
Plays []*GuessPlayer `protobuf:"bytes,22,rep,name=plays,proto3" json:"plays,omitempty"` Plays []*GuessPlayer `protobuf:"bytes,22,rep,name=plays,proto3" json:"plays,omitempty"`
Result string `protobuf:"bytes,23,opt,name=result,proto3" json:"result,omitempty"` Result string `protobuf:"bytes,23,opt,name=result,proto3" json:"result,omitempty"`
Bets []*GuessBet `protobuf:"bytes,24,rep,name=bets,proto3" json:"bets,omitempty"` BetStat *GuessBetStat `protobuf:"bytes,24,opt,name=betStat,proto3" json:"betStat,omitempty"`
Index int64 `protobuf:"varint,25,opt,name=index,proto3" json:"index,omitempty"` Index int64 `protobuf:"varint,25,opt,name=index,proto3" json:"index,omitempty"`
PreIndex int64 `protobuf:"varint,26,opt,name=preIndex,proto3" json:"preIndex,omitempty"` PreIndex int64 `protobuf:"varint,26,opt,name=preIndex,proto3" json:"preIndex,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
...@@ -186,7 +186,7 @@ func (m *GuessGame) GetMaxBetsNumber() uint32 { ...@@ -186,7 +186,7 @@ func (m *GuessGame) GetMaxBetsNumber() uint32 {
return 0 return 0
} }
func (m *GuessGame) GetFee() uint32 { func (m *GuessGame) GetFee() uint64 {
if m != nil { if m != nil {
return m.Fee return m.Fee
} }
...@@ -242,9 +242,9 @@ func (m *GuessGame) GetResult() string { ...@@ -242,9 +242,9 @@ func (m *GuessGame) GetResult() string {
return "" return ""
} }
func (m *GuessGame) GetBets() []*GuessBet { func (m *GuessGame) GetBetStat() *GuessBetStat {
if m != nil { if m != nil {
return m.Bets return m.BetStat
} }
return nil return nil
} }
...@@ -389,6 +389,116 @@ func (m *GuessBet) GetPreIndex() int64 { ...@@ -389,6 +389,116 @@ func (m *GuessBet) GetPreIndex() int64 {
return 0 return 0
} }
type GuessBetStat struct {
TotalBetTimes uint32 `protobuf:"varint,1,opt,name=totalBetTimes,proto3" json:"totalBetTimes,omitempty"`
TotalBetsNumber uint32 `protobuf:"varint,2,opt,name=totalBetsNumber,proto3" json:"totalBetsNumber,omitempty"`
Items []*GuessBetStatItem `protobuf:"bytes,3,rep,name=items,proto3" json:"items,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GuessBetStat) Reset() { *m = GuessBetStat{} }
func (m *GuessBetStat) String() string { return proto.CompactTextString(m) }
func (*GuessBetStat) ProtoMessage() {}
func (*GuessBetStat) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{3}
}
func (m *GuessBetStat) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GuessBetStat.Unmarshal(m, b)
}
func (m *GuessBetStat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GuessBetStat.Marshal(b, m, deterministic)
}
func (m *GuessBetStat) XXX_Merge(src proto.Message) {
xxx_messageInfo_GuessBetStat.Merge(m, src)
}
func (m *GuessBetStat) XXX_Size() int {
return xxx_messageInfo_GuessBetStat.Size(m)
}
func (m *GuessBetStat) XXX_DiscardUnknown() {
xxx_messageInfo_GuessBetStat.DiscardUnknown(m)
}
var xxx_messageInfo_GuessBetStat proto.InternalMessageInfo
func (m *GuessBetStat) GetTotalBetTimes() uint32 {
if m != nil {
return m.TotalBetTimes
}
return 0
}
func (m *GuessBetStat) GetTotalBetsNumber() uint32 {
if m != nil {
return m.TotalBetsNumber
}
return 0
}
func (m *GuessBetStat) GetItems() []*GuessBetStatItem {
if m != nil {
return m.Items
}
return nil
}
type GuessBetStatItem struct {
Option string `protobuf:"bytes,1,opt,name=option,proto3" json:"option,omitempty"`
BetsNumber uint32 `protobuf:"varint,2,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"`
BetsTimes uint32 `protobuf:"varint,3,opt,name=betsTimes,proto3" json:"betsTimes,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GuessBetStatItem) Reset() { *m = GuessBetStatItem{} }
func (m *GuessBetStatItem) String() string { return proto.CompactTextString(m) }
func (*GuessBetStatItem) ProtoMessage() {}
func (*GuessBetStatItem) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{4}
}
func (m *GuessBetStatItem) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GuessBetStatItem.Unmarshal(m, b)
}
func (m *GuessBetStatItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GuessBetStatItem.Marshal(b, m, deterministic)
}
func (m *GuessBetStatItem) XXX_Merge(src proto.Message) {
xxx_messageInfo_GuessBetStatItem.Merge(m, src)
}
func (m *GuessBetStatItem) XXX_Size() int {
return xxx_messageInfo_GuessBetStatItem.Size(m)
}
func (m *GuessBetStatItem) XXX_DiscardUnknown() {
xxx_messageInfo_GuessBetStatItem.DiscardUnknown(m)
}
var xxx_messageInfo_GuessBetStatItem proto.InternalMessageInfo
func (m *GuessBetStatItem) GetOption() string {
if m != nil {
return m.Option
}
return ""
}
func (m *GuessBetStatItem) GetBetsNumber() uint32 {
if m != nil {
return m.BetsNumber
}
return 0
}
func (m *GuessBetStatItem) GetBetsTimes() uint32 {
if m != nil {
return m.BetsTimes
}
return 0
}
//斗牛游戏内容 //斗牛游戏内容
type PokerBull struct { type PokerBull struct {
GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"` GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"`
...@@ -416,7 +526,7 @@ func (m *PokerBull) Reset() { *m = PokerBull{} } ...@@ -416,7 +526,7 @@ func (m *PokerBull) Reset() { *m = PokerBull{} }
func (m *PokerBull) String() string { return proto.CompactTextString(m) } func (m *PokerBull) String() string { return proto.CompactTextString(m) }
func (*PokerBull) ProtoMessage() {} func (*PokerBull) ProtoMessage() {}
func (*PokerBull) Descriptor() ([]byte, []int) { func (*PokerBull) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{3} return fileDescriptor_7574406c5d3430e8, []int{5}
} }
func (m *PokerBull) XXX_Unmarshal(b []byte) error { func (m *PokerBull) XXX_Unmarshal(b []byte) error {
...@@ -565,7 +675,7 @@ func (m *PBHand) Reset() { *m = PBHand{} } ...@@ -565,7 +675,7 @@ func (m *PBHand) Reset() { *m = PBHand{} }
func (m *PBHand) String() string { return proto.CompactTextString(m) } func (m *PBHand) String() string { return proto.CompactTextString(m) }
func (*PBHand) ProtoMessage() {} func (*PBHand) ProtoMessage() {}
func (*PBHand) Descriptor() ([]byte, []int) { func (*PBHand) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{4} return fileDescriptor_7574406c5d3430e8, []int{6}
} }
func (m *PBHand) XXX_Unmarshal(b []byte) error { func (m *PBHand) XXX_Unmarshal(b []byte) error {
...@@ -636,7 +746,7 @@ func (m *PBPlayer) Reset() { *m = PBPlayer{} } ...@@ -636,7 +746,7 @@ func (m *PBPlayer) Reset() { *m = PBPlayer{} }
func (m *PBPlayer) String() string { return proto.CompactTextString(m) } func (m *PBPlayer) String() string { return proto.CompactTextString(m) }
func (*PBPlayer) ProtoMessage() {} func (*PBPlayer) ProtoMessage() {}
func (*PBPlayer) Descriptor() ([]byte, []int) { func (*PBPlayer) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{5} return fileDescriptor_7574406c5d3430e8, []int{7}
} }
func (m *PBPlayer) XXX_Unmarshal(b []byte) error { func (m *PBPlayer) XXX_Unmarshal(b []byte) error {
...@@ -701,7 +811,7 @@ func (m *PBResult) Reset() { *m = PBResult{} } ...@@ -701,7 +811,7 @@ func (m *PBResult) Reset() { *m = PBResult{} }
func (m *PBResult) String() string { return proto.CompactTextString(m) } func (m *PBResult) String() string { return proto.CompactTextString(m) }
func (*PBResult) ProtoMessage() {} func (*PBResult) ProtoMessage() {}
func (*PBResult) Descriptor() ([]byte, []int) { func (*PBResult) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{6} return fileDescriptor_7574406c5d3430e8, []int{8}
} }
func (m *PBResult) XXX_Unmarshal(b []byte) error { func (m *PBResult) XXX_Unmarshal(b []byte) error {
...@@ -770,7 +880,7 @@ func (m *PBPoker) Reset() { *m = PBPoker{} } ...@@ -770,7 +880,7 @@ func (m *PBPoker) Reset() { *m = PBPoker{} }
func (m *PBPoker) String() string { return proto.CompactTextString(m) } func (m *PBPoker) String() string { return proto.CompactTextString(m) }
func (*PBPoker) ProtoMessage() {} func (*PBPoker) ProtoMessage() {}
func (*PBPoker) Descriptor() ([]byte, []int) { func (*PBPoker) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{7} return fileDescriptor_7574406c5d3430e8, []int{9}
} }
func (m *PBPoker) XXX_Unmarshal(b []byte) error { func (m *PBPoker) XXX_Unmarshal(b []byte) error {
...@@ -823,7 +933,7 @@ func (m *PBGameAction) Reset() { *m = PBGameAction{} } ...@@ -823,7 +933,7 @@ func (m *PBGameAction) Reset() { *m = PBGameAction{} }
func (m *PBGameAction) String() string { return proto.CompactTextString(m) } func (m *PBGameAction) String() string { return proto.CompactTextString(m) }
func (*PBGameAction) ProtoMessage() {} func (*PBGameAction) ProtoMessage() {}
func (*PBGameAction) Descriptor() ([]byte, []int) { func (*PBGameAction) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{8} return fileDescriptor_7574406c5d3430e8, []int{10}
} }
func (m *PBGameAction) XXX_Unmarshal(b []byte) error { func (m *PBGameAction) XXX_Unmarshal(b []byte) error {
...@@ -1039,7 +1149,7 @@ func (m *PBGameStart) Reset() { *m = PBGameStart{} } ...@@ -1039,7 +1149,7 @@ func (m *PBGameStart) Reset() { *m = PBGameStart{} }
func (m *PBGameStart) String() string { return proto.CompactTextString(m) } func (m *PBGameStart) String() string { return proto.CompactTextString(m) }
func (*PBGameStart) ProtoMessage() {} func (*PBGameStart) ProtoMessage() {}
func (*PBGameStart) Descriptor() ([]byte, []int) { func (*PBGameStart) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{9} return fileDescriptor_7574406c5d3430e8, []int{11}
} }
func (m *PBGameStart) XXX_Unmarshal(b []byte) error { func (m *PBGameStart) XXX_Unmarshal(b []byte) error {
...@@ -1086,7 +1196,7 @@ func (m *PBGameContinue) Reset() { *m = PBGameContinue{} } ...@@ -1086,7 +1196,7 @@ func (m *PBGameContinue) Reset() { *m = PBGameContinue{} }
func (m *PBGameContinue) String() string { return proto.CompactTextString(m) } func (m *PBGameContinue) String() string { return proto.CompactTextString(m) }
func (*PBGameContinue) ProtoMessage() {} func (*PBGameContinue) ProtoMessage() {}
func (*PBGameContinue) Descriptor() ([]byte, []int) { func (*PBGameContinue) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{10} return fileDescriptor_7574406c5d3430e8, []int{12}
} }
func (m *PBGameContinue) XXX_Unmarshal(b []byte) error { func (m *PBGameContinue) XXX_Unmarshal(b []byte) error {
...@@ -1126,7 +1236,7 @@ func (m *PBGameQuit) Reset() { *m = PBGameQuit{} } ...@@ -1126,7 +1236,7 @@ func (m *PBGameQuit) Reset() { *m = PBGameQuit{} }
func (m *PBGameQuit) String() string { return proto.CompactTextString(m) } func (m *PBGameQuit) String() string { return proto.CompactTextString(m) }
func (*PBGameQuit) ProtoMessage() {} func (*PBGameQuit) ProtoMessage() {}
func (*PBGameQuit) Descriptor() ([]byte, []int) { func (*PBGameQuit) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{11} return fileDescriptor_7574406c5d3430e8, []int{13}
} }
func (m *PBGameQuit) XXX_Unmarshal(b []byte) error { func (m *PBGameQuit) XXX_Unmarshal(b []byte) error {
...@@ -1166,7 +1276,7 @@ func (m *PBGameQuery) Reset() { *m = PBGameQuery{} } ...@@ -1166,7 +1276,7 @@ func (m *PBGameQuery) Reset() { *m = PBGameQuery{} }
func (m *PBGameQuery) String() string { return proto.CompactTextString(m) } func (m *PBGameQuery) String() string { return proto.CompactTextString(m) }
func (*PBGameQuery) ProtoMessage() {} func (*PBGameQuery) ProtoMessage() {}
func (*PBGameQuery) Descriptor() ([]byte, []int) { func (*PBGameQuery) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{12} return fileDescriptor_7574406c5d3430e8, []int{14}
} }
func (m *PBGameQuery) XXX_Unmarshal(b []byte) error { func (m *PBGameQuery) XXX_Unmarshal(b []byte) error {
...@@ -1213,7 +1323,7 @@ func (m *GuessGameAction) Reset() { *m = GuessGameAction{} } ...@@ -1213,7 +1323,7 @@ func (m *GuessGameAction) Reset() { *m = GuessGameAction{} }
func (m *GuessGameAction) String() string { return proto.CompactTextString(m) } func (m *GuessGameAction) String() string { return proto.CompactTextString(m) }
func (*GuessGameAction) ProtoMessage() {} func (*GuessGameAction) ProtoMessage() {}
func (*GuessGameAction) Descriptor() ([]byte, []int) { func (*GuessGameAction) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{13} return fileDescriptor_7574406c5d3430e8, []int{15}
} }
func (m *GuessGameAction) XXX_Unmarshal(b []byte) error { func (m *GuessGameAction) XXX_Unmarshal(b []byte) error {
...@@ -1473,7 +1583,7 @@ func (m *GuessGameStart) Reset() { *m = GuessGameStart{} } ...@@ -1473,7 +1583,7 @@ func (m *GuessGameStart) Reset() { *m = GuessGameStart{} }
func (m *GuessGameStart) String() string { return proto.CompactTextString(m) } func (m *GuessGameStart) String() string { return proto.CompactTextString(m) }
func (*GuessGameStart) ProtoMessage() {} func (*GuessGameStart) ProtoMessage() {}
func (*GuessGameStart) Descriptor() ([]byte, []int) { func (*GuessGameStart) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{14} return fileDescriptor_7574406c5d3430e8, []int{16}
} }
func (m *GuessGameStart) XXX_Unmarshal(b []byte) error { func (m *GuessGameStart) XXX_Unmarshal(b []byte) error {
...@@ -1606,7 +1716,7 @@ func (m *GuessGameBet) Reset() { *m = GuessGameBet{} } ...@@ -1606,7 +1716,7 @@ func (m *GuessGameBet) Reset() { *m = GuessGameBet{} }
func (m *GuessGameBet) String() string { return proto.CompactTextString(m) } func (m *GuessGameBet) String() string { return proto.CompactTextString(m) }
func (*GuessGameBet) ProtoMessage() {} func (*GuessGameBet) ProtoMessage() {}
func (*GuessGameBet) Descriptor() ([]byte, []int) { func (*GuessGameBet) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{15} return fileDescriptor_7574406c5d3430e8, []int{17}
} }
func (m *GuessGameBet) XXX_Unmarshal(b []byte) error { func (m *GuessGameBet) XXX_Unmarshal(b []byte) error {
...@@ -1660,7 +1770,7 @@ func (m *GuessGameAbort) Reset() { *m = GuessGameAbort{} } ...@@ -1660,7 +1770,7 @@ func (m *GuessGameAbort) Reset() { *m = GuessGameAbort{} }
func (m *GuessGameAbort) String() string { return proto.CompactTextString(m) } func (m *GuessGameAbort) String() string { return proto.CompactTextString(m) }
func (*GuessGameAbort) ProtoMessage() {} func (*GuessGameAbort) ProtoMessage() {}
func (*GuessGameAbort) Descriptor() ([]byte, []int) { func (*GuessGameAbort) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{16} return fileDescriptor_7574406c5d3430e8, []int{18}
} }
func (m *GuessGameAbort) XXX_Unmarshal(b []byte) error { func (m *GuessGameAbort) XXX_Unmarshal(b []byte) error {
...@@ -1701,7 +1811,7 @@ func (m *GuessGamePublish) Reset() { *m = GuessGamePublish{} } ...@@ -1701,7 +1811,7 @@ func (m *GuessGamePublish) Reset() { *m = GuessGamePublish{} }
func (m *GuessGamePublish) String() string { return proto.CompactTextString(m) } func (m *GuessGamePublish) String() string { return proto.CompactTextString(m) }
func (*GuessGamePublish) ProtoMessage() {} func (*GuessGamePublish) ProtoMessage() {}
func (*GuessGamePublish) Descriptor() ([]byte, []int) { func (*GuessGamePublish) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{17} return fileDescriptor_7574406c5d3430e8, []int{19}
} }
func (m *GuessGamePublish) XXX_Unmarshal(b []byte) error { func (m *GuessGamePublish) XXX_Unmarshal(b []byte) error {
...@@ -1749,7 +1859,7 @@ func (m *GuessGameQuery) Reset() { *m = GuessGameQuery{} } ...@@ -1749,7 +1859,7 @@ func (m *GuessGameQuery) Reset() { *m = GuessGameQuery{} }
func (m *GuessGameQuery) String() string { return proto.CompactTextString(m) } func (m *GuessGameQuery) String() string { return proto.CompactTextString(m) }
func (*GuessGameQuery) ProtoMessage() {} func (*GuessGameQuery) ProtoMessage() {}
func (*GuessGameQuery) Descriptor() ([]byte, []int) { func (*GuessGameQuery) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{18} return fileDescriptor_7574406c5d3430e8, []int{20}
} }
func (m *GuessGameQuery) XXX_Unmarshal(b []byte) error { func (m *GuessGameQuery) XXX_Unmarshal(b []byte) error {
...@@ -1798,7 +1908,7 @@ func (m *QueryPBGameListByStatusAndPlayerNum) Reset() { *m = QueryPBGame ...@@ -1798,7 +1908,7 @@ func (m *QueryPBGameListByStatusAndPlayerNum) Reset() { *m = QueryPBGame
func (m *QueryPBGameListByStatusAndPlayerNum) String() string { return proto.CompactTextString(m) } func (m *QueryPBGameListByStatusAndPlayerNum) String() string { return proto.CompactTextString(m) }
func (*QueryPBGameListByStatusAndPlayerNum) ProtoMessage() {} func (*QueryPBGameListByStatusAndPlayerNum) ProtoMessage() {}
func (*QueryPBGameListByStatusAndPlayerNum) Descriptor() ([]byte, []int) { func (*QueryPBGameListByStatusAndPlayerNum) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{19} return fileDescriptor_7574406c5d3430e8, []int{21}
} }
func (m *QueryPBGameListByStatusAndPlayerNum) XXX_Unmarshal(b []byte) error { func (m *QueryPBGameListByStatusAndPlayerNum) XXX_Unmarshal(b []byte) error {
...@@ -1854,7 +1964,7 @@ func (m *PBGameRecord) Reset() { *m = PBGameRecord{} } ...@@ -1854,7 +1964,7 @@ func (m *PBGameRecord) Reset() { *m = PBGameRecord{} }
func (m *PBGameRecord) String() string { return proto.CompactTextString(m) } func (m *PBGameRecord) String() string { return proto.CompactTextString(m) }
func (*PBGameRecord) ProtoMessage() {} func (*PBGameRecord) ProtoMessage() {}
func (*PBGameRecord) Descriptor() ([]byte, []int) { func (*PBGameRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{20} return fileDescriptor_7574406c5d3430e8, []int{22}
} }
func (m *PBGameRecord) XXX_Unmarshal(b []byte) error { func (m *PBGameRecord) XXX_Unmarshal(b []byte) error {
...@@ -1908,7 +2018,7 @@ func (m *PBGameIndexRecord) Reset() { *m = PBGameIndexRecord{} } ...@@ -1908,7 +2018,7 @@ func (m *PBGameIndexRecord) Reset() { *m = PBGameIndexRecord{} }
func (m *PBGameIndexRecord) String() string { return proto.CompactTextString(m) } func (m *PBGameIndexRecord) String() string { return proto.CompactTextString(m) }
func (*PBGameIndexRecord) ProtoMessage() {} func (*PBGameIndexRecord) ProtoMessage() {}
func (*PBGameIndexRecord) Descriptor() ([]byte, []int) { func (*PBGameIndexRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{21} return fileDescriptor_7574406c5d3430e8, []int{23}
} }
func (m *PBGameIndexRecord) XXX_Unmarshal(b []byte) error { func (m *PBGameIndexRecord) XXX_Unmarshal(b []byte) error {
...@@ -1954,7 +2064,7 @@ func (m *PBGameRecords) Reset() { *m = PBGameRecords{} } ...@@ -1954,7 +2064,7 @@ func (m *PBGameRecords) Reset() { *m = PBGameRecords{} }
func (m *PBGameRecords) String() string { return proto.CompactTextString(m) } func (m *PBGameRecords) String() string { return proto.CompactTextString(m) }
func (*PBGameRecords) ProtoMessage() {} func (*PBGameRecords) ProtoMessage() {}
func (*PBGameRecords) Descriptor() ([]byte, []int) { func (*PBGameRecords) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{22} return fileDescriptor_7574406c5d3430e8, []int{24}
} }
func (m *PBGameRecords) XXX_Unmarshal(b []byte) error { func (m *PBGameRecords) XXX_Unmarshal(b []byte) error {
...@@ -1996,7 +2106,7 @@ func (m *QueryPBGameInfo) Reset() { *m = QueryPBGameInfo{} } ...@@ -1996,7 +2106,7 @@ func (m *QueryPBGameInfo) Reset() { *m = QueryPBGameInfo{} }
func (m *QueryPBGameInfo) String() string { return proto.CompactTextString(m) } func (m *QueryPBGameInfo) String() string { return proto.CompactTextString(m) }
func (*QueryPBGameInfo) ProtoMessage() {} func (*QueryPBGameInfo) ProtoMessage() {}
func (*QueryPBGameInfo) Descriptor() ([]byte, []int) { func (*QueryPBGameInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{23} return fileDescriptor_7574406c5d3430e8, []int{25}
} }
func (m *QueryPBGameInfo) XXX_Unmarshal(b []byte) error { func (m *QueryPBGameInfo) XXX_Unmarshal(b []byte) error {
...@@ -2056,7 +2166,7 @@ func (m *ReplyPBGame) Reset() { *m = ReplyPBGame{} } ...@@ -2056,7 +2166,7 @@ func (m *ReplyPBGame) Reset() { *m = ReplyPBGame{} }
func (m *ReplyPBGame) String() string { return proto.CompactTextString(m) } func (m *ReplyPBGame) String() string { return proto.CompactTextString(m) }
func (*ReplyPBGame) ProtoMessage() {} func (*ReplyPBGame) ProtoMessage() {}
func (*ReplyPBGame) Descriptor() ([]byte, []int) { func (*ReplyPBGame) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{24} return fileDescriptor_7574406c5d3430e8, []int{26}
} }
func (m *ReplyPBGame) XXX_Unmarshal(b []byte) error { func (m *ReplyPBGame) XXX_Unmarshal(b []byte) error {
...@@ -2095,7 +2205,7 @@ func (m *QueryPBGameInfos) Reset() { *m = QueryPBGameInfos{} } ...@@ -2095,7 +2205,7 @@ func (m *QueryPBGameInfos) Reset() { *m = QueryPBGameInfos{} }
func (m *QueryPBGameInfos) String() string { return proto.CompactTextString(m) } func (m *QueryPBGameInfos) String() string { return proto.CompactTextString(m) }
func (*QueryPBGameInfos) ProtoMessage() {} func (*QueryPBGameInfos) ProtoMessage() {}
func (*QueryPBGameInfos) Descriptor() ([]byte, []int) { func (*QueryPBGameInfos) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{25} return fileDescriptor_7574406c5d3430e8, []int{27}
} }
func (m *QueryPBGameInfos) XXX_Unmarshal(b []byte) error { func (m *QueryPBGameInfos) XXX_Unmarshal(b []byte) error {
...@@ -2134,7 +2244,7 @@ func (m *ReplyPBGameList) Reset() { *m = ReplyPBGameList{} } ...@@ -2134,7 +2244,7 @@ func (m *ReplyPBGameList) Reset() { *m = ReplyPBGameList{} }
func (m *ReplyPBGameList) String() string { return proto.CompactTextString(m) } func (m *ReplyPBGameList) String() string { return proto.CompactTextString(m) }
func (*ReplyPBGameList) ProtoMessage() {} func (*ReplyPBGameList) ProtoMessage() {}
func (*ReplyPBGameList) Descriptor() ([]byte, []int) { func (*ReplyPBGameList) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{26} return fileDescriptor_7574406c5d3430e8, []int{28}
} }
func (m *ReplyPBGameList) XXX_Unmarshal(b []byte) error { func (m *ReplyPBGameList) XXX_Unmarshal(b []byte) error {
...@@ -2176,7 +2286,7 @@ func (m *QueryGuessGameInfo) Reset() { *m = QueryGuessGameInfo{} } ...@@ -2176,7 +2286,7 @@ func (m *QueryGuessGameInfo) Reset() { *m = QueryGuessGameInfo{} }
func (m *QueryGuessGameInfo) String() string { return proto.CompactTextString(m) } func (m *QueryGuessGameInfo) String() string { return proto.CompactTextString(m) }
func (*QueryGuessGameInfo) ProtoMessage() {} func (*QueryGuessGameInfo) ProtoMessage() {}
func (*QueryGuessGameInfo) Descriptor() ([]byte, []int) { func (*QueryGuessGameInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{27} return fileDescriptor_7574406c5d3430e8, []int{29}
} }
func (m *QueryGuessGameInfo) XXX_Unmarshal(b []byte) error { func (m *QueryGuessGameInfo) XXX_Unmarshal(b []byte) error {
...@@ -2236,7 +2346,7 @@ func (m *ReplyGuessGameInfo) Reset() { *m = ReplyGuessGameInfo{} } ...@@ -2236,7 +2346,7 @@ func (m *ReplyGuessGameInfo) Reset() { *m = ReplyGuessGameInfo{} }
func (m *ReplyGuessGameInfo) String() string { return proto.CompactTextString(m) } func (m *ReplyGuessGameInfo) String() string { return proto.CompactTextString(m) }
func (*ReplyGuessGameInfo) ProtoMessage() {} func (*ReplyGuessGameInfo) ProtoMessage() {}
func (*ReplyGuessGameInfo) Descriptor() ([]byte, []int) { func (*ReplyGuessGameInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{28} return fileDescriptor_7574406c5d3430e8, []int{30}
} }
func (m *ReplyGuessGameInfo) XXX_Unmarshal(b []byte) error { func (m *ReplyGuessGameInfo) XXX_Unmarshal(b []byte) error {
...@@ -2275,7 +2385,7 @@ func (m *QueryGuessGameInfos) Reset() { *m = QueryGuessGameInfos{} } ...@@ -2275,7 +2385,7 @@ func (m *QueryGuessGameInfos) Reset() { *m = QueryGuessGameInfos{} }
func (m *QueryGuessGameInfos) String() string { return proto.CompactTextString(m) } func (m *QueryGuessGameInfos) String() string { return proto.CompactTextString(m) }
func (*QueryGuessGameInfos) ProtoMessage() {} func (*QueryGuessGameInfos) ProtoMessage() {}
func (*QueryGuessGameInfos) Descriptor() ([]byte, []int) { func (*QueryGuessGameInfos) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{29} return fileDescriptor_7574406c5d3430e8, []int{31}
} }
func (m *QueryGuessGameInfos) XXX_Unmarshal(b []byte) error { func (m *QueryGuessGameInfos) XXX_Unmarshal(b []byte) error {
...@@ -2314,7 +2424,7 @@ func (m *ReplyGuessGameInfos) Reset() { *m = ReplyGuessGameInfos{} } ...@@ -2314,7 +2424,7 @@ func (m *ReplyGuessGameInfos) Reset() { *m = ReplyGuessGameInfos{} }
func (m *ReplyGuessGameInfos) String() string { return proto.CompactTextString(m) } func (m *ReplyGuessGameInfos) String() string { return proto.CompactTextString(m) }
func (*ReplyGuessGameInfos) ProtoMessage() {} func (*ReplyGuessGameInfos) ProtoMessage() {}
func (*ReplyGuessGameInfos) Descriptor() ([]byte, []int) { func (*ReplyGuessGameInfos) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{30} return fileDescriptor_7574406c5d3430e8, []int{32}
} }
func (m *ReplyGuessGameInfos) XXX_Unmarshal(b []byte) error { func (m *ReplyGuessGameInfos) XXX_Unmarshal(b []byte) error {
...@@ -2362,7 +2472,7 @@ func (m *ReceiptPBGame) Reset() { *m = ReceiptPBGame{} } ...@@ -2362,7 +2472,7 @@ func (m *ReceiptPBGame) Reset() { *m = ReceiptPBGame{} }
func (m *ReceiptPBGame) String() string { return proto.CompactTextString(m) } func (m *ReceiptPBGame) String() string { return proto.CompactTextString(m) }
func (*ReceiptPBGame) ProtoMessage() {} func (*ReceiptPBGame) ProtoMessage() {}
func (*ReceiptPBGame) Descriptor() ([]byte, []int) { func (*ReceiptPBGame) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{31} return fileDescriptor_7574406c5d3430e8, []int{33}
} }
func (m *ReceiptPBGame) XXX_Unmarshal(b []byte) error { func (m *ReceiptPBGame) XXX_Unmarshal(b []byte) error {
...@@ -2455,9 +2565,14 @@ func (m *ReceiptPBGame) GetPreStatus() int32 { ...@@ -2455,9 +2565,14 @@ func (m *ReceiptPBGame) GetPreStatus() int32 {
type ReceiptGuessGame struct { type ReceiptGuessGame struct {
GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"` GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"`
Status uint32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"` PreStatus uint32 `protobuf:"varint,2,opt,name=preStatus,proto3" json:"preStatus,omitempty"`
Addr string `protobuf:"bytes,3,opt,name=addr,proto3" json:"addr,omitempty"` Status uint32 `protobuf:"varint,3,opt,name=status,proto3" json:"status,omitempty"`
Index int64 `protobuf:"varint,4,opt,name=index,proto3" json:"index,omitempty"` Addr string `protobuf:"bytes,4,opt,name=addr,proto3" json:"addr,omitempty"`
AdminAddr string `protobuf:"bytes,5,opt,name=adminAddr,proto3" json:"adminAddr,omitempty"`
PreIndex int64 `protobuf:"varint,6,opt,name=preIndex,proto3" json:"preIndex,omitempty"`
Index int64 `protobuf:"varint,7,opt,name=index,proto3" json:"index,omitempty"`
Category string `protobuf:"bytes,8,opt,name=category,proto3" json:"category,omitempty"`
StatusChange bool `protobuf:"varint,9,opt,name=statusChange,proto3" json:"statusChange,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
...@@ -2467,7 +2582,7 @@ func (m *ReceiptGuessGame) Reset() { *m = ReceiptGuessGame{} } ...@@ -2467,7 +2582,7 @@ func (m *ReceiptGuessGame) Reset() { *m = ReceiptGuessGame{} }
func (m *ReceiptGuessGame) String() string { return proto.CompactTextString(m) } func (m *ReceiptGuessGame) String() string { return proto.CompactTextString(m) }
func (*ReceiptGuessGame) ProtoMessage() {} func (*ReceiptGuessGame) ProtoMessage() {}
func (*ReceiptGuessGame) Descriptor() ([]byte, []int) { func (*ReceiptGuessGame) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{32} return fileDescriptor_7574406c5d3430e8, []int{34}
} }
func (m *ReceiptGuessGame) XXX_Unmarshal(b []byte) error { func (m *ReceiptGuessGame) XXX_Unmarshal(b []byte) error {
...@@ -2495,6 +2610,13 @@ func (m *ReceiptGuessGame) GetGameId() string { ...@@ -2495,6 +2610,13 @@ func (m *ReceiptGuessGame) GetGameId() string {
return "" return ""
} }
func (m *ReceiptGuessGame) GetPreStatus() uint32 {
if m != nil {
return m.PreStatus
}
return 0
}
func (m *ReceiptGuessGame) GetStatus() uint32 { func (m *ReceiptGuessGame) GetStatus() uint32 {
if m != nil { if m != nil {
return m.Status return m.Status
...@@ -2509,6 +2631,20 @@ func (m *ReceiptGuessGame) GetAddr() string { ...@@ -2509,6 +2631,20 @@ func (m *ReceiptGuessGame) GetAddr() string {
return "" return ""
} }
func (m *ReceiptGuessGame) GetAdminAddr() string {
if m != nil {
return m.AdminAddr
}
return ""
}
func (m *ReceiptGuessGame) GetPreIndex() int64 {
if m != nil {
return m.PreIndex
}
return 0
}
func (m *ReceiptGuessGame) GetIndex() int64 { func (m *ReceiptGuessGame) GetIndex() int64 {
if m != nil { if m != nil {
return m.Index return m.Index
...@@ -2516,6 +2652,20 @@ func (m *ReceiptGuessGame) GetIndex() int64 { ...@@ -2516,6 +2652,20 @@ func (m *ReceiptGuessGame) GetIndex() int64 {
return 0 return 0
} }
func (m *ReceiptGuessGame) GetCategory() string {
if m != nil {
return m.Category
}
return ""
}
func (m *ReceiptGuessGame) GetStatusChange() bool {
if m != nil {
return m.StatusChange
}
return false
}
type GuessStartTxReq struct { type GuessStartTxReq struct {
Topic string `protobuf:"bytes,1,opt,name=topic,proto3" json:"topic,omitempty"` Topic string `protobuf:"bytes,1,opt,name=topic,proto3" json:"topic,omitempty"`
Options string `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"` Options string `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"`
...@@ -2540,7 +2690,7 @@ func (m *GuessStartTxReq) Reset() { *m = GuessStartTxReq{} } ...@@ -2540,7 +2690,7 @@ func (m *GuessStartTxReq) Reset() { *m = GuessStartTxReq{} }
func (m *GuessStartTxReq) String() string { return proto.CompactTextString(m) } func (m *GuessStartTxReq) String() string { return proto.CompactTextString(m) }
func (*GuessStartTxReq) ProtoMessage() {} func (*GuessStartTxReq) ProtoMessage() {}
func (*GuessStartTxReq) Descriptor() ([]byte, []int) { func (*GuessStartTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{33} return fileDescriptor_7574406c5d3430e8, []int{35}
} }
func (m *GuessStartTxReq) XXX_Unmarshal(b []byte) error { func (m *GuessStartTxReq) XXX_Unmarshal(b []byte) error {
...@@ -2672,7 +2822,7 @@ func (m *GuessBetTxReq) Reset() { *m = GuessBetTxReq{} } ...@@ -2672,7 +2822,7 @@ func (m *GuessBetTxReq) Reset() { *m = GuessBetTxReq{} }
func (m *GuessBetTxReq) String() string { return proto.CompactTextString(m) } func (m *GuessBetTxReq) String() string { return proto.CompactTextString(m) }
func (*GuessBetTxReq) ProtoMessage() {} func (*GuessBetTxReq) ProtoMessage() {}
func (*GuessBetTxReq) Descriptor() ([]byte, []int) { func (*GuessBetTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{34} return fileDescriptor_7574406c5d3430e8, []int{36}
} }
func (m *GuessBetTxReq) XXX_Unmarshal(b []byte) error { func (m *GuessBetTxReq) XXX_Unmarshal(b []byte) error {
...@@ -2725,7 +2875,7 @@ func (m *GuessAbortTxReq) Reset() { *m = GuessAbortTxReq{} } ...@@ -2725,7 +2875,7 @@ func (m *GuessAbortTxReq) Reset() { *m = GuessAbortTxReq{} }
func (m *GuessAbortTxReq) String() string { return proto.CompactTextString(m) } func (m *GuessAbortTxReq) String() string { return proto.CompactTextString(m) }
func (*GuessAbortTxReq) ProtoMessage() {} func (*GuessAbortTxReq) ProtoMessage() {}
func (*GuessAbortTxReq) Descriptor() ([]byte, []int) { func (*GuessAbortTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{35} return fileDescriptor_7574406c5d3430e8, []int{37}
} }
func (m *GuessAbortTxReq) XXX_Unmarshal(b []byte) error { func (m *GuessAbortTxReq) XXX_Unmarshal(b []byte) error {
...@@ -2765,7 +2915,7 @@ func (m *GuessPublishTxReq) Reset() { *m = GuessPublishTxReq{} } ...@@ -2765,7 +2915,7 @@ func (m *GuessPublishTxReq) Reset() { *m = GuessPublishTxReq{} }
func (m *GuessPublishTxReq) String() string { return proto.CompactTextString(m) } func (m *GuessPublishTxReq) String() string { return proto.CompactTextString(m) }
func (*GuessPublishTxReq) ProtoMessage() {} func (*GuessPublishTxReq) ProtoMessage() {}
func (*GuessPublishTxReq) Descriptor() ([]byte, []int) { func (*GuessPublishTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{36} return fileDescriptor_7574406c5d3430e8, []int{38}
} }
func (m *GuessPublishTxReq) XXX_Unmarshal(b []byte) error { func (m *GuessPublishTxReq) XXX_Unmarshal(b []byte) error {
...@@ -2812,7 +2962,7 @@ func (m *PBContinueTxReq) Reset() { *m = PBContinueTxReq{} } ...@@ -2812,7 +2962,7 @@ func (m *PBContinueTxReq) Reset() { *m = PBContinueTxReq{} }
func (m *PBContinueTxReq) String() string { return proto.CompactTextString(m) } func (m *PBContinueTxReq) String() string { return proto.CompactTextString(m) }
func (*PBContinueTxReq) ProtoMessage() {} func (*PBContinueTxReq) ProtoMessage() {}
func (*PBContinueTxReq) Descriptor() ([]byte, []int) { func (*PBContinueTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{37} return fileDescriptor_7574406c5d3430e8, []int{39}
} }
func (m *PBContinueTxReq) XXX_Unmarshal(b []byte) error { func (m *PBContinueTxReq) XXX_Unmarshal(b []byte) error {
...@@ -2859,7 +3009,7 @@ func (m *PBQuitTxReq) Reset() { *m = PBQuitTxReq{} } ...@@ -2859,7 +3009,7 @@ func (m *PBQuitTxReq) Reset() { *m = PBQuitTxReq{} }
func (m *PBQuitTxReq) String() string { return proto.CompactTextString(m) } func (m *PBQuitTxReq) String() string { return proto.CompactTextString(m) }
func (*PBQuitTxReq) ProtoMessage() {} func (*PBQuitTxReq) ProtoMessage() {}
func (*PBQuitTxReq) Descriptor() ([]byte, []int) { func (*PBQuitTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{38} return fileDescriptor_7574406c5d3430e8, []int{40}
} }
func (m *PBQuitTxReq) XXX_Unmarshal(b []byte) error { func (m *PBQuitTxReq) XXX_Unmarshal(b []byte) error {
...@@ -2906,7 +3056,7 @@ func (m *PBQueryReq) Reset() { *m = PBQueryReq{} } ...@@ -2906,7 +3056,7 @@ func (m *PBQueryReq) Reset() { *m = PBQueryReq{} }
func (m *PBQueryReq) String() string { return proto.CompactTextString(m) } func (m *PBQueryReq) String() string { return proto.CompactTextString(m) }
func (*PBQueryReq) ProtoMessage() {} func (*PBQueryReq) ProtoMessage() {}
func (*PBQueryReq) Descriptor() ([]byte, []int) { func (*PBQueryReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{39} return fileDescriptor_7574406c5d3430e8, []int{41}
} }
func (m *PBQueryReq) XXX_Unmarshal(b []byte) error { func (m *PBQueryReq) XXX_Unmarshal(b []byte) error {
...@@ -2955,7 +3105,7 @@ func (m *GuessGameRecord) Reset() { *m = GuessGameRecord{} } ...@@ -2955,7 +3105,7 @@ func (m *GuessGameRecord) Reset() { *m = GuessGameRecord{} }
func (m *GuessGameRecord) String() string { return proto.CompactTextString(m) } func (m *GuessGameRecord) String() string { return proto.CompactTextString(m) }
func (*GuessGameRecord) ProtoMessage() {} func (*GuessGameRecord) ProtoMessage() {}
func (*GuessGameRecord) Descriptor() ([]byte, []int) { func (*GuessGameRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{40} return fileDescriptor_7574406c5d3430e8, []int{42}
} }
func (m *GuessGameRecord) XXX_Unmarshal(b []byte) error { func (m *GuessGameRecord) XXX_Unmarshal(b []byte) error {
...@@ -3009,7 +3159,7 @@ func (m *GuessGameIndexRecord) Reset() { *m = GuessGameIndexRecord{} } ...@@ -3009,7 +3159,7 @@ func (m *GuessGameIndexRecord) Reset() { *m = GuessGameIndexRecord{} }
func (m *GuessGameIndexRecord) String() string { return proto.CompactTextString(m) } func (m *GuessGameIndexRecord) String() string { return proto.CompactTextString(m) }
func (*GuessGameIndexRecord) ProtoMessage() {} func (*GuessGameIndexRecord) ProtoMessage() {}
func (*GuessGameIndexRecord) Descriptor() ([]byte, []int) { func (*GuessGameIndexRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{41} return fileDescriptor_7574406c5d3430e8, []int{43}
} }
func (m *GuessGameIndexRecord) XXX_Unmarshal(b []byte) error { func (m *GuessGameIndexRecord) XXX_Unmarshal(b []byte) error {
...@@ -3055,7 +3205,7 @@ func (m *GuessGameRecords) Reset() { *m = GuessGameRecords{} } ...@@ -3055,7 +3205,7 @@ func (m *GuessGameRecords) Reset() { *m = GuessGameRecords{} }
func (m *GuessGameRecords) String() string { return proto.CompactTextString(m) } func (m *GuessGameRecords) String() string { return proto.CompactTextString(m) }
func (*GuessGameRecords) ProtoMessage() {} func (*GuessGameRecords) ProtoMessage() {}
func (*GuessGameRecords) Descriptor() ([]byte, []int) { func (*GuessGameRecords) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{42} return fileDescriptor_7574406c5d3430e8, []int{44}
} }
func (m *GuessGameRecords) XXX_Unmarshal(b []byte) error { func (m *GuessGameRecords) XXX_Unmarshal(b []byte) error {
...@@ -3087,6 +3237,8 @@ func init() { ...@@ -3087,6 +3237,8 @@ func init() {
proto.RegisterType((*GuessGame)(nil), "types.GuessGame") proto.RegisterType((*GuessGame)(nil), "types.GuessGame")
proto.RegisterType((*GuessPlayer)(nil), "types.GuessPlayer") proto.RegisterType((*GuessPlayer)(nil), "types.GuessPlayer")
proto.RegisterType((*GuessBet)(nil), "types.GuessBet") proto.RegisterType((*GuessBet)(nil), "types.GuessBet")
proto.RegisterType((*GuessBetStat)(nil), "types.GuessBetStat")
proto.RegisterType((*GuessBetStatItem)(nil), "types.GuessBetStatItem")
proto.RegisterType((*PokerBull)(nil), "types.PokerBull") proto.RegisterType((*PokerBull)(nil), "types.PokerBull")
proto.RegisterType((*PBHand)(nil), "types.PBHand") proto.RegisterType((*PBHand)(nil), "types.PBHand")
proto.RegisterType((*PBPlayer)(nil), "types.PBPlayer") proto.RegisterType((*PBPlayer)(nil), "types.PBPlayer")
...@@ -3132,112 +3284,120 @@ func init() { ...@@ -3132,112 +3284,120 @@ func init() {
func init() { proto.RegisterFile("guess.proto", fileDescriptor_7574406c5d3430e8) } func init() { proto.RegisterFile("guess.proto", fileDescriptor_7574406c5d3430e8) }
var fileDescriptor_7574406c5d3430e8 = []byte{ var fileDescriptor_7574406c5d3430e8 = []byte{
// 1678 bytes of a gzipped FileDescriptorProto // 1808 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0xcd, 0x6e, 0xdb, 0xc6, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x59, 0x4b, 0x6f, 0xdb, 0xca,
0x13, 0xb7, 0x3e, 0xa8, 0x8f, 0x91, 0x25, 0xdb, 0xeb, 0xc4, 0xe1, 0xdf, 0xf8, 0xa3, 0x70, 0x19, 0x15, 0xb6, 0x1e, 0xd4, 0xe3, 0xc8, 0x92, 0xec, 0x71, 0xe2, 0xcb, 0x1a, 0x17, 0x85, 0xcb, 0xeb,
0x37, 0x71, 0x8a, 0x26, 0x2d, 0x6c, 0x20, 0x6d, 0x52, 0xb4, 0x80, 0x95, 0x00, 0x71, 0x80, 0x20, 0xde, 0x28, 0x45, 0x93, 0x16, 0x32, 0x90, 0x36, 0x29, 0x5a, 0xc0, 0x4a, 0x80, 0xd8, 0x40, 0x10,
0x50, 0xd6, 0x29, 0xd2, 0x2b, 0x2d, 0xad, 0x1d, 0x22, 0x12, 0x49, 0x93, 0x54, 0x62, 0xdd, 0x8a, 0x28, 0xe3, 0x14, 0xe9, 0x96, 0x92, 0xc6, 0x32, 0x11, 0x89, 0x94, 0x49, 0x2a, 0xb1, 0x76, 0x45,
0xf6, 0x09, 0x7a, 0xe8, 0x13, 0xf4, 0xd2, 0x97, 0x2a, 0xd0, 0x5b, 0x1f, 0xa1, 0xd7, 0x62, 0x67, 0xdb, 0x6d, 0x17, 0x5d, 0xf4, 0x17, 0x74, 0xd3, 0x3f, 0xd5, 0x75, 0x81, 0xfe, 0x81, 0x6e, 0x8b,
0x76, 0xc9, 0x25, 0x45, 0xc9, 0x71, 0xd0, 0x9e, 0x7a, 0xdb, 0xd9, 0xd9, 0xdd, 0xf9, 0x9e, 0xf9, 0x39, 0x67, 0x86, 0x1c, 0x52, 0x94, 0x1c, 0x07, 0xed, 0xaa, 0xbb, 0x39, 0x0f, 0xcd, 0x9c, 0xf7,
0x91, 0xd0, 0x39, 0x9b, 0x8a, 0x38, 0xbe, 0x17, 0x46, 0x41, 0x12, 0x30, 0x2b, 0x99, 0x85, 0x22, 0x7c, 0x43, 0x41, 0x6b, 0xba, 0x14, 0x51, 0xf4, 0x74, 0x11, 0x06, 0x71, 0xc0, 0xac, 0x78, 0xb5,
0xde, 0xde, 0x48, 0x22, 0xd7, 0x8f, 0xdd, 0x61, 0xe2, 0x05, 0x3e, 0x71, 0x9c, 0x3f, 0x2c, 0x68, 0x10, 0xd1, 0xd1, 0x7e, 0x1c, 0xba, 0x7e, 0xe4, 0x8e, 0x63, 0x2f, 0xf0, 0x49, 0xe2, 0xfc, 0xcb,
0x3f, 0x91, 0x27, 0x9f, 0xb8, 0x13, 0xc1, 0xb6, 0xa0, 0x71, 0xe6, 0x4e, 0xc4, 0xd3, 0x91, 0x5d, 0x82, 0xe6, 0x6b, 0xa9, 0xf9, 0xda, 0x9d, 0x0b, 0x76, 0x08, 0xb5, 0xa9, 0x3b, 0x17, 0x17, 0x13,
0xd9, 0xa9, 0xec, 0xb5, 0xb9, 0xa2, 0xe4, 0x7e, 0x9c, 0xb8, 0xc9, 0x34, 0xb6, 0xab, 0x3b, 0x95, 0xbb, 0x74, 0x5c, 0xea, 0x35, 0xb9, 0xa2, 0x24, 0x3f, 0x8a, 0xdd, 0x78, 0x19, 0xd9, 0xe5, 0xe3,
0xbd, 0x2e, 0x57, 0x14, 0xfb, 0x3f, 0xb4, 0xc3, 0x48, 0x1c, 0x13, 0xab, 0x86, 0xac, 0x6c, 0x43, 0x52, 0xaf, 0xcd, 0x15, 0xc5, 0xbe, 0x85, 0xe6, 0x22, 0x14, 0x97, 0x24, 0xaa, 0xa0, 0x28, 0x65,
0x72, 0xe3, 0xc4, 0x8d, 0x92, 0x97, 0xde, 0x44, 0xd8, 0xf5, 0x9d, 0xca, 0x5e, 0x8d, 0x67, 0x1b, 0x48, 0x69, 0x14, 0xbb, 0x61, 0xfc, 0xde, 0x9b, 0x0b, 0xbb, 0x7a, 0x5c, 0xea, 0x55, 0x78, 0xca,
0x6c, 0x07, 0x3a, 0x44, 0x5c, 0x1c, 0xb9, 0xf1, 0x6b, 0xdb, 0x42, 0x81, 0xe6, 0x16, 0xbb, 0x06, 0x60, 0xc7, 0xd0, 0x22, 0xe2, 0xf6, 0xdc, 0x8d, 0xae, 0x6d, 0x0b, 0x0f, 0x34, 0x59, 0xec, 0x01,
0x56, 0x12, 0x84, 0xde, 0xd0, 0x6e, 0x20, 0x8f, 0x08, 0xb6, 0x0d, 0xad, 0xa1, 0x9b, 0x88, 0xb3, 0x58, 0x71, 0xb0, 0xf0, 0xc6, 0x76, 0x0d, 0x65, 0x44, 0xb0, 0x23, 0x68, 0x8c, 0xdd, 0x58, 0x4c,
0x20, 0x9a, 0xd9, 0x4d, 0x64, 0xa4, 0x34, 0xb3, 0xa1, 0x19, 0x84, 0xd2, 0xba, 0xd8, 0x6e, 0x21, 0x83, 0x70, 0x65, 0xd7, 0x51, 0x90, 0xd0, 0xcc, 0x86, 0x7a, 0xb0, 0x90, 0xde, 0x45, 0x76, 0x03,
0x4b, 0x93, 0x92, 0x33, 0x71, 0x2f, 0x50, 0x93, 0x36, 0x71, 0x14, 0x29, 0xb5, 0x9c, 0xb8, 0x17, 0x45, 0x9a, 0x94, 0x92, 0xb9, 0x7b, 0x8b, 0x96, 0x34, 0x49, 0xa2, 0x48, 0x69, 0xe5, 0xdc, 0xbd,
0x47, 0xc2, 0x3b, 0x7b, 0x9d, 0xd8, 0x40, 0x5a, 0xa6, 0x1b, 0x68, 0xf9, 0x6c, 0x72, 0x12, 0x8c, 0x3d, 0x17, 0xde, 0xf4, 0x3a, 0xb6, 0x81, 0xac, 0x4c, 0x18, 0xe8, 0xf9, 0x6a, 0x3e, 0x0a, 0x66,
0xed, 0x0e, 0x79, 0x84, 0x28, 0xc6, 0xa0, 0x2e, 0x2e, 0xc4, 0xd0, 0x5e, 0xc5, 0x5d, 0x5c, 0xcb, 0x76, 0x8b, 0x22, 0x42, 0x14, 0x63, 0x50, 0x15, 0xb7, 0x62, 0x6c, 0xef, 0x22, 0x17, 0xd7, 0x52,
0xb3, 0x81, 0x2f, 0xfa, 0x22, 0xb1, 0xbb, 0xe4, 0x25, 0xa2, 0x94, 0xec, 0xbe, 0x48, 0x62, 0xbb, 0x37, 0xf0, 0xc5, 0x40, 0xc4, 0x76, 0x9b, 0xa2, 0x44, 0x94, 0x3a, 0x7b, 0x20, 0xe2, 0xc8, 0xee,
0x87, 0x0c, 0x4d, 0xb2, 0x5d, 0xe8, 0xaa, 0xe5, 0xf3, 0xe9, 0xe4, 0x44, 0x44, 0xf6, 0x1a, 0xf2, 0xa0, 0x40, 0x93, 0xec, 0x04, 0xda, 0x6a, 0xf9, 0x76, 0x39, 0x1f, 0x89, 0xd0, 0xee, 0xa2, 0x3c,
0xf3, 0x9b, 0x6c, 0x1d, 0x6a, 0xa7, 0x42, 0xd8, 0xeb, 0xc8, 0x93, 0x4b, 0xf9, 0xe2, 0xa9, 0x10, 0xcb, 0x64, 0x7b, 0x50, 0xb9, 0x12, 0xc2, 0xde, 0x3b, 0x2e, 0xf5, 0xaa, 0x5c, 0x2e, 0xe5, 0x8e,
0x87, 0xa3, 0x51, 0x64, 0x6f, 0x90, 0x35, 0x8a, 0x94, 0x3a, 0x88, 0x8b, 0xd0, 0x8b, 0x84, 0xcd, 0x57, 0x42, 0x9c, 0x4d, 0x26, 0xa1, 0xbd, 0x4f, 0xde, 0x28, 0x52, 0xda, 0x20, 0x6e, 0x17, 0x5e,
0x48, 0x5f, 0xa2, 0x98, 0x03, 0xab, 0xb4, 0x52, 0x86, 0x6e, 0xa2, 0xa1, 0xb9, 0x3d, 0xe9, 0x09, 0x28, 0x6c, 0x46, 0xf6, 0x12, 0xc5, 0x1c, 0xd8, 0xa5, 0x95, 0x72, 0xf4, 0x00, 0x1d, 0xcd, 0xf0,
0x77, 0x34, 0xf1, 0x7c, 0x7c, 0xf7, 0x1a, 0x5e, 0xcf, 0x36, 0xd8, 0x47, 0x00, 0x27, 0x99, 0xa2, 0x64, 0x24, 0xdc, 0xc9, 0xdc, 0xf3, 0x71, 0xdf, 0x07, 0xf8, 0xf3, 0x94, 0xc1, 0x7e, 0x08, 0x30,
0xd7, 0x51, 0x19, 0x63, 0x87, 0xed, 0x81, 0x15, 0x8e, 0xdd, 0x59, 0x6c, 0x6f, 0xed, 0xd4, 0xf6, 0x4a, 0x0d, 0x7d, 0x88, 0x86, 0x1a, 0x1c, 0xd6, 0x03, 0x6b, 0x31, 0x73, 0x57, 0x91, 0x7d, 0x78,
0x3a, 0xfb, 0xec, 0x1e, 0xe6, 0xdc, 0x3d, 0x4c, 0xae, 0xc1, 0xd8, 0x9d, 0x89, 0x88, 0xd3, 0x01, 0x5c, 0xe9, 0xb5, 0xfa, 0xec, 0x29, 0xd6, 0xdc, 0x53, 0x2c, 0xae, 0xe1, 0xcc, 0x5d, 0x89, 0x90,
0xa9, 0x63, 0x24, 0xe2, 0xe9, 0x38, 0xb1, 0x6f, 0x90, 0x8e, 0x44, 0xb1, 0x9b, 0x50, 0x97, 0xef, 0x93, 0x82, 0xb4, 0x31, 0x14, 0xd1, 0x72, 0x16, 0xdb, 0xdf, 0x90, 0x8d, 0x44, 0xb1, 0x27, 0x50,
0xd9, 0x36, 0x3e, 0xb0, 0x66, 0x3e, 0xd0, 0x17, 0x09, 0x47, 0xa6, 0x4c, 0x0a, 0xcf, 0x1f, 0x89, 0x1f, 0x89, 0x58, 0x16, 0x8f, 0x6d, 0x1f, 0x97, 0x7a, 0xad, 0xfe, 0x81, 0xb9, 0xc7, 0x80, 0x44,
0x0b, 0xfb, 0x7f, 0x68, 0x01, 0x11, 0x32, 0x29, 0xc2, 0x48, 0x3c, 0x45, 0xc6, 0x36, 0x32, 0x52, 0x5c, 0xeb, 0xc8, 0xf2, 0xf0, 0xfc, 0x89, 0xb8, 0xb5, 0x7f, 0x80, 0xbe, 0x10, 0x21, 0xcb, 0x63,
0xda, 0x79, 0x0c, 0x1d, 0x43, 0x09, 0x19, 0x39, 0x57, 0x1a, 0x48, 0x19, 0x8e, 0x6b, 0xf6, 0x31, 0x11, 0x8a, 0x0b, 0x14, 0x1c, 0xa1, 0x20, 0xa1, 0x9d, 0x57, 0xd0, 0x32, 0xcc, 0x91, 0x39, 0x74,
0xd4, 0x4e, 0x44, 0x82, 0xc9, 0x5d, 0x22, 0x58, 0xf2, 0x9c, 0xdf, 0x2a, 0xd0, 0xd2, 0x3b, 0x18, 0xa5, 0xab, 0x54, 0xeb, 0xb8, 0x66, 0x3f, 0x82, 0xca, 0x48, 0xc4, 0x58, 0xe6, 0xad, 0x7e, 0x37,
0x69, 0x4c, 0x2c, 0x5d, 0x27, 0x44, 0x15, 0x7c, 0x54, 0x9d, 0xf3, 0xd1, 0x36, 0xb4, 0xbc, 0xf8, 0x77, 0x3e, 0x97, 0x32, 0xe7, 0xef, 0x25, 0x68, 0x68, 0x0e, 0xe6, 0x1c, 0x4b, 0x4c, 0x77, 0x0c,
0x95, 0xe7, 0xfb, 0x22, 0xc2, 0x72, 0x69, 0xf1, 0x94, 0x96, 0x6f, 0x86, 0x51, 0x70, 0xea, 0x25, 0x51, 0xb9, 0x68, 0x95, 0xd7, 0xa2, 0x75, 0x04, 0x0d, 0x2f, 0xfa, 0xe0, 0xf9, 0xbe, 0x08, 0xb1,
0x58, 0x2a, 0x5d, 0xae, 0xa8, 0xcc, 0x60, 0x6b, 0x91, 0xc1, 0x8d, 0x82, 0xc1, 0x7f, 0xd5, 0xa0, 0x71, 0x1a, 0x3c, 0xa1, 0xe5, 0x9e, 0x8b, 0x30, 0xb8, 0xf2, 0x62, 0x6c, 0x9a, 0x36, 0x57, 0x54,
0x3d, 0x08, 0xde, 0x88, 0xa8, 0x3f, 0x1d, 0x8f, 0xdf, 0xb3, 0xa6, 0x2d, 0xb3, 0xa6, 0xb3, 0xaa, 0xea, 0xb0, 0xb5, 0xc9, 0xe1, 0x5a, 0xce, 0xe1, 0x3f, 0x97, 0x60, 0xd7, 0x0c, 0x9e, 0x2c, 0xb8,
0xad, 0x5d, 0x52, 0xb5, 0xf5, 0xd2, 0xaa, 0x7d, 0xeb, 0x8e, 0xa7, 0x42, 0xeb, 0x8b, 0x04, 0xdb, 0x38, 0x88, 0xdd, 0xd9, 0x40, 0x60, 0x13, 0x46, 0x68, 0x75, 0x9b, 0x67, 0x99, 0xac, 0x07, 0x5d,
0x05, 0x2b, 0x94, 0x2a, 0xa1, 0xb2, 0x9d, 0xfd, 0x9e, 0xf2, 0xf1, 0xa0, 0x8f, 0x8a, 0x72, 0x62, 0xcd, 0xc8, 0x7a, 0x90, 0x67, 0xb3, 0x27, 0x60, 0x79, 0xb1, 0x98, 0xcb, 0xe6, 0x97, 0x49, 0xff,
0xb2, 0x3b, 0xd0, 0x0c, 0x31, 0x4a, 0xb1, 0xdd, 0xcc, 0x25, 0xc1, 0xa0, 0xaf, 0x52, 0x48, 0xf3, 0xa6, 0x20, 0x61, 0x17, 0xb1, 0x98, 0x73, 0xd2, 0x72, 0xae, 0x61, 0x2f, 0x2f, 0xfa, 0xea, 0x08,
0xb1, 0xf5, 0xe0, 0xf2, 0xf9, 0x74, 0x82, 0xc5, 0x6e, 0xf1, 0x6c, 0x43, 0x3e, 0x44, 0x49, 0x15, 0x7e, 0x0b, 0x4d, 0x49, 0x91, 0x1b, 0x6a, 0xf6, 0x24, 0x0c, 0xe7, 0xdf, 0x15, 0x68, 0x0e, 0x83,
0xdb, 0xed, 0xc2, 0x43, 0x1c, 0xf7, 0xb9, 0xe6, 0x67, 0xfe, 0x05, 0xd3, 0xbf, 0xd4, 0xd9, 0xde, 0x8f, 0x22, 0x1c, 0x2c, 0x67, 0xb3, 0x2f, 0x9c, 0x6b, 0x96, 0x39, 0xd7, 0xd2, 0xc9, 0x55, 0xb9,
0x92, 0x83, 0x3b, 0xe4, 0x85, 0x74, 0x43, 0x7a, 0xff, 0x7c, 0xea, 0x91, 0x8b, 0x56, 0xc9, 0xfb, 0x63, 0x72, 0x55, 0x0b, 0x27, 0xd7, 0x27, 0x77, 0xb6, 0x14, 0x3a, 0x53, 0x48, 0xb0, 0x13, 0xb0,
0x9a, 0x96, 0x39, 0x80, 0x6b, 0x72, 0x50, 0x17, 0x1d, 0x64, 0xec, 0x48, 0xfe, 0x48, 0xb8, 0x63, 0x16, 0xd2, 0x24, 0x4c, 0x53, 0xab, 0xdf, 0x51, 0xc1, 0x1a, 0x0e, 0xd0, 0x50, 0x4e, 0x42, 0xf6,
0x11, 0x61, 0x99, 0xf5, 0x88, 0x9f, 0xed, 0x48, 0xc9, 0x5e, 0xfc, 0xca, 0xf5, 0x12, 0xcf, 0x3f, 0x18, 0xea, 0x0b, 0xac, 0xcf, 0xc8, 0xae, 0x63, 0x50, 0xbb, 0xa9, 0x1e, 0xb5, 0x91, 0x96, 0xe3,
0xc3, 0x7e, 0xd0, 0xe2, 0xd9, 0x46, 0xbe, 0xe3, 0xae, 0x2b, 0xb3, 0xf5, 0x86, 0xf3, 0x63, 0x05, 0xf8, 0xc5, 0xe5, 0xdb, 0xe5, 0x1c, 0x07, 0x9e, 0xc5, 0x53, 0x86, 0xdc, 0x88, 0x1a, 0x2b, 0xb2,
0x1a, 0x83, 0xfe, 0x91, 0xeb, 0x8f, 0xa4, 0x59, 0x43, 0x37, 0x1a, 0xc5, 0x76, 0x65, 0xa7, 0xb6, 0x9b, 0xb9, 0x8d, 0x38, 0xf2, 0xb9, 0x96, 0xa7, 0x95, 0x05, 0x66, 0x65, 0xd1, 0x74, 0xff, 0x44,
0x67, 0x71, 0x22, 0x8c, 0xd2, 0x53, 0x41, 0x57, 0xa5, 0x67, 0x43, 0x53, 0x16, 0x82, 0x88, 0xa9, 0xa5, 0xd5, 0xa2, 0x28, 0x24, 0x0c, 0x59, 0x77, 0x37, 0x4b, 0x8f, 0x42, 0xb4, 0x4b, 0x75, 0xa7,
0x8d, 0xb7, 0xb9, 0x26, 0xd1, 0x3d, 0x32, 0x45, 0x31, 0xd4, 0x2d, 0x4e, 0x84, 0x74, 0xc0, 0x58, 0x69, 0x99, 0x3b, 0x5c, 0x53, 0x80, 0xda, 0x18, 0x20, 0x83, 0x23, 0xe5, 0x13, 0xe1, 0xce, 0x44,
0xbc, 0x15, 0x91, 0x7b, 0x46, 0x71, 0xb6, 0x78, 0x4a, 0x3b, 0xef, 0xa0, 0xa5, 0xc3, 0xc5, 0x6e, 0x88, 0xa3, 0xa6, 0x43, 0xf2, 0x94, 0x23, 0x4f, 0xf6, 0xa2, 0x0f, 0xae, 0x17, 0x7b, 0xfe, 0x14,
0x82, 0xf5, 0xda, 0xf5, 0x95, 0x16, 0x9d, 0xfd, 0x6e, 0x1a, 0x05, 0xa9, 0x23, 0x27, 0x9e, 0x29, 0x67, 0x62, 0x83, 0xa7, 0x8c, 0xec, 0xad, 0xb3, 0xa7, 0xdc, 0xd6, 0x0c, 0xe7, 0x0f, 0x25, 0xa8,
0xbc, 0x9a, 0x17, 0xbe, 0x05, 0x8d, 0x84, 0xfc, 0x48, 0x89, 0xa8, 0x28, 0xa9, 0x54, 0x24, 0xdc, 0x0d, 0x07, 0xe7, 0xae, 0x3f, 0x91, 0x6e, 0x8d, 0xdd, 0x70, 0x22, 0xab, 0xbc, 0xd2, 0xb3, 0x38,
0xd1, 0x4c, 0x2b, 0x85, 0x84, 0xf3, 0x6b, 0x45, 0x4a, 0xe6, 0xba, 0x99, 0xbc, 0x87, 0xe4, 0x2d, 0x11, 0xc6, 0xf8, 0x51, 0x49, 0x57, 0xe3, 0xc7, 0x86, 0xba, 0x1c, 0x01, 0x22, 0xa2, 0x72, 0x6a,
0x68, 0xbc, 0xa3, 0x6a, 0x24, 0xc1, 0x8a, 0xca, 0x99, 0x57, 0xcb, 0x9b, 0x27, 0xef, 0x50, 0xb4, 0x72, 0x4d, 0x62, 0x78, 0x64, 0x73, 0x62, 0xaa, 0x1b, 0x9c, 0x08, 0x19, 0x80, 0x99, 0xf8, 0x24,
0x54, 0xf2, 0x2b, 0x8a, 0xdd, 0x82, 0x1e, 0xad, 0x9e, 0xe5, 0x1d, 0x53, 0xd8, 0x75, 0x1e, 0x40, 0x42, 0x77, 0x4a, 0x79, 0xb6, 0x78, 0x42, 0x3b, 0x9f, 0xa1, 0xa1, 0xd3, 0xc5, 0xbe, 0x03, 0xeb,
0x53, 0x65, 0xfd, 0x82, 0x18, 0xd9, 0xd0, 0x0c, 0x03, 0xcf, 0x4f, 0x94, 0x56, 0x16, 0xd7, 0xa4, 0xda, 0xf5, 0x95, 0x15, 0xad, 0x7e, 0x3b, 0xc9, 0x82, 0xb4, 0x91, 0x93, 0xcc, 0x3c, 0xbc, 0x9c,
0xf3, 0x7b, 0x05, 0x56, 0x07, 0x7d, 0x39, 0xa9, 0x0f, 0x71, 0x86, 0xb3, 0x4f, 0xc1, 0xc2, 0xd2, 0x3d, 0xfc, 0x10, 0x6a, 0x31, 0xc5, 0x91, 0x0a, 0x51, 0x51, 0xd2, 0xa8, 0x50, 0xb8, 0x93, 0x95,
0xc3, 0xd2, 0xce, 0x7a, 0x2e, 0x9d, 0x39, 0x96, 0x9c, 0xa3, 0x15, 0x4e, 0x47, 0xd8, 0x01, 0xb4, 0x36, 0x0a, 0x09, 0xe7, 0x6f, 0x25, 0x79, 0x32, 0xe5, 0xf7, 0xcb, 0x4e, 0x3e, 0x84, 0xda, 0x67,
0x86, 0x81, 0x9f, 0x78, 0xfe, 0x54, 0xa8, 0x46, 0x77, 0x3d, 0x77, 0xfc, 0x91, 0x62, 0x1e, 0xad, 0x9a, 0x43, 0x74, 0xb0, 0xa2, 0x32, 0xee, 0x55, 0xb2, 0xee, 0xc9, 0xdf, 0x50, 0xb6, 0x54, 0xf1,
0xf0, 0xf4, 0x20, 0xbb, 0x0d, 0x75, 0x99, 0xba, 0xe8, 0x84, 0xce, 0xfe, 0x46, 0xee, 0xc2, 0x8b, 0x2b, 0x8a, 0x7d, 0x0f, 0x1d, 0x5a, 0xbd, 0xc9, 0x06, 0x26, 0xc7, 0x75, 0x9e, 0x43, 0x5d, 0x55,
0xa9, 0x27, 0x9f, 0xc7, 0x03, 0x52, 0x93, 0xf3, 0xa9, 0x88, 0x28, 0x22, 0x45, 0x4d, 0x5e, 0x48, 0xfd, 0x86, 0x1c, 0xd9, 0x50, 0x5f, 0x04, 0x9e, 0x1f, 0x2b, 0xab, 0x2c, 0xae, 0x49, 0xe7, 0x1f,
0x8e, 0xd4, 0x04, 0x8f, 0xb0, 0x1e, 0x54, 0x93, 0x19, 0x96, 0x9b, 0xc5, 0xab, 0xc9, 0xac, 0xdf, 0x25, 0xd8, 0x1d, 0x0e, 0x24, 0x5a, 0x39, 0x43, 0x1c, 0xc3, 0x7e, 0x02, 0x16, 0xb6, 0x1e, 0xb6,
0x54, 0x1d, 0xc3, 0x39, 0x84, 0x8e, 0xa1, 0x7a, 0xd6, 0x49, 0x2a, 0x66, 0x27, 0xc9, 0x15, 0x7e, 0x76, 0x7a, 0xef, 0x90, 0xce, 0xa5, 0x94, 0x9c, 0xef, 0x70, 0x52, 0x61, 0xa7, 0xd0, 0x18, 0x07,
0xb5, 0x50, 0xf8, 0xce, 0x1e, 0xf4, 0xf2, 0xe6, 0x2c, 0xea, 0x7f, 0xce, 0x2e, 0x40, 0x66, 0xc7, 0x7e, 0xec, 0xf9, 0x4b, 0xa1, 0x46, 0xfc, 0xc3, 0x8c, 0xfa, 0x4b, 0x25, 0x3c, 0xdf, 0xe1, 0x89,
0xc2, 0x53, 0x9f, 0x68, 0x95, 0xd0, 0x86, 0x85, 0xc7, 0x7e, 0xa9, 0xc2, 0x5a, 0x0a, 0xa3, 0x54, 0x22, 0x7b, 0x04, 0x55, 0x59, 0xba, 0x18, 0x84, 0x56, 0x7f, 0x3f, 0xf3, 0x83, 0x77, 0x4b, 0x4f,
0x70, 0xee, 0xe6, 0x83, 0x73, 0xdd, 0x1c, 0x2b, 0x25, 0xf1, 0xb9, 0x6d, 0xce, 0xa0, 0xcd, 0xe2, 0x6e, 0x8f, 0x0a, 0xd2, 0x92, 0x9b, 0xa5, 0x08, 0x29, 0x23, 0x79, 0x4b, 0xde, 0x49, 0x89, 0xb4,
0xe1, 0xbe, 0x90, 0x47, 0xe5, 0x09, 0xf9, 0xae, 0x7b, 0x12, 0x44, 0x3a, 0x28, 0x73, 0xef, 0x1e, 0x04, 0x55, 0x58, 0x07, 0xca, 0xf1, 0x0a, 0xdb, 0xcd, 0xe2, 0xe5, 0x78, 0x35, 0xa8, 0xab, 0x89,
0x4a, 0xa6, 0x7c, 0x17, 0x4f, 0xb1, 0x03, 0x68, 0x86, 0xd3, 0x93, 0xb1, 0xa7, 0xba, 0x75, 0x67, 0xe1, 0x9c, 0x41, 0xcb, 0x30, 0x3d, 0x9d, 0x24, 0x25, 0x73, 0x92, 0x64, 0x1a, 0xbf, 0x9c, 0x6b,
0xff, 0x46, 0xf1, 0xc2, 0x80, 0xd8, 0x47, 0x2b, 0x5c, 0x9f, 0x94, 0x32, 0x28, 0x9c, 0x56, 0xb9, 0x7c, 0xa7, 0x07, 0x9d, 0xac, 0x3b, 0x9b, 0xe6, 0x9f, 0x73, 0x02, 0x90, 0xfa, 0xb1, 0x51, 0xeb,
0x8c, 0xd2, 0x88, 0x36, 0x70, 0x6e, 0xe5, 0x22, 0xfa, 0x43, 0x0d, 0x7a, 0x79, 0x83, 0x33, 0x54, 0xc7, 0xda, 0x24, 0xf4, 0x61, 0xa3, 0xda, 0x5f, 0xcb, 0xd0, 0x4d, 0xa0, 0xa4, 0x4a, 0xce, 0x93,
0x57, 0x31, 0x51, 0x9d, 0x81, 0xdc, 0xaa, 0x79, 0xe4, 0x66, 0xe2, 0xbd, 0xda, 0x3c, 0xde, 0xd3, 0x6c, 0x72, 0x1e, 0x9a, 0xf7, 0x43, 0x41, 0x7e, 0x1e, 0x99, 0xb7, 0xef, 0x41, 0x5e, 0x79, 0x20,
0xa8, 0xae, 0xbe, 0x04, 0xd5, 0x59, 0x8b, 0x51, 0x5d, 0xa3, 0x14, 0xd5, 0x35, 0x4b, 0x51, 0x5d, 0xa4, 0xaa, 0xd4, 0x90, 0xfb, 0xba, 0xa3, 0x20, 0xd4, 0x49, 0x59, 0xdb, 0xf7, 0x4c, 0x0a, 0xe5,
0x6b, 0x11, 0xaa, 0x6b, 0x5f, 0x82, 0xea, 0x60, 0x09, 0xaa, 0x93, 0xb3, 0xa5, 0x3e, 0x87, 0xea, 0xbe, 0xa8, 0xc5, 0x4e, 0xa1, 0xbe, 0x58, 0x8e, 0x66, 0x9e, 0x9a, 0xd6, 0xb9, 0x8b, 0x4a, 0xfe,
0x56, 0x17, 0xa1, 0xba, 0xee, 0x52, 0x54, 0xd7, 0x9b, 0x47, 0x75, 0xce, 0xf7, 0xb0, 0x6a, 0x66, 0x60, 0x48, 0xe2, 0xf3, 0x1d, 0xae, 0x35, 0xe5, 0x19, 0x94, 0x4e, 0xab, 0xf8, 0x8c, 0xc2, 0x8c,
0xd1, 0x32, 0x3c, 0xa0, 0x30, 0x4d, 0x35, 0x87, 0x69, 0x6c, 0x68, 0x2a, 0x04, 0xa3, 0x10, 0xbe, 0xd6, 0xf0, 0x22, 0xca, 0x64, 0xf4, 0xf7, 0x15, 0xe8, 0x64, 0x1d, 0x4e, 0x91, 0x6d, 0xc9, 0x44,
0x26, 0x65, 0xad, 0xe5, 0x93, 0x6e, 0x61, 0x79, 0xf4, 0x61, 0xbd, 0x98, 0x6d, 0xcb, 0xf4, 0x30, 0xb6, 0x06, 0x7a, 0x2d, 0x67, 0xd1, 0xab, 0x89, 0x79, 0x2b, 0xeb, 0x98, 0x57, 0x23, 0xdb, 0xea,
0x46, 0x54, 0x8a, 0x0e, 0x9d, 0xaf, 0x0c, 0x69, 0x4b, 0x8b, 0x51, 0x65, 0x63, 0x55, 0x67, 0xa3, 0x16, 0x64, 0x6b, 0x6d, 0x46, 0xb6, 0xb5, 0x42, 0x64, 0x5b, 0x2f, 0x44, 0xb6, 0x8d, 0x4d, 0xc8,
0x73, 0x0e, 0x37, 0xf1, 0x02, 0x15, 0xf2, 0x33, 0x2f, 0x4e, 0xfa, 0x33, 0x1a, 0x98, 0x87, 0xfe, 0xb6, 0x79, 0x07, 0xb2, 0x85, 0x2d, 0xc8, 0xb6, 0x55, 0x88, 0x6c, 0x77, 0x37, 0x21, 0xdb, 0xf6,
0x68, 0x90, 0x62, 0x86, 0x0c, 0x10, 0x55, 0x8a, 0x80, 0x68, 0x71, 0xc3, 0xc9, 0xe0, 0x43, 0xcd, 0x56, 0x64, 0xdb, 0x59, 0x47, 0xb6, 0xce, 0xef, 0x14, 0x0c, 0x52, 0x55, 0xb4, 0x0d, 0x0f, 0x28,
0x80, 0x0f, 0xce, 0x4b, 0xdd, 0xa8, 0xb9, 0x18, 0x06, 0xd1, 0xe8, 0xca, 0x20, 0xac, 0xfc, 0xd5, 0x2c, 0x52, 0xce, 0x60, 0x11, 0x1b, 0x91, 0xa9, 0xb4, 0x5a, 0x21, 0x0d, 0x4d, 0xca, 0x5e, 0xcb,
0x43, 0xd8, 0xa0, 0x57, 0x11, 0x85, 0x5c, 0xf2, 0x74, 0xfa, 0x44, 0xd5, 0x7c, 0xe2, 0x5b, 0xe8, 0x16, 0xdd, 0xc6, 0xf6, 0x18, 0x28, 0xec, 0x63, 0x54, 0xdb, 0x36, 0x3b, 0x8c, 0x2b, 0x2a, 0x41,
0x9a, 0x8a, 0xc5, 0xec, 0xae, 0x44, 0x4a, 0xb8, 0x54, 0x93, 0x72, 0x33, 0xd7, 0xba, 0xe9, 0x18, 0xc8, 0xce, 0x2f, 0x8d, 0xd3, 0xb6, 0x36, 0xa3, 0xaa, 0xc6, 0xb2, 0xae, 0x46, 0xe7, 0x06, 0xbe,
0xd7, 0x67, 0x9c, 0x37, 0xb0, 0x66, 0xf8, 0xf2, 0xa9, 0x7f, 0x1a, 0x2c, 0x54, 0x40, 0x03, 0xed, 0xc3, 0x1f, 0x50, 0x23, 0xbf, 0xf1, 0xa2, 0x78, 0xb0, 0xa2, 0x0b, 0xf3, 0xcc, 0x9f, 0x0c, 0x13,
0xaa, 0x01, 0xb4, 0x33, 0x7b, 0x6b, 0xe5, 0xf6, 0xd6, 0x4d, 0x65, 0x0f, 0xa0, 0xc3, 0x45, 0x38, 0xcc, 0x90, 0x02, 0xa2, 0x52, 0x1e, 0x10, 0x6d, 0x1e, 0x38, 0x29, 0x7c, 0xa8, 0x18, 0xf0, 0xc1,
0x56, 0xc2, 0xd8, 0x2e, 0xd4, 0xe5, 0xd3, 0xaa, 0x9f, 0xae, 0x6b, 0x3d, 0x35, 0xd2, 0xe5, 0xc8, 0x79, 0xaf, 0x07, 0x35, 0x17, 0xe3, 0x20, 0x9c, 0xdc, 0x1b, 0x84, 0x15, 0xef, 0x7a, 0x06, 0xfb,
0x75, 0x3e, 0x83, 0xf5, 0x82, 0x86, 0x38, 0x52, 0x49, 0x29, 0x32, 0xb2, 0xcd, 0x35, 0xe9, 0x3c, 0xb4, 0x2b, 0xa2, 0x90, 0x3b, 0xb6, 0x4e, 0xb6, 0x28, 0x9b, 0x5b, 0xfc, 0x06, 0xda, 0xa6, 0x61,
0x80, 0x35, 0x43, 0x84, 0xcc, 0x0d, 0x76, 0x0b, 0x2c, 0xc9, 0xd5, 0xfe, 0x98, 0x97, 0x43, 0x6c, 0x91, 0x7c, 0x78, 0x84, 0xb4, 0x54, 0x37, 0xe5, 0x41, 0x66, 0x74, 0x93, 0x1a, 0xd7, 0x3a, 0xce,
0xc7, 0x07, 0x86, 0x82, 0xd2, 0xac, 0xfc, 0x97, 0xbd, 0xf1, 0x10, 0x18, 0xaa, 0x9a, 0x97, 0x57, 0x47, 0xe8, 0x1a, 0xb1, 0xbc, 0xf0, 0xaf, 0x82, 0x8d, 0x06, 0xe8, 0x27, 0x46, 0xd9, 0x78, 0x62,
0xee, 0x94, 0xf4, 0x8c, 0x72, 0xca, 0xe7, 0xb0, 0x39, 0xaf, 0xeb, 0x32, 0xbf, 0x7c, 0x03, 0x9b, 0xa4, 0xfe, 0x56, 0x8a, 0xfd, 0xad, 0x9a, 0xc6, 0x9e, 0x42, 0x8b, 0x8b, 0xc5, 0x4c, 0x1d, 0xc6,
0xf3, 0xc2, 0xe2, 0x45, 0xbe, 0xc9, 0xc4, 0x29, 0xdf, 0xfc, 0x5c, 0x85, 0x2e, 0x17, 0x43, 0xe1, 0x4e, 0xa0, 0x2a, 0xb7, 0x56, 0xf3, 0x74, 0x4f, 0xdb, 0xa9, 0x91, 0x2e, 0x47, 0xa9, 0xf3, 0x53,
0x85, 0x89, 0x0a, 0xde, 0x55, 0x2b, 0x40, 0xfb, 0xab, 0x66, 0xf8, 0xab, 0xd4, 0x2f, 0x79, 0xa8, 0xd8, 0xcb, 0x59, 0x88, 0x57, 0x2a, 0x19, 0x45, 0x4e, 0x36, 0xb9, 0x26, 0x9d, 0xe7, 0xd0, 0x35,
0x6e, 0x15, 0xa1, 0x7a, 0xae, 0x7a, 0x1b, 0x25, 0xd5, 0x4b, 0x10, 0xa3, 0x59, 0x80, 0x18, 0x19, 0x8e, 0x90, 0xb5, 0xc1, 0xbe, 0x07, 0x4b, 0x4a, 0x75, 0x3c, 0xd6, 0xcf, 0x21, 0xb1, 0xe3, 0x03,
0x04, 0x6f, 0x15, 0x21, 0xb8, 0x9d, 0x7d, 0xa4, 0xb4, 0xc9, 0x69, 0xe6, 0x37, 0x49, 0x0a, 0xce, 0xc3, 0x83, 0x92, 0xaa, 0xfc, 0x1f, 0x47, 0xe3, 0x05, 0x30, 0x34, 0x35, 0x7b, 0x5e, 0x71, 0x50,
0xa1, 0x08, 0xce, 0xc7, 0xb0, 0xae, 0x5c, 0xf2, 0xe1, 0x3f, 0x5c, 0xde, 0xdb, 0x2b, 0xce, 0x4f, 0x12, 0x1d, 0x15, 0x94, 0x9f, 0xc1, 0xc1, 0xba, 0xad, 0xdb, 0xe2, 0xf2, 0x6b, 0x38, 0x58, 0x3f,
0x35, 0x85, 0x48, 0x8e, 0xe9, 0xdb, 0x8c, 0x8b, 0xf3, 0x2b, 0x8f, 0xde, 0xe5, 0x9f, 0x82, 0x57, 0x2c, 0xda, 0x14, 0x9b, 0xf4, 0x38, 0x15, 0x9b, 0xbf, 0x94, 0xa1, 0xcd, 0xc5, 0x58, 0x78, 0x8b,
0x18, 0xbe, 0xdd, 0xff, 0xca, 0xf0, 0xed, 0x16, 0x86, 0xef, 0x31, 0x74, 0xf5, 0x4f, 0x03, 0x0a, 0x58, 0x25, 0xef, 0xbe, 0x1d, 0xa0, 0xe3, 0x55, 0x31, 0xe2, 0x55, 0x18, 0x97, 0x2c, 0x54, 0xb7,
0xc1, 0x55, 0xa7, 0x2f, 0x53, 0xff, 0x44, 0x68, 0xf4, 0xe2, 0xda, 0xb9, 0xa3, 0x22, 0x8b, 0x33, 0xf2, 0x50, 0x3d, 0xd3, 0xbd, 0xb5, 0x82, 0xee, 0x25, 0x88, 0x51, 0xcf, 0x41, 0x8c, 0x14, 0x82,
0x77, 0xe9, 0xb3, 0xce, 0x23, 0xd8, 0xa0, 0x7f, 0x1f, 0x34, 0x74, 0x2f, 0xd5, 0xa1, 0x74, 0xf2, 0x37, 0xf2, 0x10, 0xdc, 0x4e, 0x1f, 0x29, 0x4d, 0x0a, 0x9a, 0xf9, 0x26, 0x49, 0xc0, 0x39, 0xe4,
0x7e, 0x0d, 0x6b, 0x83, 0xbe, 0xc6, 0xd3, 0xcb, 0x9f, 0x50, 0x7e, 0xa5, 0x91, 0x23, 0x97, 0xce, 0xc1, 0xf9, 0x9f, 0xca, 0xb0, 0xa7, 0x62, 0x72, 0xf7, 0x57, 0xa7, 0xcc, 0x56, 0xe5, 0xfc, 0xd7,
0x97, 0x12, 0x40, 0xbf, 0xc0, 0xcf, 0xdf, 0xab, 0x5d, 0xbc, 0x2f, 0xf1, 0x39, 0x36, 0xad, 0xab, 0xa5, 0x6c, 0xe1, 0xb4, 0xd7, 0x82, 0x56, 0x35, 0x82, 0x96, 0xf9, 0xb2, 0x61, 0xe5, 0xbf, 0x6c,
0xdd, 0x7b, 0x65, 0x20, 0xf1, 0x7f, 0x74, 0xfa, 0x3e, 0x86, 0x6b, 0x46, 0x37, 0xfc, 0xd0, 0x01, 0x6c, 0x79, 0x41, 0xa7, 0xe1, 0xae, 0xe7, 0xde, 0xdc, 0xc9, 0x7d, 0xdc, 0xc8, 0xdd, 0xc7, 0x0e,
0xfc, 0xd8, 0x80, 0x42, 0x7a, 0x06, 0x7f, 0x51, 0x9c, 0xc1, 0x5b, 0x73, 0x7d, 0x35, 0x3f, 0x86, 0xec, 0x92, 0x25, 0x2f, 0xaf, 0x5d, 0x7f, 0x4a, 0x9f, 0x9b, 0x1a, 0x3c, 0xc3, 0x73, 0xfe, 0x58,
0xf7, 0xff, 0xac, 0x80, 0x85, 0x3f, 0x78, 0xd9, 0x7d, 0x80, 0xac, 0xcc, 0x59, 0xf9, 0x47, 0xc6, 0x51, 0x50, 0xe9, 0x92, 0x1e, 0x8d, 0x5c, 0xdc, 0xdc, 0x1b, 0x13, 0x6c, 0x7f, 0xa3, 0xde, 0x03,
0xb6, 0xfe, 0xfb, 0xf1, 0x9d, 0x1f, 0x7b, 0x67, 0xfe, 0xcb, 0x0b, 0x67, 0x85, 0xed, 0x1b, 0xbf, 0x15, 0xb4, 0xff, 0x5f, 0x50, 0x41, 0x3b, 0x87, 0x0a, 0x2e, 0xa1, 0xad, 0xbf, 0x46, 0x50, 0x0a,
0xb3, 0xca, 0xbe, 0x36, 0xca, 0xee, 0x68, 0x59, 0x04, 0xf6, 0xca, 0x3f, 0x3c, 0xca, 0xee, 0x3d, 0xee, 0x0b, 0x0b, 0x18, 0x54, 0x25, 0x0e, 0x50, 0x05, 0x88, 0x6b, 0xe7, 0xb1, 0xca, 0x2c, 0x82,
0x54, 0x10, 0x54, 0x43, 0xbf, 0x45, 0x5f, 0x20, 0x25, 0x77, 0x4f, 0x1a, 0xf8, 0x9f, 0xfa, 0xe0, 0x81, 0xad, 0xdb, 0x3a, 0x2f, 0x61, 0x9f, 0x3e, 0x47, 0x11, 0x1a, 0xb8, 0xd3, 0x86, 0x42, 0x48,
0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x70, 0xe6, 0x48, 0x7b, 0xd0, 0x16, 0x00, 0x00, 0xf0, 0x2b, 0xe8, 0x0e, 0x07, 0x1a, 0xe8, 0x6f, 0xdf, 0x42, 0xc5, 0x95, 0xee, 0x42, 0xb9, 0x74,
0x7e, 0x21, 0x91, 0xfd, 0x3b, 0x7c, 0x97, 0xdf, 0xef, 0x87, 0xcf, 0xe4, 0xc3, 0x01, 0xa7, 0xe9,
0xfd, 0x7e, 0xf7, 0xc1, 0x78, 0x22, 0xfc, 0x57, 0x61, 0xc1, 0x2b, 0x78, 0x60, 0x8c, 0xe9, 0xaf,
0x45, 0x06, 0xaf, 0x0c, 0x8c, 0xa6, 0xc1, 0xc1, 0xcf, 0xf3, 0xe0, 0xe0, 0x70, 0x6d, 0xe0, 0x67,
0xf1, 0x41, 0xff, 0x9f, 0x25, 0xb0, 0xf0, 0xeb, 0x3b, 0x7b, 0x06, 0x90, 0xb6, 0x39, 0x2b, 0x7e,
0xfd, 0x1c, 0xe9, 0xcf, 0x32, 0xbf, 0xf5, 0x23, 0x6f, 0xea, 0xbf, 0xbf, 0x75, 0x76, 0x58, 0xdf,
0xf8, 0xc2, 0x58, 0xf4, 0x0c, 0x2a, 0xfa, 0x8d, 0x3e, 0x8b, 0x50, 0x68, 0xf1, 0x8b, 0xa8, 0xe8,
0x77, 0x2f, 0x14, 0x36, 0xd6, 0x98, 0x74, 0xd3, 0xd3, 0xa8, 0xe0, 0xb7, 0xa3, 0x1a, 0xfe, 0x89,
0x70, 0xfa, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6c, 0x1e, 0x01, 0xe9, 0x6d, 0x18, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment