Commit 9fe46fb1 authored by 张振华's avatar 张振华

guess

parent e22ff037
...@@ -242,8 +242,8 @@ func guessQuery(cmd *cobra.Command, args []string) { ...@@ -242,8 +242,8 @@ func guessQuery(cmd *cobra.Command, args []string) {
gameIDs, _ := cmd.Flags().GetString("gameIDs") gameIDs, _ := cmd.Flags().GetString("gameIDs")
var params types.Query4Cli var params types.Query4Cli
params.Execer = pkt.PokerBullX params.Execer = pkt.GuessX
req := &pkt.QueryPBGameInfo{ req := &pkt.QueryGuessGameInfo{
GameId: gameID, GameId: gameID,
Addr: address, Addr: address,
Status: int32(status), Status: int32(status),
...@@ -252,7 +252,7 @@ func guessQuery(cmd *cobra.Command, args []string) { ...@@ -252,7 +252,7 @@ func guessQuery(cmd *cobra.Command, args []string) {
params.Payload = req params.Payload = req
if gameID != "" { if gameID != "" {
params.FuncName = pkt.FuncName_QueryGameById params.FuncName = pkt.FuncName_QueryGameById
var res pkt.ReplyPBGame var res pkt.ReplyGuessGameInfo
ctx := jsonrpc.NewRpcCtx(rpcLaddr, "Chain33.Query", params, &res) ctx := jsonrpc.NewRpcCtx(rpcLaddr, "Chain33.Query", params, &res)
ctx.Run() ctx.Run()
} else if address != "" { } else if address != "" {
...@@ -272,7 +272,7 @@ func guessQuery(cmd *cobra.Command, args []string) { ...@@ -272,7 +272,7 @@ func guessQuery(cmd *cobra.Command, args []string) {
gameIDsS = append(gameIDsS, gameIDs) gameIDsS = append(gameIDsS, gameIDs)
req := &pkt.QueryPBGameInfos{gameIDsS} req := &pkt.QueryPBGameInfos{gameIDsS}
params.Payload = req params.Payload = req
var res pkt.ReplyPBGameList var res pkt.ReplyGuessGameInfos
ctx := jsonrpc.NewRpcCtx(rpcLaddr, "Chain33.Query", params, &res) ctx := jsonrpc.NewRpcCtx(rpcLaddr, "Chain33.Query", params, &res)
ctx.Run() ctx.Run()
} else { } else {
......
...@@ -41,7 +41,7 @@ func (c *PokerBull) updateIndex(log *pkt.ReceiptPBGame) (kvs []*types.KeyValue) ...@@ -41,7 +41,7 @@ func (c *PokerBull) updateIndex(log *pkt.ReceiptPBGame) (kvs []*types.KeyValue)
if !log.IsWaiting { if !log.IsWaiting {
for _, v := range log.Players { for _, v := range log.Players {
if v != log.Addr { if v != log.Addr {
kvs = append(kvs, addPBGameAddrIndexKey(log.Status, v, log.GameId, log.Index)) kvs = append(kvs, addGuessGameAddrIndexKey(log.Status, v, log.GameId, log.Index))
} }
kvs = append(kvs, delPBGameAddrIndexKey(v, log.PrevIndex)) kvs = append(kvs, delPBGameAddrIndexKey(v, log.PrevIndex))
} }
......
...@@ -65,25 +65,21 @@ func calcGuessGameStatusKey(status int32, index int64) []byte { ...@@ -65,25 +65,21 @@ func calcGuessGameStatusKey(status int32, index int64) []byte {
return []byte(key) return []byte(key)
} }
func calcPBGameStatusAndPlayerKey(status, player int32, value, index int64) []byte { func calcGuessGameStatusAndPlayerKey(category string, status, index int64) []byte {
key := fmt.Sprintf("LODB-guess-status:%d:%d:%d:%018d", status, player, value, index) key := fmt.Sprintf("LODB-guess-category-status:%s:%d:%018d", category, status, index)
return []byte(key) return []byte(key)
} }
func calcPBGameStatusAndPlayerPrefix(status, player int32, value int64) []byte { func calcGuessGameStatusAndPlayerPrefix(category string, status int32) []byte {
var key string var key string
if value == 0 { key = fmt.Sprintf("LODB-guess-category-status:%s:%d", category, status)
key = fmt.Sprintf("LODB-guess-status:%d:%d:", status, player)
} else {
key = fmt.Sprintf("LODB-guess-status:%d:%d:%d", status, player, value)
}
return []byte(key) return []byte(key)
} }
func addPBGameStatusIndexKey(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 = calcPBGameStatusKey(status, index) kv.Key = calcGuessGameStatusKey(status, index)
record := &pkt.PBGameIndexRecord{ record := &pkt.PBGameIndexRecord{
GameId: gameID, GameId: gameID,
Index: index, Index: index,
...@@ -92,16 +88,16 @@ func addPBGameStatusIndexKey(status int32, gameID string, index int64) *types.Ke ...@@ -92,16 +88,16 @@ func addPBGameStatusIndexKey(status int32, gameID string, index int64) *types.Ke
return kv return kv
} }
func delPBGameStatusIndexKey(status int32, index int64) *types.KeyValue { func delGuessGameStatusIndexKey(status int32, index int64) *types.KeyValue {
kv := &types.KeyValue{} kv := &types.KeyValue{}
kv.Key = calcPBGameStatusKey(status, index) kv.Key = calcGuessGameStatusKey(status, index)
kv.Value = nil kv.Value = nil
return kv return kv
} }
func addPBGameAddrIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue { func addGuessGameAddrIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{} kv := &types.KeyValue{}
kv.Key = calcPBGameAddrKey(addr, index) kv.Key = calcGuessGameAddrKey(addr, index)
record := &pkt.PBGameRecord{ record := &pkt.PBGameRecord{
GameId: gameID, GameId: gameID,
Status: status, Status: status,
...@@ -111,16 +107,16 @@ func addPBGameAddrIndexKey(status int32, addr, gameID string, index int64) *type ...@@ -111,16 +107,16 @@ func addPBGameAddrIndexKey(status int32, addr, gameID string, index int64) *type
return kv return kv
} }
func delPBGameAddrIndexKey(addr string, index int64) *types.KeyValue { func delGuessGameAddrIndexKey(addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{} kv := &types.KeyValue{}
kv.Key = calcPBGameAddrKey(addr, index) kv.Key = calcGuessGameAddrKey(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 addPBGameStatusAndPlayer(status int32, player int32, value, index int64, gameId string) *types.KeyValue {
kv := &types.KeyValue{} kv := &types.KeyValue{}
kv.Key = calcPBGameStatusAndPlayerKey(status, player, value, index) kv.Key = calcGuessGameStatusAndPlayerKey(status, player, value, index)
record := &pkt.PBGameIndexRecord{ record := &pkt.PBGameIndexRecord{
GameId: gameId, GameId: gameId,
Index: index, Index: index,
...@@ -131,7 +127,7 @@ func addPBGameStatusAndPlayer(status int32, player int32, value, index int64, ga ...@@ -131,7 +127,7 @@ func addPBGameStatusAndPlayer(status int32, player int32, value, index int64, ga
func delPBGameStatusAndPlayer(status int32, player int32, value, index int64) *types.KeyValue { func delPBGameStatusAndPlayer(status int32, player int32, value, index int64) *types.KeyValue {
kv := &types.KeyValue{} kv := &types.KeyValue{}
kv.Key = calcPBGameStatusAndPlayerKey(status, player, value, index) kv.Key = calcGuessGameStatusAndPlayerKey(status, player, value, index)
kv.Value = nil kv.Value = nil
return kv return kv
} }
...@@ -26,14 +26,14 @@ const ( ...@@ -26,14 +26,14 @@ const (
ListASC = int32(1) ListASC = int32(1)
DefaultCount = int32(20) //默认一次取多少条记录 DefaultCount = int32(20) //默认一次取多少条记录
MaxBets = 10000 MaxBets = 10000 //一次最多下多少注
MaxBetsNumber = 100000 MaxBetsNumber = 100000 //一局游戏最多接受多少注
MaxHeight = 10000000000 MaxHeight = 10000000000 //最大区块高度
MinBetBlockNum = 720 MinBetBlockNum = 720 //从创建游戏开始,一局游戏最少的可下注区块数量
MinBetTimeInterval = "2h" //2h MinBetTimeInterval = "2h" //从创建游戏开始,一局游戏最短的可下注时间
MinBetTimeoutNum = 8640 MinBetTimeoutNum = 8640 //从游戏结束下注开始,一局游戏最少的超时块数
MinBetTimeoutInterval = "24h" //24h MinBetTimeoutInterval = "24h" //从游戏结束下注开始,一局游戏最短的超时时间
MIN_PLAY_VALUE = 10 * types.Coin MIN_PLAY_VALUE = 10 * types.Coin
//DefaultStyle = pkt.PlayStyleDefault //DefaultStyle = pkt.PlayStyleDefault
...@@ -72,11 +72,6 @@ func NewAction(guess *Guess, tx *types.Transaction, index int) *Action { ...@@ -72,11 +72,6 @@ func NewAction(guess *Guess, tx *types.Transaction, index int) *Action {
} }
func (action *Action) CheckExecAccountBalance(fromAddr string, ToFrozen, ToActive int64) bool { func (action *Action) CheckExecAccountBalance(fromAddr string, ToFrozen, ToActive int64) bool {
// 赌注为零,按照最小赌注冻结
if ToFrozen == 0 {
ToFrozen = MIN_PLAY_VALUE
}
acc := action.coinsAccount.LoadExecAccount(fromAddr, action.execaddr) acc := action.coinsAccount.LoadExecAccount(fromAddr, action.execaddr)
if acc.GetBalance() >= ToFrozen && acc.GetFrozen() >= ToActive { if acc.GetBalance() >= ToFrozen && acc.GetFrozen() >= ToActive {
return true return true
...@@ -119,8 +114,8 @@ func GetGameList(db dbm.KV, values []string) []*pkt.GuessGame { ...@@ -119,8 +114,8 @@ func GetGameList(db dbm.KV, values []string) []*pkt.GuessGame {
return games return games
} }
func Infos(db dbm.KV, infos *pkt.QueryPBGameInfos) (types.Message, error) { func Infos(db dbm.KV, infos *pkt.QueryGuessGameInfos) (types.Message, error) {
var games []*pkt.PokerBull var games []*pkt.GuessGame
for i := 0; i < len(infos.GameIds); i++ { for i := 0; i < len(infos.GameIds); i++ {
id := infos.GameIds[i] id := infos.GameIds[i]
game, err := readGame(db, id) game, err := readGame(db, id)
...@@ -129,7 +124,7 @@ func Infos(db dbm.KV, infos *pkt.QueryPBGameInfos) (types.Message, error) { ...@@ -129,7 +124,7 @@ func Infos(db dbm.KV, infos *pkt.QueryPBGameInfos) (types.Message, error) {
} }
games = append(games, game) games = append(games, game)
} }
return &pkt.ReplyPBGameList{Games: games}, nil return &pkt.ReplyGuessGameInfos{Games: games}, nil
} }
func getGameListByAddr(db dbm.Lister, addr string, index int64) (types.Message, error) { func getGameListByAddr(db dbm.Lister, addr string, index int64) (types.Message, error) {
...@@ -216,17 +211,17 @@ func (action *Action) GetReceiptLog(game *pkt.GuessGame) *types.ReceiptLog { ...@@ -216,17 +211,17 @@ func (action *Action) GetReceiptLog(game *pkt.GuessGame) *types.ReceiptLog {
log := &types.ReceiptLog{} log := &types.ReceiptLog{}
r := &pkt.ReceiptGuessGame{} r := &pkt.ReceiptGuessGame{}
r.Addr = action.fromaddr r.Addr = action.fromaddr
if game.Status == pkt.GuessGameActionStart { if game.Status == pkt.GuessGameStatusStart {
log.Ty = pkt.TyLogGuessGameStart log.Ty = pkt.TyLogGuessGameStart
} else if game.Status == pkt.GuessGameActionBet { } else if game.Status == pkt.GuessGameStatusBet {
log.Ty = pkt.TyLogGuessGameBet log.Ty = pkt.TyLogGuessGameBet
} else if game.Status == pkt.GuessGameActionStopBet { } else if game.Status == pkt.GuessGameStatusStopBet {
log.Ty = pkt.TyLogGuessGameStopBet log.Ty = pkt.TyLogGuessGameStopBet
} else if game.Status == pkt.GuessGameActionAbort { } else if game.Status == pkt.GuessGameStatusAbort {
log.Ty = pkt.TyLogGuessGameAbort log.Ty = pkt.TyLogGuessGameAbort
} else if game.Status == pkt.GuessGameActionPublish { } else if game.Status == pkt.GuessGameStatusPublish {
log.Ty = pkt.TyLogGuessGamePublish log.Ty = pkt.TyLogGuessGamePublish
} else if game.Status == pkt.GuessGameActionTimeOut { } else if game.Status == pkt.GuessGameStatusTimeOut {
log.Ty = pkt.TyLogGuessGameTimeout log.Ty = pkt.TyLogGuessGameTimeout
} }
...@@ -459,17 +454,6 @@ func (action *Action) genTxRnd(txhash []byte) (int64, error) { ...@@ -459,17 +454,6 @@ func (action *Action) genTxRnd(txhash []byte) (int64, error) {
return randint, nil return randint, nil
} }
func (action *Action) checkDupPlayerAddress(id string, pbPlayers []*pkt.PBPlayer) error {
for _, player := range pbPlayers {
if action.fromaddr == player.Address {
logger.Error("Poker bull game start", "addr", action.fromaddr, "execaddr", action.execaddr, "Already in a game", id)
return errors.New("Address is already in a game")
}
}
return nil
}
// 新建一局游戏 // 新建一局游戏
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 var game *pkt.GuessGame
...@@ -500,52 +484,6 @@ func (action *Action) newGame(gameId string, start *pkt.GuessGameStart) (*pkt.Gu ...@@ -500,52 +484,6 @@ func (action *Action) newGame(gameId string, start *pkt.GuessGameStart) (*pkt.Gu
return game, nil return game, nil
} }
// 筛选合适的牌局
func (action *Action) selectGameFromIds(ids []string, value int64) *pkt.PokerBull {
var gameRet *pkt.PokerBull = nil
for _, id := range ids {
game, err := action.readGame(id)
if err != nil {
logger.Error("Poker bull game start", "addr", action.fromaddr, "execaddr", action.execaddr, "get game failed", id, "err", err)
continue
}
//不能自己和自己玩
if action.checkDupPlayerAddress(id, game.Players) != nil {
continue
}
//选择合适赌注的游戏
if value == 0 && game.GetValue() != MIN_PLAY_VALUE {
if !action.CheckExecAccountBalance(action.fromaddr, game.GetValue(), 0) {
logger.Error("GameStart", "addr", action.fromaddr, "execaddr", action.execaddr, "id", id, "err", types.ErrNoBalance)
continue
}
}
gameRet = game
break
}
return gameRet
}
func (action *Action) checkPlayerExistInGame() bool {
values, err := action.localDB.List(calcPBGameAddrPrefix(action.fromaddr), nil, DefaultCount, ListDESC)
if err == types.ErrNotFound {
return false
}
var value pkt.PBGameRecord
lenght := len(values)
if lenght != 0 {
valueBytes := values[lenght-1]
err := types.Decode(valueBytes, &value)
if err == nil && value.Status == pkt.PBGameActionQuit {
return false
}
}
return true
}
func (action *Action) GameStart(start *pkt.GuessGameStart) (*types.Receipt, error) { func (action *Action) GameStart(start *pkt.GuessGameStart) (*types.Receipt, error) {
var logs []*types.ReceiptLog var logs []*types.ReceiptLog
...@@ -606,7 +544,7 @@ func (action *Action) GameStart(start *pkt.GuessGameStart) (*types.Receipt, erro ...@@ -606,7 +544,7 @@ func (action *Action) GameStart(start *pkt.GuessGameStart) (*types.Receipt, erro
game.StartTime = action.blocktime game.StartTime = action.blocktime
game.AdminAddr = action.fromaddr game.AdminAddr = action.fromaddr
game.Index = action.getIndex() game.Index = action.getIndex()
game.Status = pkt.GuessGameActionStart game.Status = pkt.GuessGameStatusStart
receiptLog := action.GetReceiptLog(game) receiptLog := action.GetReceiptLog(game)
logs = append(logs, receiptLog) logs = append(logs, receiptLog)
kv = append(kv, action.saveGame(game)...) kv = append(kv, action.saveGame(game)...)
...@@ -644,13 +582,15 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) { ...@@ -644,13 +582,15 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) {
return nil, err return nil, err
} }
if game.Status != pkt.GuessGameActionStart && game.Status != pkt.GuessGameActionBet && game.Status != pkt.GuessGameActionStopBet{ 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())
return nil, errors.New("ErrGameStatus") return nil, errors.New("ErrGameStatus")
} }
if action.RefreshStatusByTime(game) { canBet := action.RefreshStatusByTime(game)
if canBet == false {
receiptLog := action.GetReceiptLog(game) receiptLog := action.GetReceiptLog(game)
logs = append(logs, receiptLog) logs = append(logs, receiptLog)
kv = append(kv, action.saveGame(game)...) kv = append(kv, action.saveGame(game)...)
...@@ -658,8 +598,8 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) { ...@@ -658,8 +598,8 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) {
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.GuessGameActionBet game.Status = pkt.GuessGameStatusBet
//检查竞猜选项是否合法 //检查竞猜选项是否合法
options, legal := getOptions(game.GetOptions()) options, legal := getOptions(game.GetOptions())
...@@ -687,7 +627,7 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) { ...@@ -687,7 +627,7 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) {
} }
// 检查余额账户余额 // 检查余额账户余额
checkValue := int64(game.GetOneBet() * pbBet.BetsNum) checkValue := int64(game.GetOneBet() * pbBet.BetsNum + game.Fee)
if !action.CheckExecAccountBalance(action.fromaddr, checkValue, 0) { if !action.CheckExecAccountBalance(action.fromaddr, checkValue, 0) {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "id", logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "id",
pbBet.GetGameId(), "err", types.ErrNoBalance) pbBet.GetGameId(), "err", types.ErrNoBalance)
...@@ -746,7 +686,7 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt ...@@ -746,7 +686,7 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
if game.Status != pkt.GuessGameActionStart && game.Status != pkt.GuessGameActionBet && game.Status != pkt.GuessGameActionStopBet{ 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())
return nil, errors.New("ErrGameStatus") return nil, errors.New("ErrGameStatus")
...@@ -766,24 +706,22 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt ...@@ -766,24 +706,22 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
game.Status = pkt.GuessGameActionPublish game.Status = pkt.GuessGameStatusPublish
game.Result = publish.Result game.Result = publish.Result
//先遍历所有下注数据,对于输家,转移资金到Admin账户合约地址; //先遍历所有下注数据,对于输家,转移资金到Admin账户合约地址;
for i := 0; i < len(game.Plays); i++ { for i := 0; i < len(game.Plays); i++ {
player := game.Plays[i] player := game.Plays[i]
//if player.Bet.Option != game.Result { value := int64(player.Bet.BetsNumber * game.OneBet + game.Fee)
value := int64(player.Bet.BetsNumber * game.OneBet) receipt, err := action.coinsAccount.ExecTransfer(player.Addr, game.AdminAddr, action.execaddr, value)
receipt, err := action.coinsAccount.ExecTransfer(player.Addr, game.AdminAddr, action.execaddr, value) if err != nil {
if err != nil { action.coinsAccount.ExecFrozen(game.AdminAddr, action.execaddr, value) // rollback
action.coinsAccount.ExecFrozen(game.AdminAddr, action.execaddr, value) // rollback logger.Error("GamePublish", "addr", game.AdminAddr, "execaddr", action.execaddr,
logger.Error("GamePublish", "addr", game.AdminAddr, "execaddr", action.execaddr, "amount", value, "err", err)
"amount", value, "err", err) return nil, err
return nil, err }
} logs = append(logs, receipt.Logs...)
logs = append(logs, receipt.Logs...) kv = append(kv, receipt.KV...)
kv = append(kv, receipt.KV...)
//}
} }
//计算竞猜正确的筹码总数 //计算竞猜正确的筹码总数
totalBetsNumber := uint32(0) totalBetsNumber := uint32(0)
...@@ -812,6 +750,19 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt ...@@ -812,6 +750,19 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt
} }
} }
//如果设置了手续费专用地址,则将本局游戏收取的手续费转移到专用地址
if game.Fee > 0 && len(game.FeeAddr) != 0 && game.FeeAddr != game.AdminAddr {
value := int64(game.Fee * uint32(len(game.Plays))
receipt, err := action.coinsAccount.ExecTransfer(game.AdminAddr, game.FeeAddr, action.execaddr, value)
if err != nil {
action.coinsAccount.ExecFrozen(game.FeeAddr, action.execaddr, value) // rollback
logger.Error("GamePublish", "addr", game.FeeAddr, "execaddr", action.execaddr, "amount", value, "err", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
receiptLog := action.GetReceiptLog(game) receiptLog := action.GetReceiptLog(game)
logs = append(logs, receiptLog) logs = append(logs, receiptLog)
kv = append(kv, action.saveGame(game)...) kv = append(kv, action.saveGame(game)...)
...@@ -834,7 +785,7 @@ func (action *Action) GameAbort(pbend *pkt.GuessGameAbort) (*types.Receipt, erro ...@@ -834,7 +785,7 @@ func (action *Action) GameAbort(pbend *pkt.GuessGameAbort) (*types.Receipt, erro
action.RefreshStatusByTime(game) action.RefreshStatusByTime(game)
//如果游戏超时,则任何地址都可以Abort,否则只有创建游戏的地址可以Abort //如果游戏超时,则任何地址都可以Abort,否则只有创建游戏的地址可以Abort
if game.Status != pkt.GuessGameActionTimeOut { if game.Status != pkt.GuessGameStatusTimeOut {
if game.AdminAddr != action.fromaddr { if game.AdminAddr != action.fromaddr {
logger.Error("GameAbort", "addr", action.fromaddr, "execaddr", action.execaddr, "Only admin can abort", logger.Error("GameAbort", "addr", action.fromaddr, "execaddr", action.execaddr, "Only admin can abort",
action.fromaddr, "status", game.Status) action.fromaddr, "status", game.Status)
...@@ -845,8 +796,8 @@ func (action *Action) GameAbort(pbend *pkt.GuessGameAbort) (*types.Receipt, erro ...@@ -845,8 +796,8 @@ func (action *Action) GameAbort(pbend *pkt.GuessGameAbort) (*types.Receipt, erro
//激活冻结账户 //激活冻结账户
for i := 0; i < len(game.Plays); i++ { for i := 0; i < len(game.Plays); i++ {
player := game.Plays[i] player := game.Plays[i]
value := int64(player.Bet.BetsNumber * game.OneBet) value := int64(player.Bet.BetsNumber * game.OneBet + game.Fee)
receipt, err := action.coinsAccount.ExecActive(player.Addr, action.execaddr, ) receipt, err := action.coinsAccount.ExecActive(player.Addr, action.execaddr, value)
if err != nil { if err != nil {
logger.Error("GameAbort", "addr", player.Addr, "execaddr", action.execaddr, "amount", value, "err", err) logger.Error("GameAbort", "addr", player.Addr, "execaddr", action.execaddr, "amount", value, "err", err)
continue continue
...@@ -854,7 +805,7 @@ func (action *Action) GameAbort(pbend *pkt.GuessGameAbort) (*types.Receipt, erro ...@@ -854,7 +805,7 @@ 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.GuessGameActionAbort game.Status = pkt.GuessGameStatusAbort
game.Index = action.getIndex(game) game.Index = action.getIndex(game)
receiptLog := action.GetReceiptLog(game) receiptLog := action.GetReceiptLog(game)
...@@ -891,18 +842,19 @@ func isLegalOption(options []string, option string) bool { ...@@ -891,18 +842,19 @@ func isLegalOption(options []string, option string) bool {
return false return false
} }
func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) 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.GuessGameActionStopBet game.Status = pkt.GuessGameStatusStopBet
} else { } else {
game.Status = pkt.GuessGameActionTimeOut game.Status = pkt.GuessGameStatusTimeOut
} }
return true canBet = false
return canBet
} }
// 检查区块高度是否超过下注时间限制,看是否可以下注 // 检查区块高度是否超过下注时间限制,看是否可以下注
...@@ -911,14 +863,16 @@ func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) bool { ...@@ -911,14 +863,16 @@ func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) bool {
if err != nil { if err != nil {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Parse MaxTime failed", logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Parse MaxTime failed",
game.GetMaxTime()) game.GetMaxTime())
return false canBet = true
return canBet
} }
tExpire, err := time.Parse("2006-01-02 15:04:05", game.GetExpire()) tExpire, err := time.Parse("2006-01-02 15:04:05", game.GetExpire())
if err != nil { if err != nil {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Parse Expire failed", logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Parse Expire failed",
game.GetExpire()) game.GetExpire())
return false canBet = true
return canBet
} }
tNow := time.Now() tNow := time.Now()
...@@ -927,16 +881,18 @@ func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) bool { ...@@ -927,16 +881,18 @@ func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) bool {
game.GetMaxTime()) game.GetMaxTime())
if tNow.After(tExpire) { if tNow.After(tExpire) {
game.Status = pkt.GuessGameActionTimeOut game.Status = pkt.GuessGameStatusTimeOut
} else { } else {
game.Status = pkt.GuessGameActionStopBet game.Status = pkt.GuessGameStatusStopBet
} }
return true canBet = false
return canBet
} }
} }
return false canBet = true
return canBet
} }
func (action *Action) CheckTime(start *pkt.GuessGameStart) bool { func (action *Action) CheckTime(start *pkt.GuessGameStart) bool {
...@@ -980,4 +936,4 @@ func (action *Action) CheckTime(start *pkt.GuessGameStart) bool { ...@@ -980,4 +936,4 @@ func (action *Action) CheckTime(start *pkt.GuessGameStart) bool {
} }
return false return false
} }
\ No newline at end of file
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package executor
import (
"fmt"
"math/rand"
"sort"
"github.com/33cn/plugin/plugin/dapp/pokerbull/types"
)
var POKER_CARD_NUM = 52 //4 * 13 不带大小王
var COLOR_OFFSET uint32 = 8
var COLOR_BIT_MAST = 0xFF
var COLOR_NUM = 4
var CARD_NUM_PER_COLOR = 13
var CARD_NUM_PER_GAME = 5
const (
POKERBULL_RESULT_X1 = 1
POKERBULL_RESULT_X2 = 2
POKERBULL_RESULT_X3 = 3
POKERBULL_RESULT_X4 = 4
POKERBULL_RESULT_X5 = 5
POKERBULL_LEVERAGE_MAX = POKERBULL_RESULT_X1
)
func NewPoker() *types.PBPoker {
poker := new(types.PBPoker)
poker.Cards = make([]int32, POKER_CARD_NUM)
poker.Pointer = int32(POKER_CARD_NUM - 1)
for i := 0; i < POKER_CARD_NUM; i++ {
color := i / CARD_NUM_PER_COLOR
num := i%CARD_NUM_PER_COLOR + 1
poker.Cards[i] = int32(color<<COLOR_OFFSET + num)
}
return poker
}
// 洗牌
func Shuffle(poker *types.PBPoker, rng int64) {
rndn := rand.New(rand.NewSource(rng))
for i := 0; i < POKER_CARD_NUM; i++ {
idx := rndn.Intn(POKER_CARD_NUM - 1)
tmpV := poker.Cards[idx]
poker.Cards[idx] = poker.Cards[POKER_CARD_NUM-i-1]
poker.Cards[POKER_CARD_NUM-i-1] = tmpV
}
poker.Pointer = int32(POKER_CARD_NUM - 1)
}
// 发牌
func Deal(poker *types.PBPoker, rng int64) []int32 {
if poker.Pointer < int32(CARD_NUM_PER_GAME) {
logger.Error(fmt.Sprintf("Wait to be shuffled: deal cards [%d], left [%d]", CARD_NUM_PER_GAME, poker.Pointer+1))
Shuffle(poker, rng+int64(poker.Cards[0]))
}
rndn := rand.New(rand.NewSource(rng))
res := make([]int32, CARD_NUM_PER_GAME)
for i := 0; i < CARD_NUM_PER_GAME; i++ {
idx := rndn.Intn(int(poker.Pointer))
tmpV := poker.Cards[poker.Pointer]
res[i] = poker.Cards[idx]
poker.Cards[idx] = tmpV
poker.Cards[poker.Pointer] = res[i]
poker.Pointer--
}
return res
}
// 计算斗牛结果
func Result(cards []int32) int32 {
temp := 0
r := -1 //是否有牛标志
pk := newcolorCard(cards)
//花牌等于10
cardsC := make([]int, len(cards))
for i := 0; i < len(pk); i++ {
if pk[i].num > 10 {
cardsC[i] = 10
} else {
cardsC[i] = pk[i].num
}
}
//斗牛算法
result := make([]int, 10)
var offset = 0
for x := 0; x < 3; x++ {
for y := x + 1; y < 4; y++ {
for z := y + 1; z < 5; z++ {
if (cardsC[x]+cardsC[y]+cardsC[z])%10 == 0 {
for j := 0; j < len(cardsC); j++ {
if j != x && j != y && j != z {
temp += cardsC[j]
}
}
if temp%10 == 0 {
r = 10 //若有牛,且剩下的两个数也是牛十
} else {
r = temp % 10 //若有牛,剩下的不是牛十
}
result[offset] = r
offset++
}
}
}
}
//没有牛
if r == -1 {
return -1
}
return int32(result[0])
}
// 计算结果倍数
func Leverage(hand *types.PBHand) int32 {
result := hand.Result
// 小牛 [1, 6]
if result < 7 {
return POKERBULL_RESULT_X1
}
// 大牛 [7, 9]
if result >= 7 && result < 10 {
return POKERBULL_RESULT_X2
}
var flowers = 0
if result == 10 {
for _, card := range hand.Cards {
if (int(card) & COLOR_BIT_MAST) > 10 {
flowers++
}
}
// 牛牛
if flowers < 4 {
return POKERBULL_RESULT_X3
}
// 四花
if flowers == 4 {
return POKERBULL_RESULT_X4
}
// 五花
if flowers == 5 {
return POKERBULL_RESULT_X5
}
}
return POKERBULL_RESULT_X1
}
type pokerCard struct {
num int
color int
}
type colorCardSlice []*pokerCard
func (p colorCardSlice) Len() int {
return len(p)
}
func (p colorCardSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}
func (p colorCardSlice) Less(i, j int) bool {
if i >= p.Len() || j >= p.Len() {
logger.Error("length error. slice length:", p.Len(), " compare lenth: ", i, " ", j)
}
if p[i] == nil || p[j] == nil {
logger.Error("nil pointer at ", i, " ", j)
}
return p[i].num < p[j].num
}
func newcolorCard(a []int32) colorCardSlice {
var cardS []*pokerCard
for i := 0; i < len(a); i++ {
num := int(a[i]) & COLOR_BIT_MAST
color := int(a[i]) >> COLOR_OFFSET
cardS = append(cardS, &pokerCard{num, color})
}
return cardS
}
func CompareResult(i, j *types.PBHand) bool {
if i.Result < j.Result {
return true
}
if i.Result == j.Result {
return Compare(i.Cards, j.Cards)
}
return false
}
func Compare(a []int32, b []int32) bool {
cardA := newcolorCard(a)
cardB := newcolorCard(b)
if !sort.IsSorted(cardA) {
sort.Sort(cardA)
}
if !sort.IsSorted(cardB) {
sort.Sort(cardB)
}
maxA := cardA[len(a)-1]
maxB := cardB[len(b)-1]
if maxA.num != maxB.num {
return maxA.num < maxB.num
}
return maxA.color < maxB.color
}
...@@ -6,22 +6,22 @@ package executor ...@@ -6,22 +6,22 @@ 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 (g *PokerBull) Query_QueryGameListByIds(in *pkt.QueryPBGameInfos) (types.Message, error) { func (g *Guess) Query_QueryGameListByIds(in *pkt.QueryGuessGameInfos) (types.Message, error) {
return Infos(g.GetStateDB(), in) return Infos(g.GetStateDB(), in)
} }
func (g *PokerBull) Query_QueryGameById(in *pkt.QueryPBGameInfo) (types.Message, error) { func (g *Guess) Query_QueryGameById(in *pkt.QueryGuessGameInfo) (types.Message, error) {
game, err := readGame(g.GetStateDB(), in.GetGameId()) game, err := readGame(g.GetStateDB(), in.GetGameId())
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &pkt.ReplyPBGame{game}, nil return &pkt.ReplyGuessGameInfo{game}, nil
} }
func (g *PokerBull) Query_QueryGameByAddr(in *pkt.QueryPBGameInfo) (types.Message, error) { func (g *Guess) Query_QueryGameByAddr(in *pkt.QueryGuessGameInfo) (types.Message, error) {
gameIds, err := getGameListByAddr(g.GetLocalDB(), in.Addr, in.Index) gameIds, err := getGameListByAddr(g.GetLocalDB(), in.Addr, in.Index)
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -30,7 +30,7 @@ func (g *PokerBull) Query_QueryGameByAddr(in *pkt.QueryPBGameInfo) (types.Messag ...@@ -30,7 +30,7 @@ func (g *PokerBull) Query_QueryGameByAddr(in *pkt.QueryPBGameInfo) (types.Messag
return gameIds, nil return gameIds, nil
} }
func (g *PokerBull) Query_QueryGameByStatus(in *pkt.QueryPBGameInfo) (types.Message, error) { func (g *Guess) Query_QueryGameByStatus(in *pkt.QueryGuessGameInfo) (types.Message, error) {
gameIds, err := getGameListByStatus(g.GetLocalDB(), in.Status, in.Index) gameIds, err := getGameListByStatus(g.GetLocalDB(), in.Status, in.Index)
if err != nil { if err != nil {
return nil, err return nil, err
......
...@@ -8,28 +8,30 @@ package types; ...@@ -8,28 +8,30 @@ package types;
message GuessGame { message GuessGame {
string gameId = 1; //游戏ID string gameId = 1; //游戏ID
uint32 status = 2; //游戏的状态:创建->投注->截止投注->开奖 uint32 status = 2; //游戏的状态:创建->投注->截止投注->开奖
int64 startTime = 3; //创建游戏的时间 uint32 preStatus = 3;
string startTxHash = 4; //创建游戏的交易hash int64 startTime = 4; //创建游戏的时间
string topic = 5; //主题 string startTxHash = 5; //创建游戏的交易hash
string category = 6; //分类 string topic = 6; //主题
string options = 7; //选项 string category = 7; //分类
string maxTime = 8; //截止下注时间 string options = 8; //选项
int64 maxHeight = 9; //截止下注的块高 string maxTime = 9; //截止下注时间
string symbol = 10; //bty或者具体token int64 maxHeight = 10; //截止下注的块高
string exec = 11; //coins或者token string symbol = 11; //bty或者具体token
uint32 oneBet = 12; //一注等于多少bty或者token string exec = 12; //coins或者token
uint32 maxBets = 13; //单次可以下多少注,默认100 uint32 oneBet = 13; //一注等于多少bty或者token
uint32 maxBetsNumber = 14; //最多可以下多少注 uint32 maxBets = 14; //单次可以下多少注,默认100
uint32 fee = 15; //收取费用,不带则表示不收费 uint32 maxBetsNumber = 15; //最多可以下多少注
string feeAddr = 16; //收费地址 uint32 fee = 16; //收取费用,不带则表示不收费
string expire = 17; //游戏过期时间 string feeAddr = 17; //收费地址
int64 expireHeight = 18; //游戏过期区块高度 string expire = 18; //游戏过期时间
string adminAddr = 19; //游戏创建者地址,只有该地址可以开奖 int64 expireHeight = 19; //游戏过期区块高度
uint32 betsNumber = 20; //已下注数,如果数量达到maxBetsNumber,则不允许再下注 string adminAddr = 20; //游戏创建者地址,只有该地址可以开奖
repeated GuessPlayer plays = 21; //参与游戏下注的玩家投注信息 uint32 betsNumber = 21; //已下注数,如果数量达到maxBetsNumber,则不允许再下注
string result = 22; repeated GuessPlayer plays = 22; //参与游戏下注的玩家投注信息
repeated GuessBet bets = 23; string result = 23;
int64 index = 24; repeated GuessBet bets = 24;
int64 index = 25;
int64 preIndex = 26;
} }
message GuessPlayer { message GuessPlayer {
...@@ -40,6 +42,10 @@ message GuessPlayer { ...@@ -40,6 +42,10 @@ message GuessPlayer {
message GuessBet { message GuessBet {
string option = 1; string option = 1;
uint32 betsNumber = 2; uint32 betsNumber = 2;
bool isWinner = 3;
uint32 profit = 4;
int64 index = 5;
int64 preIndex = 6;
} }
...@@ -224,6 +230,25 @@ message ReplyPBGameList { ...@@ -224,6 +230,25 @@ message ReplyPBGameList {
repeated PokerBull games = 1; repeated PokerBull games = 1;
} }
message QueryGuessGameInfo {
string gameId = 1;
string addr = 2;
int32 status = 3;
int64 index = 4;
}
message ReplyGuessGameInfo {
GuessGame game = 1;
}
message QueryGuessGameInfos {
repeated string gameIds = 1;
}
message ReplyGuessGameInfos {
repeated GuessGame games = 1;
}
message ReceiptPBGame { message ReceiptPBGame {
string gameId = 1; string gameId = 1;
int32 status = 2; int32 status = 2;
......
...@@ -93,11 +93,11 @@ func (c *Jrpc) GuessPublishTx(parm *pb.GuessPublishTxReq, result *interface{}) e ...@@ -93,11 +93,11 @@ func (c *Jrpc) GuessPublishTx(parm *pb.GuessPublishTxReq, result *interface{}) e
return nil return nil
} }
func (c *Jrpc) PokerBullQueryTx(parm *pb.PBQueryReq, result *interface{}) error { func (c *Jrpc) GuessQueryTx(parm *pb.PBQueryReq, result *interface{}) error {
if parm == nil { if parm == nil {
return types.ErrInvalidParam return types.ErrInvalidParam
} }
head := &pb.PBGameQuery{ head := &pb.GuessGameQuery{
GameId: parm.GameId, GameId: parm.GameId,
} }
reply, err := c.cli.Show(context.Background(), head) reply, err := c.cli.Show(context.Background(), head)
......
...@@ -6,21 +6,14 @@ package rpc ...@@ -6,21 +6,14 @@ package rpc
import ( import (
"context" "context"
"fmt"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
pb "github.com/33cn/plugin/plugin/dapp/guess/types" pb "github.com/33cn/plugin/plugin/dapp/guess/types"
"github.com/33cn/plugin/plugin/dapp/guess/executor"
) )
func (c *channelClient) GuessStart(ctx context.Context, head *pb.GuessGameStart) (*types.UnsignTx, error) { func (c *channelClient) GuessStart(ctx context.Context, head *pb.GuessGameStart) (*types.UnsignTx, error) {
if head.MaxBetsNumber > executor.MaxBetsNumber {
return nil, fmt.Errorf("Max Bets Number Should Be Maximum %d", executor.MaxBetsNumber)
}
val := &pb.GuessGameAction{ val := &pb.GuessGameAction{
Ty: pb.GuessGameActionStart, Ty: pb.GuessGameActionStart,
Value: &pb.GuessGameAction_Start{head}, Value: &pb.GuessGameAction_Start{head},
} }
tx, err := types.CreateFormatTx(pb.GuessX, types.Encode(val)) tx, err := types.CreateFormatTx(pb.GuessX, types.Encode(val))
if err != nil { if err != nil {
...@@ -69,12 +62,12 @@ func (c *channelClient) GuessPublish(ctx context.Context, head *pb.GuessGamePubl ...@@ -69,12 +62,12 @@ func (c *channelClient) GuessPublish(ctx context.Context, head *pb.GuessGamePubl
return &types.UnsignTx{Data: data}, nil return &types.UnsignTx{Data: data}, nil
} }
func (c *channelClient) Show(ctx context.Context, head *pb.PBGameQuery) (*types.UnsignTx, error) { func (c *channelClient) Show(ctx context.Context, head *pb.GuessGameQuery) (*types.UnsignTx, error) {
val := &pb.PBGameAction{ val := &pb.GuessGameAction{
Ty: pb.PBGameActionQuery, Ty: pb.GuessGameActionQuery,
Value: &pb.PBGameAction_Query{head}, Value: &pb.GuessGameAction_Query{head},
} }
tx, err := types.CreateFormatTx(pb.PokerBullX, types.Encode(val)) tx, err := types.CreateFormatTx(pb.GuessX, types.Encode(val))
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -13,10 +13,16 @@ const ( ...@@ -13,10 +13,16 @@ const (
GuessGameActionStart = iota + 1 GuessGameActionStart = iota + 1
GuessGameActionBet GuessGameActionBet
GuessGameActionStopBet
GuessGameActionAbort GuessGameActionAbort
GuessGameActionPublish GuessGameActionPublish
GuessGameActionTimeOut GuessGameActionQuery
GuessGameStatusStart = iota + 1
GuessGameStatusBet
GuessGameStatusStopBet
GuessGameStatusAbort
GuessGameStatusPublish
GuessGameStatusTimeOut
) )
const ( const (
...@@ -43,10 +49,6 @@ const ( ...@@ -43,10 +49,6 @@ const (
//建议用github的组织名称,或者用户名字开头, 再加上自己的插件的名字 //建议用github的组织名称,或者用户名字开头, 再加上自己的插件的名字
//如果发生重名,可以通过配置文件修改这些名字 //如果发生重名,可以通过配置文件修改这些名字
var ( var (
JRPCName = "pokerbull"
PokerBullX = "pokerbull"
ExecerPokerBull = []byte(PokerBullX)
JRPCName = "guess" JRPCName = "guess"
GuessX = "guess" GuessX = "guess"
ExecerGuess = []byte(GuessX) ExecerGuess = []byte(GuessX)
...@@ -58,4 +60,6 @@ const ( ...@@ -58,4 +60,6 @@ const (
FuncName_QueryGameById = "QueryGameById" FuncName_QueryGameById = "QueryGameById"
FuncName_QueryGameByAddr = "QueryGameByAddr" FuncName_QueryGameByAddr = "QueryGameByAddr"
FuncName_QueryGameByStatus = "QueryGameByStatus" FuncName_QueryGameByStatus = "QueryGameByStatus"
//FuncName_QueryGameByAdminAddr = "QueryGameByAdminAddr"
//FuncName_QueryGameByCategory = "QueryGameByCategory"
) )
...@@ -27,28 +27,30 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package ...@@ -27,28 +27,30 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type GuessGame struct { type GuessGame 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"` Status uint32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
StartTime int64 `protobuf:"varint,3,opt,name=startTime,proto3" json:"startTime,omitempty"` PreStatus uint32 `protobuf:"varint,3,opt,name=preStatus,proto3" json:"preStatus,omitempty"`
StartTxHash string `protobuf:"bytes,4,opt,name=startTxHash,proto3" json:"startTxHash,omitempty"` StartTime int64 `protobuf:"varint,4,opt,name=startTime,proto3" json:"startTime,omitempty"`
Topic string `protobuf:"bytes,5,opt,name=topic,proto3" json:"topic,omitempty"` StartTxHash string `protobuf:"bytes,5,opt,name=startTxHash,proto3" json:"startTxHash,omitempty"`
Category string `protobuf:"bytes,6,opt,name=category,proto3" json:"category,omitempty"` Topic string `protobuf:"bytes,6,opt,name=topic,proto3" json:"topic,omitempty"`
Options string `protobuf:"bytes,7,opt,name=options,proto3" json:"options,omitempty"` Category string `protobuf:"bytes,7,opt,name=category,proto3" json:"category,omitempty"`
MaxTime string `protobuf:"bytes,8,opt,name=maxTime,proto3" json:"maxTime,omitempty"` Options string `protobuf:"bytes,8,opt,name=options,proto3" json:"options,omitempty"`
MaxHeight int64 `protobuf:"varint,9,opt,name=maxHeight,proto3" json:"maxHeight,omitempty"` MaxTime string `protobuf:"bytes,9,opt,name=maxTime,proto3" json:"maxTime,omitempty"`
Symbol string `protobuf:"bytes,10,opt,name=symbol,proto3" json:"symbol,omitempty"` MaxHeight int64 `protobuf:"varint,10,opt,name=maxHeight,proto3" json:"maxHeight,omitempty"`
Exec string `protobuf:"bytes,11,opt,name=exec,proto3" json:"exec,omitempty"` Symbol string `protobuf:"bytes,11,opt,name=symbol,proto3" json:"symbol,omitempty"`
OneBet uint32 `protobuf:"varint,12,opt,name=oneBet,proto3" json:"oneBet,omitempty"` Exec string `protobuf:"bytes,12,opt,name=exec,proto3" json:"exec,omitempty"`
MaxBets uint32 `protobuf:"varint,13,opt,name=maxBets,proto3" json:"maxBets,omitempty"` OneBet uint32 `protobuf:"varint,13,opt,name=oneBet,proto3" json:"oneBet,omitempty"`
MaxBetsNumber uint32 `protobuf:"varint,14,opt,name=maxBetsNumber,proto3" json:"maxBetsNumber,omitempty"` MaxBets uint32 `protobuf:"varint,14,opt,name=maxBets,proto3" json:"maxBets,omitempty"`
Fee uint32 `protobuf:"varint,15,opt,name=fee,proto3" json:"fee,omitempty"` MaxBetsNumber uint32 `protobuf:"varint,15,opt,name=maxBetsNumber,proto3" json:"maxBetsNumber,omitempty"`
FeeAddr string `protobuf:"bytes,16,opt,name=feeAddr,proto3" json:"feeAddr,omitempty"` Fee uint32 `protobuf:"varint,16,opt,name=fee,proto3" json:"fee,omitempty"`
Expire string `protobuf:"bytes,17,opt,name=expire,proto3" json:"expire,omitempty"` FeeAddr string `protobuf:"bytes,17,opt,name=feeAddr,proto3" json:"feeAddr,omitempty"`
ExpireHeight int64 `protobuf:"varint,18,opt,name=expireHeight,proto3" json:"expireHeight,omitempty"` Expire string `protobuf:"bytes,18,opt,name=expire,proto3" json:"expire,omitempty"`
AdminAddr string `protobuf:"bytes,19,opt,name=adminAddr,proto3" json:"adminAddr,omitempty"` ExpireHeight int64 `protobuf:"varint,19,opt,name=expireHeight,proto3" json:"expireHeight,omitempty"`
BetsNumber uint32 `protobuf:"varint,20,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"` AdminAddr string `protobuf:"bytes,20,opt,name=adminAddr,proto3" json:"adminAddr,omitempty"`
Plays []*GuessPlayer `protobuf:"bytes,21,rep,name=plays,proto3" json:"plays,omitempty"` BetsNumber uint32 `protobuf:"varint,21,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"`
Result string `protobuf:"bytes,22,opt,name=result,proto3" json:"result,omitempty"` Plays []*GuessPlayer `protobuf:"bytes,22,rep,name=plays,proto3" json:"plays,omitempty"`
Bets []*GuessBet `protobuf:"bytes,23,rep,name=bets,proto3" json:"bets,omitempty"` Result string `protobuf:"bytes,23,opt,name=result,proto3" json:"result,omitempty"`
Index int64 `protobuf:"varint,24,opt,name=index,proto3" json:"index,omitempty"` Bets []*GuessBet `protobuf:"bytes,24,rep,name=bets,proto3" json:"bets,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"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
...@@ -93,6 +95,13 @@ func (m *GuessGame) GetStatus() uint32 { ...@@ -93,6 +95,13 @@ func (m *GuessGame) GetStatus() uint32 {
return 0 return 0
} }
func (m *GuessGame) GetPreStatus() uint32 {
if m != nil {
return m.PreStatus
}
return 0
}
func (m *GuessGame) GetStartTime() int64 { func (m *GuessGame) GetStartTime() int64 {
if m != nil { if m != nil {
return m.StartTime return m.StartTime
...@@ -247,6 +256,13 @@ func (m *GuessGame) GetIndex() int64 { ...@@ -247,6 +256,13 @@ func (m *GuessGame) GetIndex() int64 {
return 0 return 0
} }
func (m *GuessGame) GetPreIndex() int64 {
if m != nil {
return m.PreIndex
}
return 0
}
type GuessPlayer struct { type GuessPlayer struct {
Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"` Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
Bet *GuessBet `protobuf:"bytes,2,opt,name=bet,proto3" json:"bet,omitempty"` Bet *GuessBet `protobuf:"bytes,2,opt,name=bet,proto3" json:"bet,omitempty"`
...@@ -297,6 +313,10 @@ func (m *GuessPlayer) GetBet() *GuessBet { ...@@ -297,6 +313,10 @@ func (m *GuessPlayer) GetBet() *GuessBet {
type GuessBet struct { type GuessBet struct {
Option string `protobuf:"bytes,1,opt,name=option,proto3" json:"option,omitempty"` Option string `protobuf:"bytes,1,opt,name=option,proto3" json:"option,omitempty"`
BetsNumber uint32 `protobuf:"varint,2,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"` BetsNumber uint32 `protobuf:"varint,2,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"`
IsWinner bool `protobuf:"varint,3,opt,name=isWinner,proto3" json:"isWinner,omitempty"`
Profit uint32 `protobuf:"varint,4,opt,name=profit,proto3" json:"profit,omitempty"`
Index int64 `protobuf:"varint,5,opt,name=index,proto3" json:"index,omitempty"`
PreIndex int64 `protobuf:"varint,6,opt,name=preIndex,proto3" json:"preIndex,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:"-"`
...@@ -341,6 +361,34 @@ func (m *GuessBet) GetBetsNumber() uint32 { ...@@ -341,6 +361,34 @@ func (m *GuessBet) GetBetsNumber() uint32 {
return 0 return 0
} }
func (m *GuessBet) GetIsWinner() bool {
if m != nil {
return m.IsWinner
}
return false
}
func (m *GuessBet) GetProfit() uint32 {
if m != nil {
return m.Profit
}
return 0
}
func (m *GuessBet) GetIndex() int64 {
if m != nil {
return m.Index
}
return 0
}
func (m *GuessBet) GetPreIndex() int64 {
if m != nil {
return m.PreIndex
}
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"`
...@@ -2114,6 +2162,186 @@ func (m *ReplyPBGameList) GetGames() []*PokerBull { ...@@ -2114,6 +2162,186 @@ func (m *ReplyPBGameList) GetGames() []*PokerBull {
return nil return nil
} }
type QueryGuessGameInfo struct {
GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"`
Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`
Status int32 `protobuf:"varint,3,opt,name=status,proto3" json:"status,omitempty"`
Index int64 `protobuf:"varint,4,opt,name=index,proto3" json:"index,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *QueryGuessGameInfo) Reset() { *m = QueryGuessGameInfo{} }
func (m *QueryGuessGameInfo) String() string { return proto.CompactTextString(m) }
func (*QueryGuessGameInfo) ProtoMessage() {}
func (*QueryGuessGameInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{27}
}
func (m *QueryGuessGameInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_QueryGuessGameInfo.Unmarshal(m, b)
}
func (m *QueryGuessGameInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_QueryGuessGameInfo.Marshal(b, m, deterministic)
}
func (m *QueryGuessGameInfo) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryGuessGameInfo.Merge(m, src)
}
func (m *QueryGuessGameInfo) XXX_Size() int {
return xxx_messageInfo_QueryGuessGameInfo.Size(m)
}
func (m *QueryGuessGameInfo) XXX_DiscardUnknown() {
xxx_messageInfo_QueryGuessGameInfo.DiscardUnknown(m)
}
var xxx_messageInfo_QueryGuessGameInfo proto.InternalMessageInfo
func (m *QueryGuessGameInfo) GetGameId() string {
if m != nil {
return m.GameId
}
return ""
}
func (m *QueryGuessGameInfo) GetAddr() string {
if m != nil {
return m.Addr
}
return ""
}
func (m *QueryGuessGameInfo) GetStatus() int32 {
if m != nil {
return m.Status
}
return 0
}
func (m *QueryGuessGameInfo) GetIndex() int64 {
if m != nil {
return m.Index
}
return 0
}
type ReplyGuessGameInfo struct {
Game *GuessGame `protobuf:"bytes,1,opt,name=game,proto3" json:"game,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ReplyGuessGameInfo) Reset() { *m = ReplyGuessGameInfo{} }
func (m *ReplyGuessGameInfo) String() string { return proto.CompactTextString(m) }
func (*ReplyGuessGameInfo) ProtoMessage() {}
func (*ReplyGuessGameInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{28}
}
func (m *ReplyGuessGameInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReplyGuessGameInfo.Unmarshal(m, b)
}
func (m *ReplyGuessGameInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReplyGuessGameInfo.Marshal(b, m, deterministic)
}
func (m *ReplyGuessGameInfo) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReplyGuessGameInfo.Merge(m, src)
}
func (m *ReplyGuessGameInfo) XXX_Size() int {
return xxx_messageInfo_ReplyGuessGameInfo.Size(m)
}
func (m *ReplyGuessGameInfo) XXX_DiscardUnknown() {
xxx_messageInfo_ReplyGuessGameInfo.DiscardUnknown(m)
}
var xxx_messageInfo_ReplyGuessGameInfo proto.InternalMessageInfo
func (m *ReplyGuessGameInfo) GetGame() *GuessGame {
if m != nil {
return m.Game
}
return nil
}
type QueryGuessGameInfos struct {
GameIds []string `protobuf:"bytes,1,rep,name=gameIds,proto3" json:"gameIds,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *QueryGuessGameInfos) Reset() { *m = QueryGuessGameInfos{} }
func (m *QueryGuessGameInfos) String() string { return proto.CompactTextString(m) }
func (*QueryGuessGameInfos) ProtoMessage() {}
func (*QueryGuessGameInfos) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{29}
}
func (m *QueryGuessGameInfos) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_QueryGuessGameInfos.Unmarshal(m, b)
}
func (m *QueryGuessGameInfos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_QueryGuessGameInfos.Marshal(b, m, deterministic)
}
func (m *QueryGuessGameInfos) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryGuessGameInfos.Merge(m, src)
}
func (m *QueryGuessGameInfos) XXX_Size() int {
return xxx_messageInfo_QueryGuessGameInfos.Size(m)
}
func (m *QueryGuessGameInfos) XXX_DiscardUnknown() {
xxx_messageInfo_QueryGuessGameInfos.DiscardUnknown(m)
}
var xxx_messageInfo_QueryGuessGameInfos proto.InternalMessageInfo
func (m *QueryGuessGameInfos) GetGameIds() []string {
if m != nil {
return m.GameIds
}
return nil
}
type ReplyGuessGameInfos struct {
Games []*GuessGame `protobuf:"bytes,1,rep,name=games,proto3" json:"games,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ReplyGuessGameInfos) Reset() { *m = ReplyGuessGameInfos{} }
func (m *ReplyGuessGameInfos) String() string { return proto.CompactTextString(m) }
func (*ReplyGuessGameInfos) ProtoMessage() {}
func (*ReplyGuessGameInfos) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{30}
}
func (m *ReplyGuessGameInfos) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReplyGuessGameInfos.Unmarshal(m, b)
}
func (m *ReplyGuessGameInfos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReplyGuessGameInfos.Marshal(b, m, deterministic)
}
func (m *ReplyGuessGameInfos) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReplyGuessGameInfos.Merge(m, src)
}
func (m *ReplyGuessGameInfos) XXX_Size() int {
return xxx_messageInfo_ReplyGuessGameInfos.Size(m)
}
func (m *ReplyGuessGameInfos) XXX_DiscardUnknown() {
xxx_messageInfo_ReplyGuessGameInfos.DiscardUnknown(m)
}
var xxx_messageInfo_ReplyGuessGameInfos proto.InternalMessageInfo
func (m *ReplyGuessGameInfos) GetGames() []*GuessGame {
if m != nil {
return m.Games
}
return nil
}
type ReceiptPBGame struct { type ReceiptPBGame 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 int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"` Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
...@@ -2134,7 +2362,7 @@ func (m *ReceiptPBGame) Reset() { *m = ReceiptPBGame{} } ...@@ -2134,7 +2362,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{27} return fileDescriptor_7574406c5d3430e8, []int{31}
} }
func (m *ReceiptPBGame) XXX_Unmarshal(b []byte) error { func (m *ReceiptPBGame) XXX_Unmarshal(b []byte) error {
...@@ -2239,7 +2467,7 @@ func (m *ReceiptGuessGame) Reset() { *m = ReceiptGuessGame{} } ...@@ -2239,7 +2467,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{28} return fileDescriptor_7574406c5d3430e8, []int{32}
} }
func (m *ReceiptGuessGame) XXX_Unmarshal(b []byte) error { func (m *ReceiptGuessGame) XXX_Unmarshal(b []byte) error {
...@@ -2312,7 +2540,7 @@ func (m *GuessStartTxReq) Reset() { *m = GuessStartTxReq{} } ...@@ -2312,7 +2540,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{29} return fileDescriptor_7574406c5d3430e8, []int{33}
} }
func (m *GuessStartTxReq) XXX_Unmarshal(b []byte) error { func (m *GuessStartTxReq) XXX_Unmarshal(b []byte) error {
...@@ -2444,7 +2672,7 @@ func (m *GuessBetTxReq) Reset() { *m = GuessBetTxReq{} } ...@@ -2444,7 +2672,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{30} return fileDescriptor_7574406c5d3430e8, []int{34}
} }
func (m *GuessBetTxReq) XXX_Unmarshal(b []byte) error { func (m *GuessBetTxReq) XXX_Unmarshal(b []byte) error {
...@@ -2497,7 +2725,7 @@ func (m *GuessAbortTxReq) Reset() { *m = GuessAbortTxReq{} } ...@@ -2497,7 +2725,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{31} return fileDescriptor_7574406c5d3430e8, []int{35}
} }
func (m *GuessAbortTxReq) XXX_Unmarshal(b []byte) error { func (m *GuessAbortTxReq) XXX_Unmarshal(b []byte) error {
...@@ -2537,7 +2765,7 @@ func (m *GuessPublishTxReq) Reset() { *m = GuessPublishTxReq{} } ...@@ -2537,7 +2765,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{32} return fileDescriptor_7574406c5d3430e8, []int{36}
} }
func (m *GuessPublishTxReq) XXX_Unmarshal(b []byte) error { func (m *GuessPublishTxReq) XXX_Unmarshal(b []byte) error {
...@@ -2584,7 +2812,7 @@ func (m *PBContinueTxReq) Reset() { *m = PBContinueTxReq{} } ...@@ -2584,7 +2812,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{33} return fileDescriptor_7574406c5d3430e8, []int{37}
} }
func (m *PBContinueTxReq) XXX_Unmarshal(b []byte) error { func (m *PBContinueTxReq) XXX_Unmarshal(b []byte) error {
...@@ -2631,7 +2859,7 @@ func (m *PBQuitTxReq) Reset() { *m = PBQuitTxReq{} } ...@@ -2631,7 +2859,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{34} return fileDescriptor_7574406c5d3430e8, []int{38}
} }
func (m *PBQuitTxReq) XXX_Unmarshal(b []byte) error { func (m *PBQuitTxReq) XXX_Unmarshal(b []byte) error {
...@@ -2678,7 +2906,7 @@ func (m *PBQueryReq) Reset() { *m = PBQueryReq{} } ...@@ -2678,7 +2906,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{35} return fileDescriptor_7574406c5d3430e8, []int{39}
} }
func (m *PBQueryReq) XXX_Unmarshal(b []byte) error { func (m *PBQueryReq) XXX_Unmarshal(b []byte) error {
...@@ -2727,7 +2955,7 @@ func (m *GuessGameRecord) Reset() { *m = GuessGameRecord{} } ...@@ -2727,7 +2955,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{36} return fileDescriptor_7574406c5d3430e8, []int{40}
} }
func (m *GuessGameRecord) XXX_Unmarshal(b []byte) error { func (m *GuessGameRecord) XXX_Unmarshal(b []byte) error {
...@@ -2781,7 +3009,7 @@ func (m *GuessGameIndexRecord) Reset() { *m = GuessGameIndexRecord{} } ...@@ -2781,7 +3009,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{37} return fileDescriptor_7574406c5d3430e8, []int{41}
} }
func (m *GuessGameIndexRecord) XXX_Unmarshal(b []byte) error { func (m *GuessGameIndexRecord) XXX_Unmarshal(b []byte) error {
...@@ -2827,7 +3055,7 @@ func (m *GuessGameRecords) Reset() { *m = GuessGameRecords{} } ...@@ -2827,7 +3055,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{38} return fileDescriptor_7574406c5d3430e8, []int{42}
} }
func (m *GuessGameRecords) XXX_Unmarshal(b []byte) error { func (m *GuessGameRecords) XXX_Unmarshal(b []byte) error {
...@@ -2883,6 +3111,10 @@ func init() { ...@@ -2883,6 +3111,10 @@ func init() {
proto.RegisterType((*ReplyPBGame)(nil), "types.ReplyPBGame") proto.RegisterType((*ReplyPBGame)(nil), "types.ReplyPBGame")
proto.RegisterType((*QueryPBGameInfos)(nil), "types.QueryPBGameInfos") proto.RegisterType((*QueryPBGameInfos)(nil), "types.QueryPBGameInfos")
proto.RegisterType((*ReplyPBGameList)(nil), "types.ReplyPBGameList") proto.RegisterType((*ReplyPBGameList)(nil), "types.ReplyPBGameList")
proto.RegisterType((*QueryGuessGameInfo)(nil), "types.QueryGuessGameInfo")
proto.RegisterType((*ReplyGuessGameInfo)(nil), "types.ReplyGuessGameInfo")
proto.RegisterType((*QueryGuessGameInfos)(nil), "types.QueryGuessGameInfos")
proto.RegisterType((*ReplyGuessGameInfos)(nil), "types.ReplyGuessGameInfos")
proto.RegisterType((*ReceiptPBGame)(nil), "types.ReceiptPBGame") proto.RegisterType((*ReceiptPBGame)(nil), "types.ReceiptPBGame")
proto.RegisterType((*ReceiptGuessGame)(nil), "types.ReceiptGuessGame") proto.RegisterType((*ReceiptGuessGame)(nil), "types.ReceiptGuessGame")
proto.RegisterType((*GuessStartTxReq)(nil), "types.GuessStartTxReq") proto.RegisterType((*GuessStartTxReq)(nil), "types.GuessStartTxReq")
...@@ -2900,106 +3132,112 @@ func init() { ...@@ -2900,106 +3132,112 @@ 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{
// 1573 bytes of a gzipped FileDescriptorProto // 1678 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0x5f, 0x6f, 0x13, 0x47, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0xcd, 0x6e, 0xdb, 0xc6,
0x10, 0x8f, 0x7d, 0x3e, 0xff, 0x19, 0xc7, 0x4e, 0xb2, 0x40, 0x58, 0xa1, 0xaa, 0x4a, 0x8f, 0x14, 0x13, 0xb7, 0x3e, 0xa8, 0x8f, 0x91, 0x25, 0xdb, 0xeb, 0xc4, 0xe1, 0xdf, 0xf8, 0xa3, 0x70, 0x19,
0x42, 0x55, 0x50, 0x95, 0x48, 0xb4, 0xb4, 0x52, 0xa5, 0x1c, 0x48, 0x04, 0x09, 0x21, 0xb3, 0xa1, 0x37, 0x71, 0x8a, 0x26, 0x2d, 0x6c, 0x20, 0x6d, 0x52, 0xb4, 0x80, 0x95, 0x00, 0x71, 0x80, 0x20,
0xa2, 0xaf, 0x17, 0x7b, 0x09, 0x27, 0xec, 0x3b, 0xe7, 0xee, 0x0c, 0xf1, 0x5b, 0xd5, 0x7e, 0x82, 0x50, 0xd6, 0x29, 0xd2, 0x2b, 0x2d, 0xad, 0x1d, 0x22, 0x12, 0x49, 0x93, 0x54, 0x62, 0xdd, 0x8a,
0x3e, 0xf4, 0x13, 0x54, 0xea, 0xb7, 0xea, 0x73, 0x3f, 0x42, 0x5f, 0xab, 0x9d, 0xd9, 0xf5, 0xed, 0xf6, 0x09, 0x7a, 0xe8, 0x13, 0xf4, 0xd2, 0x97, 0x2a, 0xd0, 0x5b, 0x1f, 0xa1, 0xd7, 0x62, 0x67,
0x5d, 0xce, 0x86, 0x20, 0xde, 0xfa, 0xb6, 0xb3, 0x33, 0x3b, 0x3b, 0x7f, 0x77, 0x7e, 0x77, 0xd0, 0x76, 0xc9, 0x25, 0x45, 0xc9, 0x71, 0xd0, 0x9e, 0x7a, 0xdb, 0xd9, 0xd9, 0xdd, 0xf9, 0x9e, 0xf9,
0x3d, 0x9d, 0xc9, 0x34, 0xbd, 0x37, 0x4d, 0xe2, 0x2c, 0x66, 0x6e, 0x36, 0x9f, 0xca, 0xf4, 0xc6, 0x91, 0xd0, 0x39, 0x9b, 0x8a, 0x38, 0xbe, 0x17, 0x46, 0x41, 0x12, 0x30, 0x2b, 0x99, 0x85, 0x22,
0x56, 0x96, 0x04, 0x51, 0x1a, 0x0c, 0xb3, 0x30, 0x8e, 0x88, 0xe3, 0xfd, 0xe5, 0x42, 0xe7, 0xb1, 0xde, 0xde, 0x48, 0x22, 0xd7, 0x8f, 0xdd, 0x61, 0xe2, 0x05, 0x3e, 0x71, 0x9c, 0x3f, 0x2c, 0x68,
0x92, 0x7c, 0x1c, 0x4c, 0x24, 0xdb, 0x86, 0xe6, 0x69, 0x30, 0x91, 0x4f, 0x46, 0xbc, 0xb6, 0x53, 0x3f, 0x91, 0x27, 0x9f, 0xb8, 0x13, 0xc1, 0xb6, 0xa0, 0x71, 0xe6, 0x4e, 0xc4, 0xd3, 0x91, 0x5d,
0xdb, 0xeb, 0x08, 0x4d, 0xa9, 0xfd, 0x34, 0x0b, 0xb2, 0x59, 0xca, 0xeb, 0x3b, 0xb5, 0xbd, 0x9e, 0xd9, 0xa9, 0xec, 0xb5, 0xb9, 0xa2, 0xe4, 0x7e, 0x9c, 0xb8, 0xc9, 0x34, 0xb6, 0xab, 0x3b, 0x95,
0xd0, 0x14, 0xfb, 0x0c, 0x3a, 0x69, 0x16, 0x24, 0xd9, 0x8b, 0x70, 0x22, 0xb9, 0xb3, 0x53, 0xdb, 0xbd, 0x2e, 0x57, 0x14, 0xfb, 0x3f, 0xb4, 0xc3, 0x48, 0x1c, 0x13, 0xab, 0x86, 0xac, 0x6c, 0x43,
0x73, 0x44, 0xbe, 0xc1, 0x76, 0xa0, 0x4b, 0xc4, 0xf9, 0x51, 0x90, 0xbe, 0xe6, 0x0d, 0x54, 0x69, 0x72, 0xe3, 0xc4, 0x8d, 0x92, 0x97, 0xde, 0x44, 0xd8, 0xf5, 0x9d, 0xca, 0x5e, 0x8d, 0x67, 0x1b,
0x6f, 0xb1, 0xab, 0xe0, 0x66, 0xf1, 0x34, 0x1c, 0x72, 0x17, 0x79, 0x44, 0xb0, 0x1b, 0xd0, 0x1e, 0x6c, 0x07, 0x3a, 0x44, 0x5c, 0x1c, 0xb9, 0xf1, 0x6b, 0xdb, 0x42, 0x81, 0xe6, 0x16, 0xbb, 0x06,
0x06, 0x99, 0x3c, 0x8d, 0x93, 0x39, 0x6f, 0x22, 0x63, 0x41, 0x33, 0x0e, 0xad, 0x78, 0xaa, 0xec, 0x56, 0x12, 0x84, 0xde, 0xd0, 0x6e, 0x20, 0x8f, 0x08, 0xb6, 0x0d, 0xad, 0xa1, 0x9b, 0x88, 0xb3,
0x4f, 0x79, 0x0b, 0x59, 0x86, 0x54, 0x9c, 0x49, 0x70, 0x8e, 0x96, 0xb4, 0x89, 0xa3, 0x49, 0x65, 0x20, 0x9a, 0xd9, 0x4d, 0x64, 0xa4, 0x34, 0xb3, 0xa1, 0x19, 0x84, 0xd2, 0xba, 0xd8, 0x6e, 0x21,
0xe5, 0x24, 0x38, 0x3f, 0x92, 0xe1, 0xe9, 0xeb, 0x8c, 0x77, 0xc8, 0xca, 0xc5, 0x06, 0xfa, 0x36, 0x4b, 0x93, 0x92, 0x33, 0x71, 0x2f, 0x50, 0x93, 0x36, 0x71, 0x14, 0x29, 0xb5, 0x9c, 0xb8, 0x17,
0x9f, 0x9c, 0xc4, 0x63, 0x0e, 0xe4, 0x33, 0x51, 0x8c, 0x41, 0x43, 0x9e, 0xcb, 0x21, 0xef, 0xe2, 0x47, 0xc2, 0x3b, 0x7b, 0x9d, 0xd8, 0x40, 0x5a, 0xa6, 0x1b, 0x68, 0xf9, 0x6c, 0x72, 0x12, 0x8c,
0x2e, 0xae, 0x95, 0x6c, 0x1c, 0x49, 0x5f, 0x66, 0x7c, 0x9d, 0xe2, 0x40, 0x94, 0xbe, 0xdb, 0x97, 0xed, 0x0e, 0x79, 0x84, 0x28, 0xc6, 0xa0, 0x2e, 0x2e, 0xc4, 0xd0, 0x5e, 0xc5, 0x5d, 0x5c, 0xcb,
0x59, 0xca, 0x7b, 0xc8, 0x30, 0x24, 0xdb, 0x85, 0x9e, 0x5e, 0x3e, 0x9b, 0x4d, 0x4e, 0x64, 0xc2, 0xb3, 0x81, 0x2f, 0xfa, 0x22, 0xb1, 0xbb, 0xe4, 0x25, 0xa2, 0x94, 0xec, 0xbe, 0x48, 0x62, 0xbb,
0xfb, 0xc8, 0x2f, 0x6e, 0xb2, 0x4d, 0x70, 0x5e, 0x49, 0xc9, 0x37, 0x90, 0xa7, 0x96, 0x4a, 0xe3, 0x87, 0x0c, 0x4d, 0xb2, 0x5d, 0xe8, 0xaa, 0xe5, 0xf3, 0xe9, 0xe4, 0x44, 0x44, 0xf6, 0x1a, 0xf2,
0x2b, 0x29, 0x0f, 0x47, 0xa3, 0x84, 0x6f, 0x92, 0x37, 0x9a, 0x54, 0x36, 0xc8, 0xf3, 0x69, 0x98, 0xf3, 0x9b, 0x6c, 0x1d, 0x6a, 0xa7, 0x42, 0xd8, 0xeb, 0xc8, 0x93, 0x4b, 0xf9, 0xe2, 0xa9, 0x10,
0x48, 0xbe, 0x45, 0xf6, 0x12, 0xc5, 0x3c, 0x58, 0xa7, 0x95, 0x76, 0x94, 0xa1, 0xa3, 0x85, 0x3d, 0x87, 0xa3, 0x51, 0x64, 0x6f, 0x90, 0x35, 0x8a, 0x94, 0x3a, 0x88, 0x8b, 0xd0, 0x8b, 0x84, 0xcd,
0x15, 0x89, 0x60, 0x34, 0x09, 0x23, 0xd4, 0x7b, 0x05, 0x8f, 0xe7, 0x1b, 0xec, 0x73, 0x80, 0x93, 0x48, 0x5f, 0xa2, 0x98, 0x03, 0xab, 0xb4, 0x52, 0x86, 0x6e, 0xa2, 0xa1, 0xb9, 0x3d, 0xe9, 0x09,
0xdc, 0xd0, 0xab, 0x68, 0x8c, 0xb5, 0xc3, 0xf6, 0xc0, 0x9d, 0x8e, 0x83, 0x79, 0xca, 0xaf, 0xed, 0x77, 0x34, 0xf1, 0x7c, 0x7c, 0xf7, 0x1a, 0x5e, 0xcf, 0x36, 0xd8, 0x47, 0x00, 0x27, 0x99, 0xa2,
0x38, 0x7b, 0xdd, 0x7d, 0x76, 0x0f, 0xab, 0xea, 0x1e, 0x96, 0xcf, 0x60, 0x1c, 0xcc, 0x65, 0x22, 0xd7, 0x51, 0x19, 0x63, 0x87, 0xed, 0x81, 0x15, 0x8e, 0xdd, 0x59, 0x6c, 0x6f, 0xed, 0xd4, 0xf6,
0x48, 0x40, 0xd9, 0x98, 0xc8, 0x74, 0x36, 0xce, 0xf8, 0x36, 0xd9, 0x48, 0x14, 0xbb, 0x09, 0x0d, 0x3a, 0xfb, 0xec, 0x1e, 0xe6, 0xdc, 0x3d, 0x4c, 0xae, 0xc1, 0xd8, 0x9d, 0x89, 0x88, 0xd3, 0x01,
0xa5, 0x8f, 0x5f, 0x47, 0x05, 0x1b, 0xb6, 0x02, 0x5f, 0x66, 0x02, 0x99, 0xaa, 0x28, 0xc2, 0x68, 0xa9, 0x63, 0x24, 0xe2, 0xe9, 0x38, 0xb1, 0x6f, 0x90, 0x8e, 0x44, 0xb1, 0x9b, 0x50, 0x97, 0xef,
0x24, 0xcf, 0x39, 0x47, 0x0f, 0x88, 0xf0, 0x1e, 0x41, 0xd7, 0xba, 0x48, 0x65, 0x27, 0x50, 0x4e, 0xd9, 0x36, 0x3e, 0xb0, 0x66, 0x3e, 0xd0, 0x17, 0x09, 0x47, 0xa6, 0x4c, 0x0a, 0xcf, 0x1f, 0x89,
0x50, 0x9d, 0xe2, 0x9a, 0x7d, 0x01, 0xce, 0x89, 0xcc, 0xb0, 0x44, 0x2b, 0x94, 0x2b, 0x9e, 0xe7, 0x0b, 0xfb, 0x7f, 0x68, 0x01, 0x11, 0x32, 0x29, 0xc2, 0x48, 0x3c, 0x45, 0xc6, 0x36, 0x32, 0x52,
0x43, 0xdb, 0x6c, 0x60, 0x32, 0xb1, 0x76, 0x4c, 0xb1, 0x13, 0x55, 0x0a, 0x43, 0xbd, 0x1c, 0x06, 0xda, 0x79, 0x0c, 0x1d, 0x43, 0x09, 0x19, 0x39, 0x57, 0x1a, 0x48, 0x19, 0x8e, 0x6b, 0xf6, 0x31,
0xef, 0x5f, 0x07, 0x3a, 0x83, 0xf8, 0x8d, 0x4c, 0xfc, 0xd9, 0x78, 0xfc, 0x81, 0x2d, 0xe3, 0x7e, 0xd4, 0x4e, 0x44, 0x82, 0xc9, 0x5d, 0x22, 0x58, 0xf2, 0x9c, 0xdf, 0x2a, 0xd0, 0xd2, 0x3b, 0x18,
0xca, 0x96, 0x79, 0x1b, 0x8c, 0x67, 0x12, 0x5b, 0xc6, 0x11, 0x44, 0xb0, 0x5d, 0x70, 0xa7, 0xca, 0x69, 0x4c, 0x2c, 0x5d, 0x27, 0x44, 0x15, 0x7c, 0x54, 0x9d, 0xf3, 0xd1, 0x36, 0xb4, 0xbc, 0xf8,
0x24, 0xec, 0x97, 0xee, 0x7e, 0x5f, 0x3b, 0x3f, 0xf0, 0xd1, 0x50, 0x41, 0x4c, 0x76, 0x07, 0x5a, 0x95, 0xe7, 0xfb, 0x22, 0xc2, 0x72, 0x69, 0xf1, 0x94, 0x96, 0x6f, 0x86, 0x51, 0x70, 0xea, 0x25,
0x53, 0x0c, 0x9f, 0x6a, 0x1e, 0x3b, 0x03, 0x03, 0x5f, 0xe7, 0xcf, 0xf0, 0x95, 0x99, 0xb4, 0x7c, 0x58, 0x2a, 0x5d, 0xae, 0xa8, 0xcc, 0x60, 0x6b, 0x91, 0xc1, 0x8d, 0x82, 0xc1, 0x7f, 0xd5, 0xa0,
0x36, 0x9b, 0x60, 0x3f, 0xb9, 0x22, 0xdf, 0x50, 0x8a, 0x28, 0xa3, 0x29, 0xef, 0x94, 0x14, 0x09, 0x3d, 0x08, 0xde, 0x88, 0xa8, 0x3f, 0x1d, 0x8f, 0xdf, 0xb3, 0xa6, 0x2d, 0xb3, 0xa6, 0xb3, 0xaa,
0xdc, 0x17, 0x86, 0x9f, 0x67, 0x13, 0xac, 0x6c, 0xa2, 0xfa, 0x44, 0xbe, 0x7d, 0x82, 0x9c, 0x2e, 0xad, 0x5d, 0x52, 0xb5, 0xf5, 0xd2, 0xaa, 0x7d, 0xeb, 0x8e, 0xa7, 0x42, 0xeb, 0x8b, 0x04, 0xdb,
0x45, 0x61, 0xb1, 0xa1, 0x1e, 0x80, 0xb3, 0x59, 0x48, 0x21, 0x5a, 0x47, 0xe6, 0x82, 0x56, 0xd9, 0x05, 0x2b, 0x94, 0x2a, 0xa1, 0xb2, 0x9d, 0xfd, 0x9e, 0xf2, 0xf1, 0xa0, 0x8f, 0x8a, 0x72, 0x62,
0xc1, 0x35, 0x05, 0xa8, 0x87, 0x01, 0xb2, 0x76, 0x14, 0x7f, 0x24, 0x83, 0xb1, 0x4c, 0xb0, 0xc6, 0xb2, 0x3b, 0xd0, 0x0c, 0x31, 0x4a, 0xb1, 0xdd, 0xcc, 0x25, 0xc1, 0xa0, 0xaf, 0x52, 0x48, 0xf3,
0xfb, 0xc4, 0xcf, 0x77, 0xd4, 0xcd, 0x61, 0xfa, 0x32, 0x08, 0xb3, 0x30, 0x3a, 0xc5, 0x86, 0x6b, 0xb1, 0xf5, 0xe0, 0xf2, 0xf9, 0x74, 0x82, 0xc5, 0x6e, 0xf1, 0x6c, 0x43, 0x3e, 0x44, 0x49, 0x15,
0x8b, 0x7c, 0x43, 0xdb, 0x75, 0x4c, 0x89, 0xdb, 0xd4, 0x6e, 0x9b, 0x0d, 0xef, 0xd7, 0x1a, 0x34, 0xdb, 0xed, 0xc2, 0x43, 0x1c, 0xf7, 0xb9, 0xe6, 0x67, 0xfe, 0x05, 0xd3, 0xbf, 0xd4, 0xd9, 0xde,
0x07, 0xfe, 0x51, 0x10, 0x8d, 0x94, 0x5b, 0xc3, 0x20, 0x19, 0xa5, 0xbc, 0xb6, 0xe3, 0xec, 0xb9, 0x92, 0x83, 0x3b, 0xe4, 0x85, 0x74, 0x43, 0x7a, 0xff, 0x7c, 0xea, 0x91, 0x8b, 0x56, 0xc9, 0xfb,
0x82, 0x08, 0xab, 0xee, 0x75, 0xd2, 0x75, 0xdd, 0x73, 0x68, 0xa9, 0x0a, 0x95, 0x69, 0x8a, 0x29, 0x9a, 0x96, 0x39, 0x80, 0x6b, 0x72, 0x50, 0x17, 0x1d, 0x64, 0xec, 0x48, 0xfe, 0x48, 0xb8, 0x63,
0xef, 0x08, 0x43, 0x62, 0x78, 0xd2, 0x97, 0x61, 0x84, 0xa9, 0x6e, 0x0b, 0x22, 0x54, 0x00, 0xc6, 0x11, 0x61, 0x99, 0xf5, 0x88, 0x9f, 0xed, 0x48, 0xc9, 0x5e, 0xfc, 0xca, 0xf5, 0x12, 0xcf, 0x3f,
0xf2, 0xad, 0x4c, 0x82, 0x53, 0xca, 0xb3, 0x2b, 0x16, 0xb4, 0xf7, 0x0e, 0xda, 0x26, 0x5d, 0xec, 0xc3, 0x7e, 0xd0, 0xe2, 0xd9, 0x46, 0xbe, 0xe3, 0xae, 0x2b, 0xb3, 0xf5, 0x86, 0xf3, 0x63, 0x05,
0x26, 0xb8, 0xaf, 0x83, 0x48, 0x5b, 0xd1, 0xdd, 0xef, 0x2d, 0xb2, 0xa0, 0x6c, 0x14, 0xc4, 0xb3, 0x1a, 0x83, 0xfe, 0x91, 0xeb, 0x8f, 0xa4, 0x59, 0x43, 0x37, 0x1a, 0xc5, 0x76, 0x65, 0xa7, 0xb6,
0x2f, 0xaf, 0x17, 0x2f, 0xdf, 0x86, 0x66, 0x46, 0x71, 0xa4, 0x42, 0xd4, 0x94, 0x32, 0x2a, 0x91, 0x67, 0x71, 0x22, 0x8c, 0xd2, 0x53, 0x41, 0x57, 0xa5, 0x67, 0x43, 0x53, 0x16, 0x82, 0x88, 0xa9,
0xc1, 0x68, 0x6e, 0x8c, 0x42, 0xc2, 0xfb, 0xb3, 0xa6, 0x6e, 0x16, 0xa6, 0x93, 0x3f, 0xe0, 0xe6, 0x8d, 0xb7, 0xb9, 0x26, 0xd1, 0x3d, 0x32, 0x45, 0x31, 0xd4, 0x2d, 0x4e, 0x84, 0x74, 0xc0, 0x58,
0x6d, 0x68, 0xbe, 0x0b, 0xa3, 0x48, 0x77, 0x51, 0x47, 0x68, 0xaa, 0xe0, 0x9e, 0x53, 0x74, 0x4f, 0xbc, 0x15, 0x91, 0x7b, 0x46, 0x71, 0xb6, 0x78, 0x4a, 0x3b, 0xef, 0xa0, 0xa5, 0xc3, 0xc5, 0x6e,
0x9d, 0xa1, 0x6c, 0xe9, 0xe2, 0xd7, 0x14, 0xbb, 0x05, 0x7d, 0x5a, 0x3d, 0x2d, 0x06, 0xa6, 0xb4, 0x82, 0xf5, 0xda, 0xf5, 0x95, 0x16, 0x9d, 0xfd, 0x6e, 0x1a, 0x05, 0xa9, 0x23, 0x27, 0x9e, 0x29,
0xeb, 0x3d, 0x80, 0x96, 0xae, 0xfa, 0x25, 0x39, 0xe2, 0xd0, 0x9a, 0xc6, 0x61, 0x94, 0x69, 0xab, 0xbc, 0x9a, 0x17, 0xbe, 0x05, 0x8d, 0x84, 0xfc, 0x48, 0x89, 0xa8, 0x28, 0xa9, 0x54, 0x24, 0xdc,
0x5c, 0x61, 0x48, 0xef, 0xef, 0x1a, 0xac, 0x0f, 0x7c, 0x35, 0x08, 0x0f, 0x71, 0x44, 0xb2, 0xaf, 0xd1, 0x4c, 0x2b, 0x85, 0x84, 0xf3, 0x6b, 0x45, 0x4a, 0xe6, 0xba, 0x99, 0xbc, 0x87, 0xe4, 0x2d,
0xc0, 0xc5, 0xd6, 0xc3, 0xd6, 0xce, 0x1f, 0x3c, 0x92, 0x39, 0x56, 0x9c, 0xa3, 0x35, 0x41, 0x22, 0x68, 0xbc, 0xa3, 0x6a, 0x24, 0xc1, 0x8a, 0xca, 0x99, 0x57, 0xcb, 0x9b, 0x27, 0xef, 0x50, 0xb4,
0xec, 0x00, 0xda, 0xc3, 0x38, 0xca, 0xc2, 0x68, 0x26, 0xf5, 0x0b, 0x74, 0xad, 0x20, 0xfe, 0x50, 0x54, 0xf2, 0x2b, 0x8a, 0xdd, 0x82, 0x1e, 0xad, 0x9e, 0xe5, 0x1d, 0x53, 0xd8, 0x75, 0x1e, 0x40,
0x33, 0x8f, 0xd6, 0xc4, 0x42, 0x90, 0xdd, 0x86, 0x86, 0x2a, 0x5d, 0x0c, 0x42, 0x77, 0x7f, 0xab, 0x53, 0x65, 0xfd, 0x82, 0x18, 0xd9, 0xd0, 0x0c, 0x03, 0xcf, 0x4f, 0x94, 0x56, 0x16, 0xd7, 0xa4,
0x70, 0xe0, 0xf9, 0x2c, 0x54, 0xea, 0x51, 0x40, 0x59, 0x72, 0x36, 0x93, 0x09, 0x65, 0xa4, 0x6c, 0xf3, 0x7b, 0x05, 0x56, 0x07, 0x7d, 0x39, 0xa9, 0x0f, 0x71, 0x86, 0xb3, 0x4f, 0xc1, 0xc2, 0xd2,
0xc9, 0x73, 0xc5, 0x51, 0x96, 0xa0, 0x08, 0xeb, 0x43, 0x3d, 0x9b, 0x63, 0xbb, 0xb9, 0xa2, 0x9e, 0xc3, 0xd2, 0xce, 0x7a, 0x2e, 0x9d, 0x39, 0x96, 0x9c, 0xa3, 0x15, 0x4e, 0x47, 0xd8, 0x01, 0xb4,
0xcd, 0xfd, 0x96, 0x7e, 0x31, 0xbc, 0x43, 0xe8, 0x5a, 0xa6, 0xe7, 0x2f, 0x49, 0xcd, 0x7e, 0x49, 0x86, 0x81, 0x9f, 0x78, 0xfe, 0x54, 0xa8, 0x46, 0x77, 0x3d, 0x77, 0xfc, 0x91, 0x62, 0x1e, 0xad,
0x0a, 0x8d, 0x5f, 0x2f, 0x35, 0xbe, 0xb7, 0x07, 0xfd, 0xa2, 0x3b, 0xcb, 0xde, 0x3f, 0x6f, 0x17, 0xf0, 0xf4, 0x20, 0xbb, 0x0d, 0x75, 0x99, 0xba, 0xe8, 0x84, 0xce, 0xfe, 0x46, 0xee, 0xc2, 0x8b,
0x20, 0xf7, 0x63, 0xa9, 0xd4, 0x97, 0xc6, 0x24, 0xf4, 0x61, 0xa9, 0xd8, 0x1f, 0x75, 0xd8, 0x58, 0xa9, 0x27, 0x9f, 0xc7, 0x03, 0x52, 0x93, 0xf3, 0xa9, 0x88, 0x28, 0x22, 0x45, 0x4d, 0x5e, 0x48,
0xa0, 0x14, 0x9d, 0x9c, 0xbb, 0xc5, 0xe4, 0x5c, 0xb3, 0xdf, 0xfb, 0x8a, 0xfc, 0xdc, 0xb6, 0x87, 0x8e, 0xd4, 0x04, 0x8f, 0xb0, 0x1e, 0x54, 0x93, 0x19, 0x96, 0x9b, 0xc5, 0xab, 0xc9, 0xac, 0xdf,
0xc3, 0x95, 0xb2, 0xb0, 0x2f, 0x95, 0xa8, 0x92, 0x50, 0x7a, 0x83, 0x93, 0x38, 0x31, 0x49, 0xb9, 0x54, 0x1d, 0xc3, 0x39, 0x84, 0x8e, 0xa1, 0x7a, 0xd6, 0x49, 0x2a, 0x66, 0x27, 0xc9, 0x15, 0x7e,
0xa0, 0xf7, 0x50, 0x31, 0x95, 0x5e, 0x94, 0x62, 0x07, 0xd0, 0x9a, 0xce, 0x4e, 0xc6, 0xa1, 0x7e, 0xb5, 0x50, 0xf8, 0xce, 0x1e, 0xf4, 0xf2, 0xe6, 0x2c, 0xea, 0x7f, 0xce, 0x2e, 0x40, 0x66, 0xc7,
0xad, 0xbb, 0xfb, 0xd7, 0xcb, 0x07, 0x06, 0xc4, 0x3e, 0x5a, 0x13, 0x46, 0x52, 0xdd, 0x41, 0xe9, 0xc2, 0x53, 0x9f, 0x68, 0x95, 0xd0, 0x86, 0x85, 0xc7, 0x7e, 0xa9, 0xc2, 0x5a, 0x0a, 0xa3, 0x54,
0x74, 0xab, 0xef, 0xa8, 0xcc, 0x68, 0x13, 0x27, 0x51, 0x21, 0xa3, 0xbf, 0x38, 0xd0, 0x2f, 0x3a, 0x70, 0xee, 0xe6, 0x83, 0x73, 0xdd, 0x1c, 0x2b, 0x25, 0xf1, 0xb9, 0x6d, 0xce, 0xa0, 0xcd, 0xe2,
0x9c, 0x43, 0xaa, 0x9a, 0x0d, 0xa9, 0x2c, 0xd8, 0x54, 0x2f, 0xc2, 0x26, 0x1b, 0x6c, 0x39, 0x17, 0xe1, 0xbe, 0x90, 0x47, 0xe5, 0x09, 0xf9, 0xae, 0x7b, 0x12, 0x44, 0x3a, 0x28, 0x73, 0xef, 0x1e,
0xc1, 0x96, 0x81, 0x54, 0x8d, 0x15, 0x90, 0xca, 0x5d, 0x0e, 0xa9, 0x9a, 0x95, 0x90, 0xaa, 0x55, 0x4a, 0xa6, 0x7c, 0x17, 0x4f, 0xb1, 0x03, 0x68, 0x86, 0xd3, 0x93, 0xb1, 0xa7, 0xba, 0x75, 0x67,
0x09, 0xa9, 0xda, 0xcb, 0x20, 0x55, 0xe7, 0x3d, 0x90, 0x0a, 0x56, 0x40, 0x2a, 0x35, 0x5b, 0x1a, 0xff, 0x46, 0xf1, 0xc2, 0x80, 0xd8, 0x47, 0x2b, 0x5c, 0x9f, 0x94, 0x32, 0x28, 0x9c, 0x56, 0xb9,
0x17, 0x20, 0xd5, 0xfa, 0x32, 0x48, 0xd5, 0x5b, 0x09, 0xa9, 0xfa, 0x17, 0x21, 0x95, 0xf7, 0x33, 0x8c, 0xd2, 0x88, 0x36, 0x70, 0x6e, 0xe5, 0x22, 0xfa, 0x43, 0x0d, 0x7a, 0x79, 0x83, 0x33, 0x54,
0xac, 0xdb, 0x55, 0xb4, 0x0a, 0x0f, 0x68, 0xb4, 0x51, 0x2f, 0xa0, 0x0d, 0x0e, 0x2d, 0x8d, 0x2d, 0x57, 0x31, 0x51, 0x9d, 0x81, 0xdc, 0xaa, 0x79, 0xe4, 0x66, 0xe2, 0xbd, 0xda, 0x3c, 0xde, 0xd3,
0x30, 0xfc, 0x3d, 0x61, 0x48, 0xd5, 0x6b, 0xc5, 0xa2, 0x5b, 0xda, 0x1e, 0x3e, 0x6c, 0x96, 0xab, 0xa8, 0xae, 0xbe, 0x04, 0xd5, 0x59, 0x8b, 0x51, 0x5d, 0xa3, 0x14, 0xd5, 0x35, 0x4b, 0x51, 0x5d,
0x6d, 0x95, 0x1d, 0xd6, 0x88, 0x5a, 0x40, 0x33, 0xef, 0x3b, 0xeb, 0xb6, 0x95, 0xcd, 0xa8, 0xab, 0x6b, 0x11, 0xaa, 0x6b, 0x5f, 0x82, 0xea, 0x60, 0x09, 0xaa, 0x93, 0xb3, 0xa5, 0x3e, 0x87, 0xea,
0xb1, 0x6e, 0xaa, 0xd1, 0x3b, 0x83, 0x9b, 0x78, 0x80, 0x1a, 0xf9, 0x69, 0x98, 0x66, 0xfe, 0x9c, 0x56, 0x17, 0xa1, 0xba, 0xee, 0x52, 0x54, 0xd7, 0x9b, 0x47, 0x75, 0xce, 0xf7, 0xb0, 0x6a, 0x66,
0x06, 0xe6, 0x61, 0x34, 0x1a, 0x2c, 0x30, 0x43, 0x0e, 0x88, 0x6a, 0x65, 0x40, 0xb4, 0xfc, 0xc1, 0xd1, 0x32, 0x3c, 0xa0, 0x30, 0x4d, 0x35, 0x87, 0x69, 0x6c, 0x68, 0x2a, 0x04, 0xa3, 0x10, 0xbe,
0xc9, 0xe1, 0x83, 0x63, 0x83, 0xc1, 0x17, 0xe6, 0xa1, 0x16, 0x72, 0x18, 0x27, 0xa3, 0x4b, 0x83, 0x26, 0x65, 0xad, 0xe5, 0x93, 0x6e, 0x61, 0x79, 0xf4, 0x61, 0xbd, 0x98, 0x6d, 0xcb, 0xf4, 0x30,
0xb0, 0x6a, 0xad, 0x87, 0xb0, 0x45, 0x5a, 0x11, 0x85, 0xbc, 0x47, 0xf5, 0x42, 0x45, 0xdd, 0x56, 0x46, 0x54, 0x8a, 0x0e, 0x9d, 0xaf, 0x0c, 0x69, 0x4b, 0x8b, 0x51, 0x65, 0x63, 0x55, 0x67, 0xa3,
0xf1, 0x23, 0xf4, 0x6c, 0xc3, 0x52, 0x76, 0x57, 0x21, 0x25, 0x5c, 0xea, 0x49, 0x79, 0xa5, 0xf0, 0x73, 0x0e, 0x37, 0xf1, 0x02, 0x15, 0xf2, 0x33, 0x2f, 0x4e, 0xfa, 0x33, 0x1a, 0x98, 0x87, 0xfe,
0x74, 0x93, 0x98, 0x30, 0x32, 0xde, 0x1b, 0xd8, 0xb0, 0x62, 0xf9, 0x24, 0x7a, 0x15, 0x2f, 0x35, 0x68, 0x90, 0x62, 0x86, 0x0c, 0x10, 0x55, 0x8a, 0x80, 0x68, 0x71, 0xc3, 0xc9, 0xe0, 0x43, 0xcd,
0xc0, 0x20, 0xe0, 0xba, 0x85, 0x80, 0x73, 0x7f, 0x9d, 0x6a, 0x7f, 0x1b, 0xb6, 0xb1, 0x07, 0xd0, 0x80, 0x0f, 0xce, 0x4b, 0xdd, 0xa8, 0xb9, 0x18, 0x06, 0xd1, 0xe8, 0xca, 0x20, 0xac, 0xfc, 0xd5,
0x15, 0x72, 0x3a, 0xd6, 0x97, 0xb1, 0x5d, 0x68, 0x28, 0xd5, 0xfa, 0x3d, 0xdd, 0x34, 0x76, 0x1a, 0x43, 0xd8, 0xa0, 0x57, 0x11, 0x85, 0x5c, 0xf2, 0x74, 0xfa, 0x44, 0xd5, 0x7c, 0xe2, 0x5b, 0xe8,
0xa4, 0x2b, 0x90, 0xeb, 0x7d, 0x0d, 0x9b, 0x25, 0x0b, 0x71, 0xa4, 0x92, 0x51, 0xe4, 0x64, 0x47, 0x9a, 0x8a, 0xc5, 0xec, 0xae, 0x44, 0x4a, 0xb8, 0x54, 0x93, 0x72, 0x33, 0xd7, 0xba, 0xe9, 0x18,
0x18, 0xd2, 0x7b, 0x00, 0x1b, 0xd6, 0x15, 0xaa, 0x36, 0xd8, 0x2d, 0x70, 0x15, 0xd7, 0xc4, 0xe3, 0xd7, 0x67, 0x9c, 0x37, 0xb0, 0x66, 0xf8, 0xf2, 0xa9, 0x7f, 0x1a, 0x2c, 0x54, 0x40, 0x03, 0xed,
0xe2, 0x3d, 0xc4, 0xf6, 0x7e, 0xaf, 0x43, 0x4f, 0xc8, 0xa1, 0x0c, 0xa7, 0x99, 0x36, 0xf0, 0xb2, 0xaa, 0x01, 0xb4, 0x33, 0x7b, 0x6b, 0xe5, 0xf6, 0xd6, 0x4d, 0x65, 0x0f, 0xa0, 0xc3, 0x45, 0x38,
0x59, 0x36, 0x11, 0x72, 0xac, 0x08, 0x55, 0x46, 0xa2, 0x08, 0x47, 0xdd, 0x32, 0x1c, 0x2d, 0x54, 0x56, 0xc2, 0xd8, 0x2e, 0xd4, 0xe5, 0xd3, 0xaa, 0x9f, 0xae, 0x6b, 0x3d, 0x35, 0xd2, 0xe5, 0xc8,
0x68, 0xb3, 0xa2, 0x42, 0x69, 0x8c, 0xb6, 0x4a, 0x63, 0x34, 0x87, 0x99, 0xed, 0x32, 0xcc, 0xe4, 0x75, 0x3e, 0x83, 0xf5, 0x82, 0x86, 0x38, 0x52, 0x49, 0x29, 0x32, 0xb2, 0xcd, 0x35, 0xe9, 0x3c,
0x39, 0x10, 0xef, 0x50, 0xc0, 0x6c, 0xdc, 0xbd, 0x00, 0xa0, 0x50, 0x06, 0xa0, 0x63, 0xd8, 0xd4, 0x80, 0x35, 0x43, 0x84, 0xcc, 0x0d, 0x76, 0x0b, 0x2c, 0xc9, 0xd5, 0xfe, 0x98, 0x97, 0x43, 0x6c,
0x21, 0xf9, 0xf8, 0x6f, 0xf6, 0x0f, 0x8e, 0x8a, 0xf7, 0x9b, 0xa3, 0xa7, 0xee, 0x31, 0x7d, 0x7f, 0xc7, 0x07, 0x86, 0x82, 0xd2, 0xac, 0xfc, 0x97, 0xbd, 0xf1, 0x10, 0x18, 0xaa, 0x9a, 0x97, 0x57,
0x08, 0x79, 0x76, 0xe9, 0xf1, 0xb2, 0xfa, 0x73, 0xe7, 0x12, 0x03, 0xa6, 0xf7, 0x7f, 0x19, 0x30, 0xee, 0x94, 0xf4, 0x8c, 0x72, 0xca, 0xe7, 0xb0, 0x39, 0xaf, 0xeb, 0x32, 0xbf, 0x7c, 0x03, 0x9b,
0xbd, 0xd2, 0x80, 0x39, 0x86, 0x9e, 0xf9, 0x64, 0xa5, 0x14, 0x5c, 0x76, 0xc2, 0x30, 0xfd, 0xd1, 0xf3, 0xc2, 0xe2, 0x45, 0xbe, 0xc9, 0xc4, 0x29, 0xdf, 0xfc, 0x5c, 0x85, 0x2e, 0x17, 0x43, 0xe1,
0x4d, 0xe3, 0x05, 0xd7, 0xde, 0x1d, 0x9d, 0x59, 0x9c, 0x2b, 0x2b, 0xd5, 0x7a, 0x0f, 0x61, 0x8b, 0x85, 0x89, 0x0a, 0xde, 0x55, 0x2b, 0x40, 0xfb, 0xab, 0x66, 0xf8, 0xab, 0xd4, 0x2f, 0x79, 0xa8,
0x3e, 0xbc, 0x69, 0xb0, 0xbc, 0xd7, 0x86, 0xca, 0xe9, 0xf2, 0x03, 0x6c, 0x0c, 0x7c, 0x83, 0x19, 0x6e, 0x15, 0xa1, 0x7a, 0xae, 0x7a, 0x1b, 0x25, 0xd5, 0x4b, 0x10, 0xa3, 0x59, 0x80, 0x18, 0x19,
0x57, 0xab, 0xd0, 0x71, 0xa5, 0x67, 0x55, 0x2d, 0xbd, 0x6f, 0x15, 0x48, 0x7c, 0x8e, 0x9f, 0x78, 0x04, 0x6f, 0x15, 0x21, 0xb8, 0x9d, 0x7d, 0xa4, 0xb4, 0xc9, 0x69, 0xe6, 0x37, 0x49, 0x0a, 0xce,
0x97, 0x3b, 0x78, 0x5f, 0x61, 0x50, 0x7c, 0xad, 0x2e, 0x77, 0xee, 0xa5, 0x85, 0x36, 0x3f, 0xe9, 0xa1, 0x08, 0xce, 0xc7, 0xb0, 0xae, 0x5c, 0xf2, 0xe1, 0x3f, 0x5c, 0xde, 0xdb, 0x2b, 0xce, 0x4f,
0x84, 0x79, 0x04, 0x57, 0x17, 0x8a, 0x3f, 0x7e, 0xc8, 0x3c, 0xb2, 0xc6, 0xbd, 0x99, 0x33, 0xdf, 0x35, 0x85, 0x48, 0x8e, 0xe9, 0xdb, 0x8c, 0x8b, 0xf3, 0x2b, 0x8f, 0xde, 0xe5, 0x9f, 0x82, 0x57,
0x94, 0xe7, 0xcc, 0x76, 0x19, 0x53, 0x96, 0x46, 0xcd, 0xfe, 0x3f, 0x35, 0x70, 0xf1, 0x1f, 0x21, 0x18, 0xbe, 0xdd, 0xff, 0xca, 0xf0, 0xed, 0x16, 0x86, 0xef, 0x31, 0x74, 0xf5, 0x4f, 0x03, 0x0a,
0xbb, 0x0f, 0x90, 0xb7, 0x39, 0xab, 0x06, 0xd2, 0x37, 0xcc, 0x17, 0xfe, 0x4f, 0x51, 0x1a, 0x9e, 0xc1, 0x55, 0xa7, 0x2f, 0x53, 0xff, 0x44, 0x68, 0xf4, 0xe2, 0xda, 0xb9, 0xa3, 0x22, 0x8b, 0x33,
0x46, 0x2f, 0xce, 0xbd, 0x35, 0xb6, 0x6f, 0xfd, 0x4c, 0xa9, 0x42, 0xd4, 0x55, 0x67, 0xcc, 0x5d, 0x77, 0xe9, 0xb3, 0xce, 0x23, 0xd8, 0xa0, 0x7f, 0x1f, 0x34, 0x74, 0x2f, 0xd5, 0xa1, 0x74, 0xf2,
0x04, 0x68, 0xaa, 0xc1, 0x75, 0xd5, 0xb9, 0xef, 0x35, 0xcc, 0x32, 0xf0, 0x66, 0x19, 0xca, 0xae, 0x7e, 0x0d, 0x6b, 0x83, 0xbe, 0xc6, 0xd3, 0xcb, 0x9f, 0x50, 0x7e, 0xa5, 0x91, 0x23, 0x97, 0xce,
0x38, 0x7b, 0xd2, 0xc4, 0x5f, 0x9d, 0x07, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xe4, 0x81, 0xc1, 0x97, 0x12, 0x40, 0xbf, 0xc0, 0xcf, 0xdf, 0xab, 0x5d, 0xbc, 0x2f, 0xf1, 0x39, 0x36, 0xad, 0xab,
0x51, 0x13, 0x15, 0x00, 0x00, 0xdd, 0x7b, 0x65, 0x20, 0xf1, 0x7f, 0x74, 0xfa, 0x3e, 0x86, 0x6b, 0x46, 0x37, 0xfc, 0xd0, 0x01,
0xfc, 0xd8, 0x80, 0x42, 0x7a, 0x06, 0x7f, 0x51, 0x9c, 0xc1, 0x5b, 0x73, 0x7d, 0x35, 0x3f, 0x86,
0xf7, 0xff, 0xac, 0x80, 0x85, 0x3f, 0x78, 0xd9, 0x7d, 0x80, 0xac, 0xcc, 0x59, 0xf9, 0x47, 0xc6,
0xb6, 0xfe, 0xfb, 0xf1, 0x9d, 0x1f, 0x7b, 0x67, 0xfe, 0xcb, 0x0b, 0x67, 0x85, 0xed, 0x1b, 0xbf,
0xb3, 0xca, 0xbe, 0x36, 0xca, 0xee, 0x68, 0x59, 0x04, 0xf6, 0xca, 0x3f, 0x3c, 0xca, 0xee, 0x3d,
0x54, 0x10, 0x54, 0x43, 0xbf, 0x45, 0x5f, 0x20, 0x25, 0x77, 0x4f, 0x1a, 0xf8, 0x9f, 0xfa, 0xe0,
0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x70, 0xe6, 0x48, 0x7b, 0xd0, 0x16, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
......
...@@ -38,6 +38,7 @@ func (t *GuessType) GetTypeMap() map[string]int32 { ...@@ -38,6 +38,7 @@ func (t *GuessType) GetTypeMap() map[string]int32 {
"Bet": GuessGameActionBet, "Bet": GuessGameActionBet,
"Abort": GuessGameActionAbort, "Abort": GuessGameActionAbort,
"Publish": GuessGameActionPublish, "Publish": GuessGameActionPublish,
"Query": GuessGameActionQuery,
} }
} }
......
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