diff --git a/cmd/gctcli/commands.go b/cmd/gctcli/commands.go index 92b72cd7..37ee55a3 100644 --- a/cmd/gctcli/commands.go +++ b/cmd/gctcli/commands.go @@ -345,13 +345,13 @@ func disableExchange(c *cli.Context) error { var getExchangeOTPCommand = cli.Command{ Name: "getexchangeotp", - Usage: "gets a specific exchanges otp code", + Usage: "gets a specific exchange OTP code", ArgsUsage: "", Action: getExchangeOTPCode, Flags: []cli.Flag{ cli.StringFlag{ Name: "exchange", - Usage: "the exchange to get the otp code for", + Usage: "the exchange to get the OTP code for", }, }, } @@ -392,7 +392,7 @@ func getExchangeOTPCode(c *cli.Context) error { var getExchangeOTPsCommand = cli.Command{ Name: "getexchangeotps", - Usage: "gets all exchange OTPs", + Usage: "gets all exchange OTP codes", Action: getExchangeOTPCodes, } @@ -1950,8 +1950,10 @@ func withdrawFiatFunds(_ *cli.Context) error { } var getLoggerDetailsCommand = cli.Command{ - Name: "getloggerdetails", - Action: getLoggerDetails, + Name: "getloggerdetails", + Usage: "gets an individual loggers details", + ArgsUsage: "", + Action: getLoggerDetails, Flags: []cli.Flag{ cli.StringFlag{ Name: "logger", @@ -1994,8 +1996,10 @@ func getLoggerDetails(c *cli.Context) error { } var setLoggerDetailsCommand = cli.Command{ - Name: "setloggerdetails", - Action: setLoggerDetails, + Name: "setloggerdetails", + Usage: "sets an individual loggers details", + ArgsUsage: " ", + Action: setLoggerDetails, Flags: []cli.Flag{ cli.StringFlag{ Name: "logger", @@ -2049,3 +2053,220 @@ func setLoggerDetails(c *cli.Context) error { jsonOutput(result) return nil } + +var getExchangePairsCommand = cli.Command{ + Name: "getexchangepairs", + Usage: "gets an exchanges supported currency pairs (available and enabled) plus asset types", + ArgsUsage: " ", + Action: getExchangePairs, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "exchange", + Usage: "the exchange to list of the currency pairs of", + }, + cli.StringFlag{ + Name: "asset", + Usage: "the asset type to filter by", + }, + }, +} + +func getExchangePairs(c *cli.Context) error { + if c.NArg() == 0 && c.NumFlags() == 0 { + cli.ShowCommandHelp(c, "getexchangepairs") + return nil + } + + var exchange string + var asset string + + if c.IsSet("exchange") { + exchange = c.String("exchange") + } else { + exchange = c.Args().First() + } + + if c.IsSet("asset") { + asset = c.String("asset") + } else { + asset = c.Args().Get(1) + } + + conn, err := setupClient() + if err != nil { + return err + } + defer conn.Close() + + client := gctrpc.NewGoCryptoTraderClient(conn) + + result, err := client.GetExchangePairs(context.Background(), + &gctrpc.GetExchangePairsRequest{ + Exchange: exchange, + Asset: asset, + }, + ) + if err != nil { + return err + } + jsonOutput(result) + return nil +} + +var enableExchangePairCommand = cli.Command{ + Name: "enableexchangepair", + Usage: "enables an exchange currency pair", + ArgsUsage: " ", + Action: enableExchangePair, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "exchange", + Usage: "the exchange to enable the currency pair for", + }, + cli.StringFlag{ + Name: "pair", + Usage: "the currency pair to enable", + }, + cli.StringFlag{ + Name: "asset", + Usage: "the asset type to enable the currency pair for", + }, + }, +} + +func enableExchangePair(c *cli.Context) error { + if c.NArg() == 0 && c.NumFlags() == 0 { + cli.ShowCommandHelp(c, "enableexchangepair") + return nil + } + + var exchange string + var pair string + var asset string + + if c.IsSet("exchange") { + exchange = c.String("exchange") + } else { + exchange = c.Args().First() + } + + if c.IsSet("pair") { + pair = c.String("pair") + } else { + pair = c.Args().Get(1) + } + + if c.IsSet("asset") { + asset = c.String("asset") + } else { + asset = c.Args().Get(2) + } + + conn, err := setupClient() + if err != nil { + return err + } + defer conn.Close() + + if !validPair(pair) { + return errInvalidPair + } + + p := currency.NewPairDelimiter(pair, pairDelimiter) + client := gctrpc.NewGoCryptoTraderClient(conn) + result, err := client.EnableExchangePair(context.Background(), + &gctrpc.ExchangePairRequest{ + Exchange: exchange, + Pair: &gctrpc.CurrencyPair{ + Delimiter: p.Delimiter, + Base: p.Base.String(), + Quote: p.Quote.String(), + }, + AssetType: asset, + }, + ) + if err != nil { + return err + } + jsonOutput(result) + return nil +} + +var disableExchangePairCommand = cli.Command{ + Name: "disableexchangepair", + Usage: "disables a previously enabled exchange currency pair", + ArgsUsage: " ", + Action: disableExchangePair, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "exchange", + Usage: "the exchange to disable the currency pair for", + }, + cli.StringFlag{ + Name: "pair", + Usage: "the currency pair to disable", + }, + cli.StringFlag{ + Name: "asset", + Usage: "the asset type to disable the currency pair for", + }, + }, +} + +func disableExchangePair(c *cli.Context) error { + if c.NArg() == 0 && c.NumFlags() == 0 { + cli.ShowCommandHelp(c, "disableexchangepair") + return nil + } + + var exchange string + var pair string + var asset string + + if c.IsSet("exchange") { + exchange = c.String("exchange") + } else { + exchange = c.Args().First() + } + + if c.IsSet("pair") { + pair = c.String("pair") + } else { + pair = c.Args().Get(1) + } + + if c.IsSet("asset") { + asset = c.String("asset") + } else { + asset = c.Args().Get(2) + } + + conn, err := setupClient() + if err != nil { + return err + } + defer conn.Close() + + if !validPair(pair) { + return errInvalidPair + } + + p := currency.NewPairDelimiter(pair, pairDelimiter) + client := gctrpc.NewGoCryptoTraderClient(conn) + result, err := client.DisableExchangePair(context.Background(), + &gctrpc.ExchangePairRequest{ + Exchange: exchange, + Pair: &gctrpc.CurrencyPair{ + Delimiter: p.Delimiter, + Base: p.Base.String(), + Quote: p.Quote.String(), + }, + AssetType: asset, + }, + ) + if err != nil { + return err + } + jsonOutput(result) + return nil +} diff --git a/cmd/gctcli/main.go b/cmd/gctcli/main.go index aadaf0af..8fcf4250 100644 --- a/cmd/gctcli/main.go +++ b/cmd/gctcli/main.go @@ -124,6 +124,9 @@ func main() { withdrawFiatFundsCommand, getLoggerDetailsCommand, setLoggerDetailsCommand, + getExchangePairsCommand, + enableExchangePairCommand, + disableExchangePairCommand, } err := app.Run(os.Args) diff --git a/currency/manager.go b/currency/manager.go index 7248e1f6..c77aaa36 100644 --- a/currency/manager.go +++ b/currency/manager.go @@ -1,6 +1,8 @@ package currency import ( + "errors" + "github.com/thrasher-corp/gocryptotrader/exchanges/asset" ) @@ -105,3 +107,60 @@ func (p *PairsManager) StorePairs(a asset.Item, pairs Pairs, enabled bool) { p.Pairs[a] = c } + +// DisablePair removes the pair from the enabled pairs list if found +func (p *PairsManager) DisablePair(a asset.Item, pair Pair) error { + p.m.Lock() + defer p.m.Unlock() + + if p.Pairs == nil { + return errors.New("pair manager not initialised") + } + + c, ok := p.Pairs[a] + if !ok { + return errors.New("asset type not found") + } + + if c == nil { + return errors.New("currency store is nil") + } + + if !c.Enabled.Contains(pair, true) { + return errors.New("specified pair is not enabled") + } + + c.Enabled = c.Enabled.Remove(pair) + return nil +} + +// EnablePair adds a pair to the list of enabled pairs if it exists in the list +// of available pairs and isn't already added +func (p *PairsManager) EnablePair(a asset.Item, pair Pair) error { + p.m.Lock() + defer p.m.Unlock() + + if p.Pairs == nil { + return errors.New("pair manager not initialised") + } + + c, ok := p.Pairs[a] + if !ok { + return errors.New("asset type not found") + } + + if c == nil { + return errors.New("currency store is nil") + } + + if !c.Available.Contains(pair, true) { + return errors.New("specified pair was not found in the list of available pairs") + } + + if c.Enabled.Contains(pair, true) { + return errors.New("specified pair is already enabled") + } + + c.Enabled = c.Enabled.Add(pair) + return nil +} diff --git a/currency/manager_test.go b/currency/manager_test.go index f9d464cc..67a58490 100644 --- a/currency/manager_test.go +++ b/currency/manager_test.go @@ -138,3 +138,70 @@ func TestStorePairs(t *testing.T) { t.Errorf("TestStorePairs failed, unexpected result") } } + +func TestDisablePair(t *testing.T) { + p.Pairs = nil + // Test disabling a pair when the pair manager is not initialised + if err := p.DisablePair(asset.Spot, NewPair(BTC, USD)); err == nil { + t.Error("unexpected result") + } + + // Test asset type which doesn't exist + initTest() + if err := p.DisablePair(asset.Futures, Pair{}); err == nil { + t.Error("unexpected result") + } + + // Test asset type which has an empty pair store + p.Pairs[asset.Spot] = nil + if err := p.DisablePair(asset.Spot, Pair{}); err == nil { + t.Error("unexpected result") + } + + // Test disabling a pair which isn't enabled + initTest() + if err := p.DisablePair(asset.Spot, NewPair(LTC, USD)); err == nil { + t.Error("unexpected result") + } + + // Test disabling a valid pair and ensure nil is empty + if err := p.DisablePair(asset.Spot, NewPair(BTC, USD)); err != nil { + t.Error("unexpected result") + } +} + +func TestEnablePair(t *testing.T) { + p.Pairs = nil + // Test enabling a pair when the pair manager is not initialised + if err := p.EnablePair(asset.Spot, NewPair(BTC, USD)); err == nil { + t.Error("unexpected result") + } + + // Test asset type which doesn't exist + initTest() + if err := p.EnablePair(asset.Futures, Pair{}); err == nil { + t.Error("unexpected result") + } + + // Test asset type which has an empty pair store + p.Pairs[asset.Spot] = nil + if err := p.EnablePair(asset.Spot, Pair{}); err == nil { + t.Error("unexpected result") + } + + // Test enabling a pair which isn't in the list of available pairs + initTest() + if err := p.EnablePair(asset.Spot, NewPair(ETH, USD)); err == nil { + t.Error("unexpected result") + } + + // Test enabling a pair which already is enabled + if err := p.EnablePair(asset.Spot, NewPair(BTC, USD)); err == nil { + t.Error("unexpected result") + } + + // Test enabling a valid pair + if err := p.EnablePair(asset.Spot, NewPair(LTC, USD)); err != nil { + t.Error("unexpected result") + } +} diff --git a/currency/pairs.go b/currency/pairs.go index 7eba29d2..06cdedd1 100644 --- a/currency/pairs.go +++ b/currency/pairs.go @@ -134,6 +134,27 @@ func (p Pairs) RemovePairsByFilter(filter Code) Pairs { return pairs } +// Remove removes the specified pair from the list of pairs if it exists +func (p Pairs) Remove(pair Pair) Pairs { + var pairs Pairs + for x := range p { + if p[x].Equal(pair) { + continue + } + pairs = append(pairs, p[x]) + } + return pairs +} + +// Add adds a specified pair to the list of pairs if it doesn't exist +func (p Pairs) Add(pair Pair) Pairs { + if p.Contains(pair, true) { + return p + } + p = append(p, pair) + return p +} + // FindDifferences returns pairs which are new or have been removed func (p Pairs) FindDifferences(pairs Pairs) (newPairs, removedPairs Pairs) { for x := range pairs { diff --git a/currency/pairs_test.go b/currency/pairs_test.go index 1dd69d15..e8d7e1e5 100644 --- a/currency/pairs_test.go +++ b/currency/pairs_test.go @@ -123,6 +123,41 @@ func TestRemovePairsByFilter(t *testing.T) { } } +func TestRemove(t *testing.T) { + var pairs = Pairs{ + NewPair(BTC, USD), + NewPair(LTC, USD), + NewPair(LTC, USDT), + } + + p := NewPair(BTC, USD) + pairs = pairs.Remove(p) + if pairs.Contains(p, true) || len(pairs) != 2 { + t.Error("Test failed. TestRemove unexpected result") + } +} + +func TestAdd(t *testing.T) { + var pairs = Pairs{ + NewPair(BTC, USD), + NewPair(LTC, USD), + NewPair(LTC, USDT), + } + + // Test adding a new pair to the list of pairs + p := NewPair(BTC, USDT) + pairs = pairs.Add(p) + if !pairs.Contains(p, true) || len(pairs) != 4 { + t.Error("Test failed. TestAdd unexpected result") + } + + // Now test adding a pair which already exists + pairs = pairs.Add(p) + if len(pairs) != 4 { + t.Error("Test failed. TestAdd unexpected result") + } +} + func TestContains(t *testing.T) { var pairs = Pairs{ NewPair(BTC, USD), diff --git a/engine/rpcserver.go b/engine/rpcserver.go index ad3e48b6..309beae3 100644 --- a/engine/rpcserver.go +++ b/engine/rpcserver.go @@ -858,3 +858,101 @@ func (s *RPCServer) SetLoggerDetails(ctx context.Context, r *gctrpc.SetLoggerDet Error: levels.Error, }, nil } + +// GetExchangePairs returns a list of exchange supported assets and related pairs +func (s *RPCServer) GetExchangePairs(ctx context.Context, r *gctrpc.GetExchangePairsRequest) (*gctrpc.GetExchangePairsResponse, error) { + exchCfg, err := Bot.Config.GetExchangeConfig(r.Exchange) + if err != nil { + return nil, err + } + + if r.Asset != "" && + !exchCfg.CurrencyPairs.GetAssetTypes().Contains(asset.Item(r.Asset)) { + return nil, errors.New("specified asset type does not exist") + } + + var resp gctrpc.GetExchangePairsResponse + resp.SupportedAssets = make(map[string]*gctrpc.PairsSupported) + assetTypes := exchCfg.CurrencyPairs.GetAssetTypes() + for x := range assetTypes { + a := assetTypes[x] + if r.Asset != "" && !strings.EqualFold(a.String(), r.Asset) { + continue + } + resp.SupportedAssets[a.String()] = &gctrpc.PairsSupported{ + AvailablePairs: exchCfg.CurrencyPairs.Get(a).Available.Join(), + EnabledPairs: exchCfg.CurrencyPairs.Get(a).Enabled.Join(), + } + } + return &resp, nil +} + +// EnableExchangePair enables the specified pair on an exchange +func (s *RPCServer) EnableExchangePair(ctx context.Context, r *gctrpc.ExchangePairRequest) (*gctrpc.GenericExchangeNameResponse, error) { + exchCfg, err := Bot.Config.GetExchangeConfig(r.Exchange) + if err != nil { + return nil, err + } + + if r.AssetType != "" && + !exchCfg.CurrencyPairs.GetAssetTypes().Contains(asset.Item(r.AssetType)) { + return nil, errors.New("specified asset type does not exist") + } + + // Default to spot asset type unless set + a := asset.Spot + if r.AssetType != "" { + a = asset.Item(r.AssetType) + } + + pairFmt, err := Bot.Config.GetPairFormat(r.Exchange, a) + if err != nil { + return nil, err + } + + p := currency.NewPairFromStrings(r.Pair.Base, r.Pair.Quote).Format( + pairFmt.Delimiter, pairFmt.Uppercase) + err = exchCfg.CurrencyPairs.EnablePair(a, p) + if err != nil { + return nil, err + } + err = GetExchangeByName(r.Exchange).GetBase().CurrencyPairs.EnablePair( + asset.Item(r.AssetType), p) + return &gctrpc.GenericExchangeNameResponse{}, err + +} + +// DisableExchangePair disables the specified pair on an exchange +func (s *RPCServer) DisableExchangePair(ctx context.Context, r *gctrpc.ExchangePairRequest) (*gctrpc.GenericExchangeNameResponse, error) { + exchCfg, err := Bot.Config.GetExchangeConfig(r.Exchange) + if err != nil { + return nil, err + } + + if r.AssetType != "" && + !exchCfg.CurrencyPairs.GetAssetTypes().Contains(asset.Item(r.AssetType)) { + return nil, errors.New("specified asset type does not exist") + } + + // Default to spot asset type unless set + a := asset.Spot + if r.AssetType != "" { + a = asset.Item(r.AssetType) + } + + pairFmt, err := Bot.Config.GetPairFormat(r.Exchange, a) + if err != nil { + return nil, err + } + + p := currency.NewPairFromStrings(r.Pair.Base, r.Pair.Quote).Format( + pairFmt.Delimiter, pairFmt.Uppercase) + err = exchCfg.CurrencyPairs.DisablePair(asset.Item(r.AssetType), p) + if err != nil { + return nil, err + } + err = GetExchangeByName(r.Exchange).GetBase().CurrencyPairs.DisablePair( + asset.Item(r.AssetType), p) + return &gctrpc.GenericExchangeNameResponse{}, err + +} diff --git a/exchanges/asset/asset.go b/exchanges/asset/asset.go index 289eb9fb..77137482 100644 --- a/exchanges/asset/asset.go +++ b/exchanges/asset/asset.go @@ -56,13 +56,13 @@ func (a Items) Strings() []string { // Contains returns whether or not the supplied asset exists // in the list of Items -func (a Items) Contains(asset Item) bool { - if !IsValid(asset) { +func (a Items) Contains(i Item) bool { + if !IsValid(i) { return false } for x := range a { - if a[x] == asset { + if strings.EqualFold(a[x].String(), i.String()) { return true } } diff --git a/exchanges/asset/asset_test.go b/exchanges/asset/asset_test.go index a3ef949f..475058c5 100644 --- a/exchanges/asset/asset_test.go +++ b/exchanges/asset/asset_test.go @@ -36,6 +36,10 @@ func TestContains(t *testing.T) { if a.Contains(Binary) { t.Fatal("Test failed - TestContains returned an unexpected result") } + + if !a.Contains("SpOt") { + t.Error("Test failed - TestContains returned an unexpected result") + } } func TestJoinToString(t *testing.T) { diff --git a/gctrpc/rpc.pb.go b/gctrpc/rpc.pb.go index b64224ea..71453f7f 100644 --- a/gctrpc/rpc.pb.go +++ b/gctrpc/rpc.pb.go @@ -4573,6 +4573,147 @@ func (m *SetLoggerDetailsRequest) GetLevel() string { return "" } +type GetExchangePairsRequest struct { + Exchange string `protobuf:"bytes,1,opt,name=exchange,proto3" json:"exchange,omitempty"` + Asset string `protobuf:"bytes,2,opt,name=asset,proto3" json:"asset,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetExchangePairsRequest) Reset() { *m = GetExchangePairsRequest{} } +func (m *GetExchangePairsRequest) String() string { return proto.CompactTextString(m) } +func (*GetExchangePairsRequest) ProtoMessage() {} +func (*GetExchangePairsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{89} +} + +func (m *GetExchangePairsRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetExchangePairsRequest.Unmarshal(m, b) +} +func (m *GetExchangePairsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetExchangePairsRequest.Marshal(b, m, deterministic) +} +func (m *GetExchangePairsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetExchangePairsRequest.Merge(m, src) +} +func (m *GetExchangePairsRequest) XXX_Size() int { + return xxx_messageInfo_GetExchangePairsRequest.Size(m) +} +func (m *GetExchangePairsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetExchangePairsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GetExchangePairsRequest proto.InternalMessageInfo + +func (m *GetExchangePairsRequest) GetExchange() string { + if m != nil { + return m.Exchange + } + return "" +} + +func (m *GetExchangePairsRequest) GetAsset() string { + if m != nil { + return m.Asset + } + return "" +} + +type GetExchangePairsResponse struct { + SupportedAssets map[string]*PairsSupported `protobuf:"bytes,1,rep,name=supported_assets,json=supportedAssets,proto3" json:"supported_assets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetExchangePairsResponse) Reset() { *m = GetExchangePairsResponse{} } +func (m *GetExchangePairsResponse) String() string { return proto.CompactTextString(m) } +func (*GetExchangePairsResponse) ProtoMessage() {} +func (*GetExchangePairsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{90} +} + +func (m *GetExchangePairsResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetExchangePairsResponse.Unmarshal(m, b) +} +func (m *GetExchangePairsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetExchangePairsResponse.Marshal(b, m, deterministic) +} +func (m *GetExchangePairsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetExchangePairsResponse.Merge(m, src) +} +func (m *GetExchangePairsResponse) XXX_Size() int { + return xxx_messageInfo_GetExchangePairsResponse.Size(m) +} +func (m *GetExchangePairsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetExchangePairsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_GetExchangePairsResponse proto.InternalMessageInfo + +func (m *GetExchangePairsResponse) GetSupportedAssets() map[string]*PairsSupported { + if m != nil { + return m.SupportedAssets + } + return nil +} + +type ExchangePairRequest struct { + Exchange string `protobuf:"bytes,1,opt,name=exchange,proto3" json:"exchange,omitempty"` + AssetType string `protobuf:"bytes,2,opt,name=asset_type,json=assetType,proto3" json:"asset_type,omitempty"` + Pair *CurrencyPair `protobuf:"bytes,3,opt,name=pair,proto3" json:"pair,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExchangePairRequest) Reset() { *m = ExchangePairRequest{} } +func (m *ExchangePairRequest) String() string { return proto.CompactTextString(m) } +func (*ExchangePairRequest) ProtoMessage() {} +func (*ExchangePairRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{91} +} + +func (m *ExchangePairRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExchangePairRequest.Unmarshal(m, b) +} +func (m *ExchangePairRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExchangePairRequest.Marshal(b, m, deterministic) +} +func (m *ExchangePairRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExchangePairRequest.Merge(m, src) +} +func (m *ExchangePairRequest) XXX_Size() int { + return xxx_messageInfo_ExchangePairRequest.Size(m) +} +func (m *ExchangePairRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ExchangePairRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ExchangePairRequest proto.InternalMessageInfo + +func (m *ExchangePairRequest) GetExchange() string { + if m != nil { + return m.Exchange + } + return "" +} + +func (m *ExchangePairRequest) GetAssetType() string { + if m != nil { + return m.AssetType + } + return "" +} + +func (m *ExchangePairRequest) GetPair() *CurrencyPair { + if m != nil { + return m.Pair + } + return nil +} + func init() { proto.RegisterType((*GetInfoRequest)(nil), "gctrpc.GetInfoRequest") proto.RegisterType((*GetInfoResponse)(nil), "gctrpc.GetInfoResponse") @@ -4676,288 +4817,300 @@ func init() { proto.RegisterType((*GetLoggerDetailsRequest)(nil), "gctrpc.GetLoggerDetailsRequest") proto.RegisterType((*GetLoggerDetailsResponse)(nil), "gctrpc.GetLoggerDetailsResponse") proto.RegisterType((*SetLoggerDetailsRequest)(nil), "gctrpc.SetLoggerDetailsRequest") + proto.RegisterType((*GetExchangePairsRequest)(nil), "gctrpc.GetExchangePairsRequest") + proto.RegisterType((*GetExchangePairsResponse)(nil), "gctrpc.GetExchangePairsResponse") + proto.RegisterMapType((map[string]*PairsSupported)(nil), "gctrpc.GetExchangePairsResponse.SupportedAssetsEntry") + proto.RegisterType((*ExchangePairRequest)(nil), "gctrpc.ExchangePairRequest") } func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 4415 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3b, 0x4d, 0x6f, 0x1c, 0x57, - 0x72, 0xe8, 0xe1, 0x88, 0xe4, 0xd4, 0x0c, 0xc9, 0xe1, 0xe3, 0xd7, 0x68, 0x44, 0xea, 0xa3, 0xbd, - 0x92, 0x25, 0xad, 0x97, 0xb2, 0x65, 0x21, 0xeb, 0xd8, 0x9b, 0x4d, 0x68, 0x5a, 0xe6, 0x2a, 0xeb, - 0xb5, 0x98, 0xa6, 0x56, 0x02, 0xbc, 0x81, 0x3b, 0xcd, 0xe9, 0xc7, 0x61, 0x47, 0x3d, 0xdd, 0xed, - 0xee, 0x1e, 0x52, 0x34, 0x02, 0x04, 0x30, 0x90, 0x20, 0xa7, 0xe4, 0xb0, 0x08, 0x90, 0x43, 0x4e, - 0x39, 0x05, 0x01, 0x72, 0x09, 0x72, 0xca, 0x61, 0x91, 0x6b, 0x90, 0x63, 0x2e, 0xf9, 0x01, 0x41, - 0x6e, 0x49, 0x80, 0x00, 0xb9, 0xe4, 0x14, 0xbc, 0x7a, 0x1f, 0xfd, 0x5e, 0x77, 0xcf, 0x70, 0xb4, - 0xab, 0xf8, 0x22, 0x4d, 0xd7, 0xab, 0x57, 0x55, 0xaf, 0xaa, 0x5e, 0xbd, 0x7a, 0xf5, 0x8a, 0xd0, - 0x4a, 0x93, 0xc1, 0x6e, 0x92, 0xc6, 0x79, 0x4c, 0xe6, 0x87, 0x83, 0x3c, 0x4d, 0x06, 0xfd, 0xed, - 0x61, 0x1c, 0x0f, 0x43, 0xfa, 0xc0, 0x4b, 0x82, 0x07, 0x5e, 0x14, 0xc5, 0xb9, 0x97, 0x07, 0x71, - 0x94, 0x71, 0x2c, 0xbb, 0x0b, 0xcb, 0x07, 0x34, 0x7f, 0x12, 0x9d, 0xc4, 0x0e, 0xfd, 0x6a, 0x4c, - 0xb3, 0xdc, 0xfe, 0xfb, 0x26, 0xac, 0x28, 0x50, 0x96, 0xc4, 0x51, 0x46, 0xc9, 0x26, 0xcc, 0x8f, - 0x93, 0x3c, 0x18, 0xd1, 0x9e, 0x75, 0xd3, 0xba, 0xdb, 0x72, 0xc4, 0x17, 0x79, 0x00, 0x6b, 0xde, - 0x99, 0x17, 0x84, 0xde, 0x71, 0x48, 0x5d, 0xfa, 0x6a, 0x70, 0xea, 0x45, 0x43, 0x9a, 0xf5, 0x1a, - 0x37, 0xad, 0xbb, 0x73, 0x0e, 0x51, 0x43, 0x8f, 0xe5, 0x08, 0xf9, 0x2e, 0xac, 0xd2, 0x88, 0x81, - 0x7c, 0x0d, 0x7d, 0x0e, 0xd1, 0xbb, 0x62, 0xa0, 0x40, 0x7e, 0x04, 0x9b, 0x3e, 0x3d, 0xf1, 0xc6, - 0x61, 0xee, 0x9e, 0xc4, 0x29, 0x7d, 0xe5, 0x26, 0x69, 0x7c, 0x16, 0xf8, 0x34, 0xed, 0x35, 0x51, - 0x8a, 0x75, 0x31, 0xfa, 0x29, 0x1b, 0x3c, 0x14, 0x63, 0xe4, 0x21, 0x6c, 0xa8, 0x59, 0x81, 0x97, - 0xbb, 0x83, 0x71, 0x9a, 0xd2, 0x68, 0x70, 0xd1, 0xbb, 0x82, 0x93, 0xd6, 0xe4, 0xa4, 0xc0, 0xcb, - 0xf7, 0xc5, 0x10, 0x79, 0x01, 0xdd, 0x6c, 0x7c, 0x9c, 0x5d, 0x64, 0x39, 0x1d, 0xb9, 0x59, 0xee, - 0xe5, 0xe3, 0xac, 0x37, 0x7f, 0x73, 0xee, 0x6e, 0xfb, 0xe1, 0x3b, 0xbb, 0x5c, 0x8d, 0xbb, 0x25, - 0x95, 0xec, 0x1e, 0x49, 0xfc, 0x23, 0x44, 0x7f, 0x1c, 0xe5, 0xe9, 0x85, 0xb3, 0x92, 0x99, 0x50, - 0xf2, 0x39, 0x2c, 0xa5, 0xc9, 0xc0, 0xa5, 0x91, 0x9f, 0xc4, 0x41, 0x94, 0x67, 0xbd, 0x05, 0xa4, - 0x7a, 0x6f, 0x12, 0x55, 0x27, 0x19, 0x3c, 0x96, 0xb8, 0x9c, 0x64, 0x27, 0xd5, 0x40, 0xfd, 0x8f, - 0x61, 0xbd, 0x8e, 0x31, 0xe9, 0xc2, 0xdc, 0x4b, 0x7a, 0x21, 0xac, 0xc3, 0x7e, 0x92, 0x75, 0xb8, - 0x72, 0xe6, 0x85, 0x63, 0x8a, 0xc6, 0x58, 0x74, 0xf8, 0xc7, 0x87, 0x8d, 0x0f, 0xac, 0xfe, 0x33, - 0x58, 0xad, 0xb0, 0xa9, 0x21, 0x70, 0x4f, 0x27, 0xd0, 0x7e, 0xb8, 0x26, 0x45, 0x76, 0x0e, 0xf7, - 0xe5, 0x5c, 0x8d, 0xaa, 0x7d, 0x0b, 0x6e, 0x1c, 0xd0, 0x7c, 0x3f, 0x1e, 0x8d, 0xc6, 0x51, 0x30, - 0x40, 0x1f, 0x73, 0x68, 0xe8, 0x5d, 0xd0, 0x34, 0x93, 0x9e, 0xf5, 0x39, 0xac, 0xd7, 0x8d, 0x93, - 0x1e, 0x2c, 0x08, 0xdb, 0x23, 0xff, 0x45, 0x47, 0x7e, 0x92, 0x6d, 0x68, 0x0d, 0xe2, 0x28, 0xa2, - 0x83, 0x9c, 0xfa, 0x62, 0x21, 0x05, 0xc0, 0xfe, 0xe3, 0x06, 0xdc, 0x9c, 0xcc, 0x53, 0xb8, 0xee, - 0xd7, 0xb0, 0x39, 0xd0, 0x11, 0xdc, 0x54, 0x60, 0xf4, 0x2c, 0x34, 0xc5, 0xbe, 0x66, 0x8a, 0xa9, - 0x94, 0x76, 0x6b, 0x47, 0xb9, 0x91, 0x36, 0x06, 0x75, 0x63, 0xfd, 0x13, 0xe8, 0x4f, 0x9e, 0x54, - 0xa3, 0xf2, 0x87, 0xa6, 0xca, 0xb7, 0xa5, 0x68, 0x75, 0x44, 0x74, 0xdd, 0x7f, 0x1f, 0xb6, 0x0e, - 0x68, 0x44, 0xd3, 0x60, 0xa0, 0x9c, 0x43, 0xe8, 0x9c, 0x69, 0x50, 0xf9, 0xa4, 0x60, 0x55, 0x00, - 0xec, 0x3e, 0xf4, 0xaa, 0x13, 0xf9, 0x72, 0xed, 0x4d, 0x58, 0x3f, 0xa0, 0xb9, 0x82, 0x2b, 0x2b, - 0xfe, 0xc2, 0x82, 0x0d, 0x1c, 0xc8, 0x8e, 0xb3, 0x0b, 0x3e, 0x20, 0x54, 0xfd, 0x7b, 0xb0, 0xaa, - 0x48, 0x67, 0x72, 0x1b, 0x71, 0x2d, 0xbf, 0xaf, 0x69, 0xb9, 0x3a, 0xb3, 0xd8, 0x4c, 0x99, 0xbe, - 0x9b, 0x8a, 0x3d, 0x29, 0xc0, 0xfd, 0x7d, 0xd8, 0xa8, 0x45, 0x7d, 0x1d, 0xff, 0xb7, 0x7b, 0xb0, - 0x79, 0x40, 0x73, 0xcd, 0x8d, 0x35, 0x07, 0x6d, 0x6b, 0x60, 0xe6, 0x97, 0x59, 0xee, 0xa5, 0x79, - 0xe1, 0x97, 0xe2, 0x93, 0xdc, 0x86, 0xe5, 0x30, 0xc8, 0x72, 0x1a, 0xb9, 0x9e, 0xef, 0xa7, 0x34, - 0xe3, 0x21, 0xaf, 0xe5, 0x2c, 0x71, 0xe8, 0x1e, 0x07, 0xda, 0xff, 0x60, 0x31, 0xc3, 0x94, 0x58, - 0x09, 0x65, 0x7d, 0x06, 0xad, 0x22, 0x2a, 0x70, 0x25, 0xed, 0x6a, 0x4a, 0xaa, 0x9b, 0xb3, 0x5b, - 0x0a, 0x0d, 0x05, 0x81, 0xfe, 0xef, 0xc0, 0xf2, 0x9b, 0xde, 0xd0, 0x1f, 0x40, 0x5f, 0xf8, 0x86, - 0x8c, 0xc8, 0x9f, 0x7b, 0x23, 0x2a, 0xfd, 0xaa, 0x0f, 0x8b, 0x32, 0x80, 0x0b, 0x1e, 0xea, 0xdb, - 0xde, 0x81, 0x6b, 0xb5, 0x33, 0x85, 0x63, 0x3d, 0x80, 0xb5, 0x03, 0x9a, 0xab, 0x30, 0x2f, 0x29, - 0x4e, 0x8c, 0x02, 0xf6, 0x23, 0xf4, 0x44, 0x6d, 0x82, 0x50, 0xe1, 0x36, 0xb4, 0x8a, 0x43, 0x44, - 0xf8, 0xb6, 0x02, 0xd8, 0x0f, 0xd1, 0x4d, 0xe5, 0xac, 0xa7, 0xcf, 0x0e, 0x1d, 0xca, 0xa7, 0x5d, - 0x85, 0xc5, 0x38, 0x4f, 0xdc, 0x41, 0xec, 0x4b, 0xd1, 0x17, 0xe2, 0x3c, 0xd9, 0x8f, 0x7d, 0x2a, - 0x5c, 0x43, 0x9b, 0xa3, 0x5c, 0xe3, 0xaf, 0xb8, 0x29, 0xcd, 0x21, 0x21, 0xc7, 0x6f, 0x43, 0x4b, - 0x12, 0x94, 0xa6, 0xfc, 0x9e, 0x66, 0xca, 0xba, 0x39, 0xbb, 0x4f, 0x39, 0x47, 0x61, 0xc9, 0x45, - 0x21, 0x40, 0xd6, 0xff, 0x08, 0x96, 0x8c, 0xa1, 0xcb, 0x3c, 0xbb, 0xa5, 0x9b, 0xec, 0x11, 0x6c, - 0x7e, 0x12, 0x64, 0xfa, 0x89, 0x3b, 0x8b, 0xb9, 0xbe, 0x84, 0xe5, 0x43, 0x2f, 0x48, 0xb3, 0xa3, - 0x71, 0x92, 0xc4, 0xe8, 0xde, 0x6f, 0xc3, 0x4a, 0x71, 0xac, 0x27, 0x6c, 0x4c, 0x4c, 0x5a, 0x56, - 0x60, 0x9c, 0x41, 0xde, 0x82, 0x25, 0x79, 0x9c, 0x73, 0x34, 0x2e, 0x52, 0x47, 0x00, 0x11, 0xc9, - 0xfe, 0xa6, 0x69, 0xa8, 0xce, 0x48, 0x2c, 0x08, 0x34, 0x23, 0x4f, 0xa5, 0x15, 0xf8, 0x5b, 0x77, - 0x84, 0x86, 0x79, 0x1c, 0xf4, 0x60, 0xe1, 0x8c, 0xa6, 0xc7, 0x71, 0x46, 0x31, 0x67, 0x58, 0x74, - 0xe4, 0x27, 0x13, 0x64, 0x9c, 0x05, 0xd1, 0xd0, 0xcd, 0xbc, 0xc8, 0x3f, 0x8e, 0x5f, 0x61, 0x86, - 0xb0, 0xe8, 0x74, 0x10, 0x78, 0xc4, 0x61, 0xe4, 0x16, 0x74, 0x4e, 0xf3, 0x3c, 0x71, 0x59, 0xea, - 0x12, 0x8f, 0x73, 0x91, 0x10, 0xb4, 0x19, 0xec, 0x19, 0x07, 0xb1, 0x8d, 0x8d, 0x28, 0xe3, 0x8c, - 0xa6, 0xde, 0x90, 0x46, 0x79, 0x6f, 0x9e, 0x6f, 0x6c, 0x06, 0xfd, 0xa9, 0x04, 0x92, 0x1d, 0x00, - 0x44, 0x4b, 0xd2, 0xf8, 0xd5, 0x45, 0x6f, 0x81, 0xbb, 0x1e, 0x83, 0x1c, 0x32, 0x00, 0xd3, 0xdf, - 0xb1, 0x97, 0x51, 0x99, 0x7a, 0x04, 0x34, 0xeb, 0x2d, 0x72, 0xfd, 0x31, 0xf0, 0xbe, 0x82, 0x12, - 0x97, 0xe5, 0x1d, 0x42, 0xeb, 0xae, 0x97, 0x65, 0x34, 0xcf, 0x7a, 0x2d, 0x74, 0xa0, 0x47, 0x35, - 0x0e, 0x54, 0xca, 0x3f, 0xc4, 0xbc, 0x3d, 0x9c, 0xa6, 0xf2, 0x0f, 0x03, 0xca, 0xf2, 0x2d, 0x6f, - 0x9c, 0x9f, 0xd2, 0x28, 0x67, 0xa7, 0x07, 0x63, 0x92, 0x04, 0x3d, 0x40, 0xdd, 0x74, 0x8d, 0x81, - 0xbd, 0x24, 0xe8, 0x7f, 0xc1, 0x92, 0x8b, 0x2a, 0xd5, 0x1a, 0x17, 0x7c, 0xc7, 0x0c, 0x25, 0x9b, - 0x52, 0x58, 0xd3, 0x8f, 0x74, 0xd7, 0x3c, 0x87, 0xee, 0x01, 0xcd, 0x9f, 0x05, 0x83, 0x97, 0x34, - 0x9d, 0xc1, 0x29, 0xc9, 0x5d, 0x68, 0x32, 0x8f, 0x12, 0x0c, 0xd6, 0xd5, 0x49, 0x28, 0x32, 0x36, - 0xc6, 0xc8, 0x41, 0x0c, 0x66, 0x0b, 0xd4, 0x9c, 0x9b, 0x5f, 0x24, 0xdc, 0x2f, 0x5a, 0x4e, 0x0b, - 0x21, 0xcf, 0x2e, 0x12, 0x6a, 0x3f, 0x87, 0x8e, 0x3e, 0x89, 0x05, 0x0d, 0x9f, 0x86, 0xc1, 0x28, - 0xc8, 0x69, 0x2a, 0x83, 0x86, 0x02, 0x30, 0x7f, 0x64, 0x26, 0x12, 0x7e, 0x8c, 0xbf, 0xd9, 0x7e, - 0xfb, 0x6a, 0x1c, 0xe7, 0x92, 0x36, 0xff, 0xb0, 0xff, 0xbc, 0x01, 0xcb, 0x72, 0x39, 0xc2, 0x99, - 0xa5, 0xcc, 0xd6, 0xa5, 0x32, 0xdf, 0x82, 0x4e, 0xe8, 0x65, 0xb9, 0x3b, 0x4e, 0x7c, 0x4f, 0xa6, - 0x36, 0x73, 0x4e, 0x9b, 0xc1, 0x7e, 0xca, 0x41, 0xcc, 0xa3, 0x65, 0xe6, 0x8a, 0x7b, 0x4b, 0x70, - 0xef, 0x0c, 0xf4, 0xc5, 0x10, 0x68, 0xb2, 0x39, 0xe8, 0xed, 0x96, 0x83, 0xbf, 0x19, 0xec, 0x34, - 0x18, 0x9e, 0xa2, 0x77, 0x5b, 0x0e, 0xfe, 0x66, 0x16, 0x0c, 0xe3, 0x73, 0xf4, 0x65, 0xcb, 0x61, - 0x3f, 0x19, 0xe4, 0x38, 0xf0, 0xd1, 0x75, 0x2d, 0x87, 0xfd, 0x64, 0x10, 0x2f, 0x7b, 0x89, 0x8e, - 0x6a, 0x39, 0xec, 0x27, 0xcb, 0xfa, 0xcf, 0xe2, 0x70, 0x3c, 0xa2, 0xbd, 0x16, 0x02, 0xc5, 0x17, - 0xb9, 0x06, 0xad, 0x24, 0x0d, 0x06, 0xd4, 0xf5, 0xf2, 0x53, 0x74, 0x26, 0xcb, 0x59, 0x44, 0xc0, - 0x5e, 0x7e, 0x6a, 0xaf, 0xc1, 0xaa, 0x32, 0xb4, 0x8a, 0x9e, 0x2f, 0x60, 0x41, 0x40, 0xa6, 0x1a, - 0xfd, 0x5d, 0x58, 0xc8, 0x39, 0x5a, 0xaf, 0x81, 0xbb, 0x40, 0x39, 0x96, 0xa9, 0x69, 0x47, 0xa2, - 0xd9, 0xbf, 0x09, 0x44, 0xe7, 0x26, 0x0c, 0x71, 0xaf, 0xa0, 0xc3, 0xc3, 0xf1, 0x8a, 0x49, 0x27, - 0x2b, 0x08, 0x7c, 0x8d, 0x87, 0xd1, 0xd3, 0xd4, 0x67, 0x81, 0x24, 0x7e, 0xf9, 0xad, 0xba, 0xe6, - 0x4f, 0x60, 0x49, 0x31, 0x7e, 0x92, 0xd3, 0x11, 0x53, 0xb8, 0x37, 0x8a, 0xc7, 0x51, 0x8e, 0x3c, - 0x2d, 0x47, 0x7c, 0x31, 0x0f, 0x44, 0xfd, 0x22, 0x4b, 0xcb, 0xe1, 0x1f, 0x64, 0x19, 0x1a, 0x81, - 0x2f, 0x2e, 0x4f, 0x8d, 0xc0, 0xb7, 0xff, 0xd7, 0x82, 0x55, 0x6d, 0x21, 0xaf, 0xed, 0x94, 0x15, - 0x8f, 0x6b, 0xd4, 0x78, 0xdc, 0x3d, 0x68, 0x1e, 0x07, 0x3e, 0xbb, 0xb3, 0x31, 0xbd, 0x6e, 0x48, - 0x72, 0xc6, 0x3a, 0x1c, 0x44, 0x61, 0xa8, 0x5e, 0xf6, 0x32, 0xeb, 0x35, 0xa7, 0xa2, 0x32, 0x94, - 0xca, 0x7e, 0xb8, 0x52, 0xdd, 0x0f, 0xa6, 0x2e, 0xe7, 0xcb, 0xba, 0xe4, 0xd9, 0xaa, 0xa2, 0xad, - 0x3c, 0x6f, 0x00, 0x50, 0x00, 0xa7, 0x9a, 0xf5, 0xd7, 0x01, 0x62, 0x85, 0x29, 0xfc, 0xef, 0x6a, - 0x45, 0x68, 0xe5, 0x82, 0x1a, 0xb2, 0xfd, 0x63, 0x4c, 0x35, 0x74, 0xe6, 0x42, 0xf9, 0x0f, 0x0d, - 0x9a, 0xdc, 0x17, 0x49, 0x85, 0x66, 0x66, 0x10, 0x7b, 0x1f, 0x89, 0xed, 0x0d, 0x06, 0xcc, 0xf4, - 0xda, 0xc5, 0x7c, 0xea, 0x19, 0xfe, 0x1c, 0x16, 0xc4, 0x0c, 0xe1, 0x16, 0x1c, 0xa1, 0x11, 0xf8, - 0xe4, 0x23, 0x00, 0xed, 0x1c, 0xe2, 0xeb, 0xba, 0x26, 0x65, 0x10, 0x93, 0xa4, 0x37, 0x20, 0x3b, - 0x0d, 0xdd, 0x3e, 0x81, 0xb5, 0x1a, 0x14, 0x26, 0x8a, 0xba, 0x56, 0x0b, 0x51, 0xe4, 0x37, 0xb9, - 0x01, 0xed, 0x3c, 0xce, 0xbd, 0xd0, 0x2d, 0x4e, 0x08, 0xcb, 0x01, 0x04, 0x3d, 0x67, 0x10, 0x0c, - 0x50, 0x71, 0xc8, 0x3d, 0x97, 0x05, 0xa8, 0x38, 0xf4, 0x6d, 0x0f, 0x13, 0x2f, 0x63, 0xd1, 0x42, - 0x85, 0xd3, 0x4c, 0xf6, 0x5d, 0x58, 0xf4, 0xf8, 0x14, 0xb9, 0xb0, 0x95, 0xd2, 0xc2, 0x1c, 0x85, - 0x60, 0x13, 0x3c, 0x81, 0xf6, 0xe3, 0xe8, 0x24, 0x18, 0x4a, 0xef, 0x78, 0x1b, 0x83, 0x95, 0x84, - 0x15, 0x39, 0x89, 0xef, 0xe5, 0x1e, 0x72, 0xeb, 0x38, 0xf8, 0xdb, 0xfe, 0x23, 0x0b, 0xba, 0x87, - 0x71, 0x9a, 0x9f, 0xc4, 0x61, 0x10, 0x8b, 0xf4, 0x9e, 0xa5, 0x23, 0x32, 0xfd, 0x17, 0x79, 0xa4, - 0xf8, 0x64, 0x11, 0x72, 0x10, 0x07, 0x11, 0xf7, 0xd5, 0x86, 0x50, 0x50, 0x1c, 0x44, 0xcc, 0x55, - 0xc9, 0x4d, 0x68, 0xfb, 0x34, 0x1b, 0xa4, 0x41, 0xc2, 0xae, 0x73, 0x22, 0x2c, 0xe8, 0x20, 0x46, - 0xf8, 0xd8, 0x0b, 0xbd, 0x68, 0x40, 0x45, 0x64, 0x97, 0x9f, 0xf6, 0x06, 0x86, 0x2b, 0x25, 0x89, - 0x76, 0xb3, 0x36, 0xc1, 0x62, 0x29, 0xbf, 0x06, 0xad, 0x44, 0x02, 0x85, 0xfb, 0xf5, 0xd4, 0x59, - 0x5d, 0x5a, 0x8e, 0x53, 0xa0, 0xda, 0xdb, 0x2c, 0xf7, 0x2f, 0xe8, 0x1d, 0x8d, 0x47, 0x23, 0x2f, - 0xbd, 0x90, 0xdc, 0x22, 0x68, 0xee, 0xc7, 0x41, 0xc4, 0x14, 0xc5, 0x16, 0x25, 0x93, 0x37, 0xf6, - 0x5b, 0x17, 0xbd, 0x61, 0x88, 0xae, 0x6b, 0x6b, 0xce, 0xd4, 0xd6, 0x75, 0x80, 0x84, 0xa6, 0x03, - 0x1a, 0xe5, 0xde, 0x50, 0xae, 0x58, 0x83, 0xd8, 0xa7, 0x40, 0x9e, 0x9e, 0x9c, 0x84, 0x41, 0x44, - 0x19, 0x5b, 0x21, 0xcc, 0x14, 0xed, 0x4f, 0x96, 0xc1, 0xe4, 0x34, 0x57, 0xe1, 0xf4, 0x13, 0x58, - 0x7d, 0x1a, 0xd5, 0x30, 0x92, 0xe4, 0xac, 0x69, 0xe4, 0x1a, 0x15, 0x72, 0x3f, 0x82, 0x8e, 0x26, - 0x78, 0x46, 0x3e, 0x80, 0x96, 0x90, 0x51, 0x5d, 0x14, 0xfa, 0x2a, 0x1a, 0x54, 0x56, 0xe8, 0x14, - 0xc8, 0xf6, 0x5f, 0x58, 0xd0, 0x2e, 0x24, 0xcb, 0xc8, 0x23, 0xb8, 0xc2, 0xd4, 0x2d, 0xa9, 0x5c, - 0x57, 0x54, 0x0a, 0x9c, 0x5d, 0xfc, 0x97, 0xe7, 0x85, 0x1c, 0xb9, 0x7f, 0x04, 0x50, 0x00, 0x6b, - 0xd2, 0xba, 0x07, 0x66, 0x5a, 0x77, 0xb5, 0x4a, 0x55, 0x8a, 0xa6, 0x65, 0x76, 0xff, 0xdc, 0x64, - 0xd7, 0xbd, 0x1a, 0x67, 0x11, 0x3e, 0xf8, 0x3d, 0x68, 0xf3, 0xbd, 0xc0, 0x22, 0x80, 0x14, 0xb8, - 0x53, 0x94, 0x36, 0x82, 0xc8, 0x01, 0xdc, 0x1b, 0x38, 0x4e, 0xde, 0x83, 0x25, 0x14, 0xd6, 0x8d, - 0xb9, 0x42, 0xc4, 0xc6, 0x36, 0x27, 0x74, 0x10, 0x45, 0xa8, 0x8c, 0x24, 0xb0, 0x61, 0x4c, 0x71, - 0x33, 0x2e, 0x82, 0x38, 0xa4, 0x7e, 0xa0, 0xa5, 0xd2, 0x93, 0xa4, 0xe4, 0xca, 0x12, 0x04, 0xc5, - 0x18, 0x57, 0xdd, 0xda, 0xa0, 0x3a, 0x42, 0x1e, 0x40, 0x47, 0x70, 0x44, 0xcd, 0x88, 0x23, 0xce, - 0x94, 0xb1, 0xcd, 0x27, 0x22, 0x02, 0x19, 0xc1, 0xba, 0x3e, 0x41, 0x49, 0x78, 0x05, 0x27, 0x7e, - 0x34, 0xbb, 0x84, 0x51, 0x45, 0x40, 0x32, 0xa8, 0x0c, 0xf4, 0x7f, 0x17, 0x7a, 0x93, 0x16, 0x54, - 0x63, 0xf6, 0xfb, 0xa6, 0xd9, 0xd7, 0x6b, 0x5c, 0x32, 0xd3, 0x0b, 0x88, 0x5f, 0xc0, 0xd6, 0x04, - 0x61, 0x5e, 0xa3, 0xea, 0xa0, 0x79, 0xaa, 0xee, 0x4d, 0x7f, 0x66, 0x41, 0x7f, 0xcf, 0xf7, 0x2b, - 0xc1, 0xa9, 0x28, 0x12, 0x7c, 0xdb, 0x21, 0x77, 0x07, 0xae, 0xd5, 0x0a, 0x24, 0xaa, 0x19, 0xaf, - 0x60, 0xc7, 0xa1, 0xa3, 0xf8, 0x8c, 0x7e, 0xdb, 0x22, 0xdb, 0x37, 0xe1, 0xfa, 0x24, 0xce, 0x42, - 0x36, 0x2c, 0xef, 0x99, 0xe5, 0x71, 0x95, 0x18, 0xfd, 0x87, 0x05, 0x4b, 0x66, 0xe1, 0xfc, 0x4d, - 0xdd, 0xc5, 0xdf, 0x01, 0x92, 0xd2, 0x2c, 0x77, 0xd3, 0x38, 0x0c, 0xd9, 0x95, 0xdc, 0xa7, 0xa1, - 0x77, 0x21, 0x4a, 0xf6, 0x5d, 0x36, 0xe2, 0xf0, 0x81, 0x4f, 0x18, 0x9c, 0x6c, 0xc1, 0x82, 0x97, - 0x04, 0x2e, 0xf3, 0x1a, 0x7e, 0x1f, 0x9f, 0xf7, 0x92, 0xe0, 0xc7, 0xf4, 0x82, 0xd8, 0xb0, 0x24, - 0x06, 0xdc, 0x90, 0x9e, 0xd1, 0x10, 0x73, 0xbe, 0x39, 0xa7, 0xcd, 0x87, 0x3f, 0x63, 0x20, 0x72, - 0x0f, 0xba, 0x49, 0x1a, 0x30, 0xf7, 0x2b, 0xde, 0x06, 0x16, 0x50, 0x9a, 0x15, 0x01, 0x97, 0xab, - 0xb3, 0x7f, 0x06, 0x57, 0x6b, 0x74, 0x21, 0x62, 0xd4, 0x0f, 0x61, 0xc5, 0x7c, 0x61, 0x90, 0x71, - 0x4a, 0x65, 0xad, 0xc6, 0x44, 0x67, 0xf9, 0xc4, 0xa0, 0x23, 0xb2, 0x4f, 0xc4, 0x71, 0xbc, 0x5c, - 0xd5, 0xb4, 0xec, 0xaf, 0x60, 0xbd, 0x00, 0xee, 0xc7, 0xd1, 0x19, 0x4d, 0x33, 0xe6, 0x6d, 0x04, - 0x9a, 0x27, 0x69, 0x2c, 0x0b, 0xb2, 0xf8, 0x9b, 0xe5, 0x6d, 0x79, 0x2c, 0xdc, 0xa0, 0x91, 0xc7, - 0x0c, 0x27, 0xf5, 0x72, 0x79, 0x4a, 0xe1, 0x6f, 0x96, 0x27, 0x07, 0x48, 0x84, 0xba, 0x38, 0xc6, - 0x5d, 0xb5, 0x2d, 0x60, 0x8c, 0x8b, 0xfd, 0x1c, 0xd3, 0x47, 0x5d, 0x14, 0xb1, 0xc6, 0xdf, 0x80, - 0x36, 0x5f, 0x23, 0x9b, 0x29, 0xd7, 0xb7, 0x6d, 0xac, 0xaf, 0x24, 0xa6, 0x03, 0x27, 0x0a, 0x6a, - 0xff, 0x57, 0x03, 0x3a, 0x98, 0xb1, 0x7e, 0x42, 0x73, 0x2f, 0x08, 0xa7, 0xe7, 0xd2, 0x3c, 0x07, - 0x6d, 0xa8, 0x1c, 0xf4, 0x2d, 0x58, 0xd2, 0x0b, 0x22, 0x17, 0xf2, 0x32, 0xab, 0x95, 0x43, 0x2e, - 0xc8, 0x6d, 0x58, 0xc6, 0xab, 0x75, 0x81, 0xc5, 0x7d, 0x66, 0x09, 0xa1, 0x0a, 0xcd, 0xbc, 0x08, - 0x5c, 0x29, 0x5d, 0x04, 0xd8, 0x30, 0x26, 0xd3, 0x6e, 0x16, 0xf8, 0xea, 0x9e, 0x80, 0x90, 0xa3, - 0xc0, 0xd7, 0x86, 0x71, 0xf6, 0x82, 0x36, 0x8c, 0xb3, 0xd9, 0x1d, 0x28, 0xa5, 0xfc, 0xa1, 0x00, - 0xdf, 0xbb, 0x16, 0xd1, 0xe9, 0x3a, 0x12, 0xf8, 0x2c, 0x18, 0xe1, 0x6b, 0x98, 0x28, 0x6e, 0xb7, - 0xb8, 0xc7, 0xf2, 0xaf, 0xe2, 0x9a, 0x06, 0xfa, 0x35, 0xad, 0xb8, 0xd4, 0xb5, 0x8d, 0x4b, 0xdd, - 0x0d, 0x68, 0xc7, 0x09, 0x8d, 0x5c, 0x71, 0xc5, 0xee, 0xf0, 0xec, 0x81, 0x81, 0x9e, 0x23, 0x44, - 0x94, 0x4c, 0x50, 0xe7, 0xd9, 0x2c, 0xf7, 0x52, 0x53, 0x31, 0x8d, 0xb2, 0x62, 0xe4, 0x45, 0x70, - 0xee, 0xb2, 0x8b, 0xa0, 0xbd, 0x87, 0x59, 0xb1, 0x64, 0x2c, 0xdc, 0xe7, 0x1d, 0x98, 0x47, 0x35, - 0x49, 0xcf, 0x59, 0x37, 0xae, 0x31, 0xc2, 0x29, 0x1c, 0x81, 0x63, 0xff, 0x08, 0xdf, 0x10, 0x71, - 0x68, 0x16, 0xd1, 0xaf, 0xc2, 0x22, 0xb7, 0x8a, 0xf2, 0x9a, 0x05, 0xfc, 0x7e, 0xe2, 0xdb, 0xff, - 0x6a, 0x01, 0x39, 0x1a, 0x1f, 0x8f, 0x82, 0xd9, 0xa9, 0xcd, 0x7e, 0x41, 0x27, 0xd0, 0x44, 0x37, - 0xe1, 0xee, 0x88, 0xbf, 0x4b, 0x1e, 0xd2, 0x2c, 0x7b, 0x48, 0x61, 0xce, 0x2b, 0xf5, 0x77, 0xf4, - 0x79, 0xdd, 0xf8, 0x2c, 0xc4, 0x87, 0x01, 0x8d, 0x72, 0x57, 0x14, 0x5b, 0x58, 0x88, 0x47, 0xc0, - 0x13, 0xdf, 0x3e, 0x82, 0x35, 0x63, 0x65, 0x42, 0xd3, 0xb7, 0xa0, 0xc3, 0x05, 0x48, 0x42, 0x6f, - 0xa0, 0xaa, 0xe1, 0x6d, 0x84, 0x1d, 0x22, 0x68, 0x9a, 0xbe, 0xfe, 0xc4, 0x82, 0xf5, 0xa3, 0x60, - 0x34, 0x0e, 0xbd, 0x9c, 0xfe, 0x3f, 0x68, 0xac, 0x58, 0xfe, 0x9c, 0xb1, 0x7c, 0xa9, 0xc9, 0x66, - 0xa1, 0x49, 0xfb, 0xbf, 0x2d, 0xd8, 0x28, 0x89, 0xa2, 0x72, 0x42, 0xd3, 0x99, 0x26, 0x14, 0x07, - 0x04, 0x92, 0xc6, 0xb4, 0x61, 0x30, 0x7d, 0x0b, 0x96, 0x46, 0x41, 0x14, 0x8c, 0xc6, 0x23, 0x97, - 0xeb, 0x9e, 0xcb, 0xd4, 0x11, 0xc0, 0x43, 0x34, 0x01, 0x43, 0xf2, 0x5e, 0x69, 0x48, 0x4d, 0x81, - 0xc4, 0x81, 0x1c, 0xe9, 0x5d, 0x58, 0x2f, 0xf2, 0x76, 0x77, 0xe8, 0x05, 0x91, 0x1b, 0xc6, 0x59, - 0x26, 0x6c, 0x4c, 0x8a, 0xb1, 0x03, 0x2f, 0x88, 0x3e, 0x8b, 0xb3, 0x4c, 0x0b, 0x02, 0xf3, 0x7a, - 0x10, 0x60, 0x09, 0x4c, 0xf7, 0xc5, 0xa9, 0x17, 0xd2, 0x8f, 0xe3, 0xd1, 0xf1, 0x9b, 0xd5, 0xfd, - 0x2d, 0xe8, 0xf0, 0xba, 0x5b, 0xee, 0xa5, 0x43, 0x2a, 0x2d, 0xd0, 0x46, 0xd8, 0x33, 0x04, 0xd5, - 0x9a, 0xe1, 0x3f, 0x2d, 0x20, 0xfb, 0x2c, 0x95, 0x09, 0x67, 0xf6, 0x07, 0x16, 0x4a, 0xf8, 0xbd, - 0xb9, 0xf0, 0xb0, 0x96, 0x80, 0x3c, 0x31, 0xdd, 0x6f, 0xce, 0x70, 0x3f, 0xb5, 0x9a, 0xe6, 0x6b, - 0x16, 0xc7, 0x2a, 0x71, 0xfc, 0x36, 0x2c, 0x9f, 0x7b, 0x61, 0x48, 0x73, 0xf5, 0xc4, 0x26, 0x2a, - 0xf1, 0x1c, 0x2a, 0xef, 0xe0, 0x72, 0xc1, 0x0b, 0xda, 0x82, 0x37, 0x60, 0xcd, 0x58, 0xaf, 0xc8, - 0x86, 0x1e, 0xc1, 0x26, 0x07, 0xef, 0x85, 0xe1, 0xcc, 0x51, 0xd5, 0xfe, 0xcb, 0x06, 0x6c, 0x55, - 0xa6, 0xa9, 0xb4, 0xc1, 0x74, 0xe3, 0x3b, 0x6a, 0xb9, 0xf5, 0x13, 0x76, 0xc5, 0xa7, 0x98, 0xd5, - 0xff, 0x47, 0x0b, 0xe6, 0x39, 0x68, 0xaa, 0x35, 0xbe, 0x90, 0x01, 0x41, 0x38, 0x1c, 0xbf, 0x11, - 0x7d, 0x7f, 0x36, 0x66, 0xfc, 0x3f, 0xfd, 0x59, 0x95, 0x47, 0x12, 0xf1, 0xa2, 0xfa, 0x43, 0xe8, - 0x96, 0x11, 0x5e, 0xeb, 0xc9, 0x89, 0x57, 0x55, 0x1e, 0x9f, 0x51, 0xed, 0x19, 0xf5, 0x17, 0x16, - 0xac, 0xec, 0xc7, 0x91, 0x1f, 0xb0, 0x13, 0xf3, 0xd0, 0x4b, 0xbd, 0x51, 0x26, 0x5e, 0xf2, 0x39, - 0x48, 0x96, 0xdd, 0x15, 0x60, 0x42, 0x81, 0x73, 0x07, 0x60, 0x70, 0x4a, 0x07, 0x2f, 0x5d, 0x51, - 0x71, 0xe4, 0xcf, 0xff, 0x0c, 0xf2, 0x71, 0xe0, 0x67, 0xe4, 0x7b, 0xb0, 0x56, 0x0c, 0xbb, 0x5e, - 0xe4, 0xbb, 0xa2, 0xdc, 0x88, 0xaf, 0x1b, 0x0a, 0x6f, 0x2f, 0xf2, 0xf7, 0xb2, 0x97, 0x19, 0xcb, - 0x15, 0x55, 0x95, 0xcd, 0x35, 0x42, 0xf8, 0x8a, 0x82, 0xef, 0x21, 0xd8, 0xfe, 0x1f, 0x0b, 0x4f, - 0x40, 0xb9, 0x2a, 0x61, 0xed, 0xa2, 0xb0, 0x86, 0xf5, 0x56, 0xc3, 0x64, 0x8d, 0x92, 0xc9, 0x08, - 0x34, 0x83, 0x9c, 0x8e, 0xe4, 0xc1, 0xc2, 0x7e, 0x93, 0x8f, 0xa1, 0xab, 0x56, 0xec, 0x26, 0xa8, - 0x16, 0xb1, 0x4d, 0xb6, 0x8a, 0x8b, 0xa3, 0xa1, 0x35, 0x67, 0x65, 0x50, 0x52, 0xa3, 0xdc, 0x5e, - 0x57, 0x66, 0x0a, 0xd4, 0x03, 0xd4, 0xb6, 0x88, 0x4f, 0xfc, 0x8b, 0x4b, 0x4d, 0x07, 0xe3, 0x9c, - 0xfa, 0x22, 0x55, 0x56, 0xdf, 0xf6, 0xbf, 0x5b, 0xb0, 0xb2, 0xe7, 0xfb, 0xb8, 0xee, 0x59, 0xc2, - 0x84, 0x5c, 0x65, 0xe3, 0x92, 0x55, 0xce, 0xfd, 0x92, 0xab, 0xfc, 0x95, 0x83, 0xc8, 0x04, 0x25, - 0xd8, 0x36, 0x74, 0x8b, 0x75, 0xd6, 0x9b, 0xd7, 0xfe, 0x0e, 0x10, 0x7e, 0xbd, 0x32, 0xd4, 0x51, - 0xc6, 0xda, 0x80, 0x35, 0x03, 0x4b, 0xc4, 0x9a, 0x4f, 0xe1, 0xee, 0x01, 0xcd, 0xf7, 0xd3, 0x8b, - 0x24, 0x8f, 0x65, 0x3a, 0xfb, 0x09, 0x4d, 0xe2, 0x2c, 0x90, 0x91, 0x8b, 0xce, 0x14, 0x7d, 0xfe, - 0xc9, 0x82, 0x7b, 0x33, 0x10, 0x12, 0x4b, 0xf8, 0xb2, 0x5a, 0x5f, 0xfa, 0x2d, 0xbd, 0xbd, 0x65, - 0x26, 0x2a, 0xbb, 0x0a, 0x22, 0xba, 0x0c, 0x14, 0xc9, 0xfe, 0x0f, 0x60, 0xd9, 0x1c, 0x7c, 0xad, - 0x50, 0x11, 0xc2, 0x9d, 0x4b, 0x84, 0x98, 0xc5, 0xe7, 0xee, 0xc0, 0xf2, 0xc0, 0x20, 0x21, 0x18, - 0x95, 0xa0, 0xf6, 0x3e, 0xbc, 0x7d, 0x29, 0x37, 0xa1, 0xb6, 0x89, 0x37, 0x74, 0xfb, 0x6f, 0x9b, - 0xb0, 0xf5, 0x22, 0xc8, 0x4f, 0xfd, 0xd4, 0x3b, 0x97, 0xde, 0x37, 0x8b, 0x90, 0xa5, 0xcb, 0x7b, - 0xa3, 0x5a, 0x6f, 0xb8, 0x0f, 0xab, 0x71, 0x44, 0xf1, 0x8e, 0xe1, 0x26, 0x5e, 0x96, 0x9d, 0xc7, - 0xa9, 0x3c, 0x4b, 0x57, 0xe2, 0x88, 0xb2, 0x7b, 0xc6, 0xa1, 0x00, 0x97, 0x4e, 0xe3, 0x66, 0xf9, - 0x34, 0xee, 0xc2, 0x5c, 0x12, 0x44, 0xe2, 0xcd, 0x84, 0xfd, 0x64, 0x67, 0x67, 0x9e, 0x7a, 0xbe, - 0x46, 0x59, 0x9c, 0x9d, 0x08, 0x55, 0x74, 0xf5, 0x2a, 0xfe, 0x42, 0xa9, 0x8a, 0xaf, 0xe9, 0x64, - 0xd1, 0xac, 0x5a, 0xdc, 0x80, 0xb6, 0xf8, 0xe9, 0xe6, 0xde, 0x50, 0x5c, 0x81, 0x40, 0x80, 0x9e, - 0x79, 0x43, 0x2d, 0x5b, 0x03, 0x23, 0x5b, 0xdb, 0x01, 0x38, 0xa1, 0xd4, 0x35, 0x2e, 0x43, 0xad, - 0x13, 0x4a, 0x79, 0xd0, 0x65, 0xa9, 0xf2, 0xb1, 0x17, 0xbd, 0x74, 0xb1, 0x06, 0xd1, 0xe1, 0xe2, - 0x30, 0xc0, 0xe7, 0xde, 0x08, 0x73, 0x62, 0x1c, 0x94, 0x32, 0x2d, 0x71, 0x8d, 0x32, 0xd8, 0x5e, - 0x51, 0x4d, 0x41, 0x94, 0x41, 0x90, 0x5f, 0xf4, 0x96, 0x8b, 0xf9, 0xfb, 0x41, 0x7e, 0xa1, 0xe6, - 0xa3, 0xce, 0xd2, 0x8b, 0xde, 0x4a, 0x31, 0x7f, 0x9f, 0x83, 0x98, 0x78, 0xd9, 0x79, 0x70, 0x42, - 0x79, 0x63, 0x48, 0x57, 0xb4, 0x4a, 0x31, 0xc8, 0x7e, 0xec, 0x63, 0x1a, 0x79, 0x1e, 0xa4, 0xda, - 0xe5, 0x74, 0x95, 0x5f, 0x61, 0x19, 0x50, 0xba, 0x86, 0x7d, 0x1f, 0xba, 0xd2, 0x5d, 0xf4, 0xde, - 0xc9, 0x94, 0x66, 0xe3, 0x30, 0x97, 0xbd, 0x93, 0xfc, 0xcb, 0x7e, 0x0f, 0xbb, 0x22, 0x3e, 0x8b, - 0x87, 0xc3, 0xe2, 0xfa, 0x24, 0x5c, 0x6b, 0x13, 0xe6, 0x43, 0x84, 0xcb, 0x29, 0xfc, 0xcb, 0x8e, - 0xb0, 0x9e, 0x53, 0x9a, 0x52, 0xbc, 0x5a, 0x04, 0xd1, 0x49, 0x2c, 0x6e, 0x0b, 0xf8, 0x9b, 0xed, - 0x45, 0x9f, 0x1e, 0x8f, 0x87, 0xb2, 0x07, 0x0a, 0x3f, 0x18, 0xe6, 0xb9, 0x97, 0x46, 0xe2, 0x40, - 0xc5, 0xdf, 0x0c, 0x93, 0xa6, 0x69, 0x9c, 0x8a, 0xd3, 0x93, 0x7f, 0xd8, 0x07, 0xb0, 0x75, 0xf4, - 0x7a, 0x22, 0x32, 0x42, 0xbc, 0x5a, 0x23, 0xb6, 0x3f, 0x7e, 0x3c, 0xfc, 0xeb, 0xb7, 0x60, 0xf9, - 0x20, 0xe6, 0x9b, 0xf1, 0x19, 0xf3, 0xc1, 0x94, 0x3c, 0x85, 0x05, 0xd1, 0xfc, 0x48, 0x36, 0x2b, - 0xdd, 0x90, 0xc8, 0xa3, 0xbf, 0x35, 0xa1, 0x4b, 0xd2, 0x5e, 0xfb, 0xe6, 0x5f, 0xfe, 0xed, 0xe7, - 0x8d, 0x25, 0xd2, 0x7e, 0x70, 0xf6, 0xde, 0x83, 0x21, 0xcd, 0x71, 0xb1, 0xa7, 0xb0, 0x64, 0xf4, - 0xab, 0x91, 0x6d, 0xa3, 0xe7, 0xac, 0xd4, 0xc6, 0xd6, 0xdf, 0x99, 0xda, 0x91, 0x66, 0xf7, 0x91, - 0xc5, 0x3a, 0x21, 0x82, 0x45, 0x86, 0x28, 0x9c, 0xf0, 0x57, 0xb0, 0xf2, 0x18, 0xab, 0x60, 0x8a, - 0x2a, 0xb9, 0x51, 0x50, 0xab, 0xed, 0xc3, 0xeb, 0xdf, 0x9c, 0x8c, 0x20, 0x38, 0x5e, 0x43, 0x8e, - 0x1b, 0x64, 0x8d, 0x71, 0xe4, 0x55, 0x36, 0xd5, 0xff, 0x46, 0x32, 0xe8, 0x8a, 0xce, 0x9e, 0x37, - 0xca, 0x73, 0x1b, 0x79, 0x6e, 0x92, 0x75, 0xc6, 0xd3, 0xe7, 0x0c, 0x0a, 0xa6, 0x31, 0x5e, 0xe2, - 0xf5, 0x4e, 0x34, 0x72, 0x7d, 0x62, 0x8b, 0x1a, 0x67, 0x79, 0xe3, 0x92, 0x16, 0x36, 0x73, 0x95, - 0x43, 0xca, 0x70, 0x55, 0x17, 0x1b, 0xf9, 0xb9, 0x85, 0x0e, 0x5e, 0xdb, 0x33, 0x49, 0xde, 0xbe, - 0xbc, 0x51, 0x93, 0xcb, 0x70, 0x77, 0xd6, 0x8e, 0x4e, 0xfb, 0x3b, 0x28, 0xcc, 0x75, 0xb2, 0x2d, - 0x84, 0x31, 0xba, 0x38, 0x65, 0x9f, 0x28, 0x19, 0x40, 0x47, 0x6f, 0x3f, 0x23, 0xd7, 0x6a, 0x5a, - 0x73, 0x14, 0xf3, 0xed, 0xfa, 0x41, 0xc1, 0xb0, 0x87, 0x0c, 0x09, 0xe9, 0x0a, 0x86, 0xaa, 0x5b, - 0x8d, 0x7c, 0x0d, 0x2b, 0xa5, 0xd6, 0x2d, 0x62, 0x97, 0xcc, 0x57, 0xd3, 0x86, 0xd7, 0x7f, 0x6b, - 0x2a, 0x8e, 0xe0, 0x7a, 0x1d, 0xb9, 0xf6, 0xec, 0x35, 0xcd, 0xca, 0x92, 0xf3, 0x87, 0xd6, 0x7d, - 0x92, 0xa1, 0x9d, 0xf5, 0x2e, 0xa3, 0x99, 0x78, 0xdf, 0xb8, 0xa4, 0x45, 0xa9, 0x62, 0x6b, 0xc9, - 0x13, 0xb7, 0x6b, 0x86, 0x9d, 0x1b, 0x5a, 0x6f, 0x1c, 0x46, 0xd9, 0x59, 0xf8, 0xee, 0xd4, 0xf7, - 0xd6, 0x89, 0xf6, 0xbe, 0xca, 0xce, 0x95, 0x5c, 0xe3, 0x3c, 0x21, 0x99, 0xd1, 0x7a, 0x28, 0x98, - 0x9a, 0x5e, 0x5d, 0xd3, 0xfc, 0x57, 0xbb, 0x52, 0xbd, 0x9b, 0x6f, 0xe2, 0x4a, 0xe3, 0x3c, 0xc9, - 0xc8, 0x2b, 0x58, 0xe6, 0xe1, 0xe2, 0xcd, 0x5b, 0x76, 0x07, 0xf9, 0x6e, 0xd9, 0xa4, 0x88, 0x19, - 0xba, 0x61, 0x5f, 0x40, 0x4b, 0x75, 0xc7, 0x90, 0x9e, 0xb6, 0x08, 0xa3, 0x0f, 0xab, 0x3f, 0xa1, - 0xcb, 0x46, 0x7a, 0xab, 0xbd, 0x24, 0x56, 0xc5, 0x7b, 0x66, 0x18, 0xe1, 0x9f, 0x01, 0x14, 0x6d, - 0x37, 0xe4, 0x6a, 0x85, 0xb2, 0xd2, 0x5c, 0xbf, 0x6e, 0x48, 0x36, 0x18, 0x23, 0xf9, 0x2e, 0x59, - 0x36, 0xc8, 0xcb, 0xfd, 0xa6, 0x2a, 0x41, 0xc6, 0x7e, 0x2b, 0x37, 0xea, 0xf4, 0x27, 0x77, 0x68, - 0x48, 0xa3, 0xd8, 0x72, 0xb3, 0xa9, 0x5b, 0x1e, 0x5b, 0xc1, 0x10, 0x4f, 0x0b, 0xad, 0x35, 0x64, - 0xbb, 0x8e, 0x4b, 0xed, 0x69, 0x51, 0xed, 0xf3, 0xb0, 0xaf, 0x22, 0xab, 0x35, 0xb2, 0x5a, 0x66, - 0x95, 0x91, 0x97, 0xf8, 0x07, 0x16, 0x5a, 0x67, 0x03, 0xd1, 0x69, 0x55, 0xdb, 0x3c, 0xfa, 0xd7, - 0x27, 0x0d, 0x4f, 0x38, 0x99, 0x44, 0x22, 0x88, 0x9b, 0x8a, 0x1b, 0x9c, 0xf7, 0x33, 0x18, 0x06, - 0x37, 0xda, 0x1e, 0xfa, 0x57, 0x6b, 0x46, 0x04, 0xf5, 0x0d, 0xa4, 0xbe, 0x42, 0x96, 0x54, 0x48, - 0x44, 0x5a, 0xdc, 0x26, 0xea, 0xa1, 0xc9, 0xb0, 0x49, 0xb9, 0x1b, 0xc1, 0x88, 0x81, 0x95, 0x9e, - 0x84, 0x4a, 0x0c, 0x54, 0x5d, 0x07, 0xe4, 0x0f, 0xcd, 0xe6, 0x06, 0xf9, 0xd8, 0x6a, 0x4f, 0x7d, - 0x1d, 0xad, 0xec, 0x96, 0x89, 0x2f, 0xa8, 0xf6, 0x0d, 0xe4, 0x7c, 0x95, 0x6c, 0x95, 0x39, 0x8b, - 0xd7, 0x58, 0xf2, 0x8d, 0x05, 0x6b, 0x35, 0x6f, 0x7d, 0x85, 0x04, 0x93, 0x5f, 0x26, 0x0b, 0x09, - 0xa6, 0x3d, 0x16, 0xda, 0x28, 0xc1, 0xb6, 0x8d, 0x12, 0x78, 0xbe, 0xaf, 0x24, 0x10, 0x79, 0x2d, - 0xf3, 0xcc, 0x3f, 0xb5, 0x60, 0xb3, 0xfe, 0x5d, 0x8f, 0xdc, 0x56, 0x2d, 0xdb, 0xd3, 0x5e, 0x1c, - 0xfb, 0x77, 0x2e, 0x43, 0x13, 0xd2, 0xdc, 0x46, 0x69, 0x6e, 0xd8, 0x7d, 0x26, 0x4d, 0x8a, 0xb8, - 0x75, 0x02, 0x9d, 0x63, 0x31, 0xc4, 0x7c, 0x39, 0x23, 0x5a, 0x6e, 0x51, 0xff, 0xc0, 0xd8, 0xbf, - 0x35, 0x05, 0xc3, 0x0c, 0x5f, 0x64, 0x43, 0x18, 0x04, 0x9f, 0x9b, 0xd4, 0x13, 0x9c, 0xd8, 0xa3, - 0xc5, 0xcb, 0x94, 0xb1, 0x47, 0x2b, 0x8f, 0x6d, 0xc6, 0x1e, 0xad, 0xbe, 0x7f, 0x55, 0xf6, 0x28, - 0x32, 0xc3, 0xb7, 0x30, 0xf2, 0x05, 0x6e, 0x1b, 0x51, 0x89, 0xeb, 0x95, 0xb7, 0x7a, 0x56, 0xb7, - 0x6d, 0xcc, 0x5a, 0x5b, 0x25, 0x54, 0xf2, 0x02, 0x1f, 0xd3, 0x9e, 0x03, 0x8b, 0x12, 0x9d, 0x6c, - 0x95, 0x09, 0x48, 0xca, 0xb5, 0x8f, 0x29, 0xf6, 0x16, 0x12, 0x5d, 0xb5, 0x3b, 0x3a, 0x51, 0x46, - 0xf3, 0x18, 0xda, 0xda, 0xc3, 0x01, 0x51, 0x41, 0xb6, 0xfa, 0x4e, 0xd2, 0xbf, 0x56, 0x3b, 0x66, - 0x86, 0x12, 0x7b, 0x85, 0x31, 0xc8, 0x10, 0x41, 0xf1, 0xf8, 0x7d, 0x58, 0x32, 0x6a, 0xf7, 0x85, - 0xf2, 0xeb, 0x5e, 0x17, 0x0a, 0xe5, 0xd7, 0x16, 0xfc, 0x65, 0xa2, 0x69, 0xa3, 0xf2, 0x33, 0x81, - 0xa2, 0x78, 0x7d, 0x09, 0x2d, 0x55, 0x32, 0x2f, 0xf4, 0x5f, 0xae, 0xa2, 0x5f, 0xc6, 0xc3, 0xb0, - 0xc1, 0x39, 0x9b, 0x7c, 0x1c, 0x8f, 0x8e, 0x85, 0xbe, 0xb4, 0x82, 0x70, 0xa1, 0xaf, 0x6a, 0x55, - 0xbc, 0xd0, 0x57, 0x5d, 0x05, 0xd9, 0xd0, 0xd7, 0x00, 0x11, 0xd4, 0x1a, 0x52, 0x58, 0x29, 0x15, - 0x62, 0x8b, 0xb4, 0xa2, 0xbe, 0xec, 0x5c, 0xa4, 0x15, 0x13, 0x2a, 0xb8, 0x66, 0xe2, 0xc6, 0xf9, - 0x79, 0x61, 0x58, 0xf8, 0x16, 0x0f, 0xf7, 0xbc, 0x4c, 0x69, 0xf8, 0xad, 0x51, 0x8f, 0x35, 0xfc, - 0xd6, 0xac, 0x69, 0x56, 0xc2, 0x3d, 0xe5, 0xb4, 0x9e, 0xc3, 0xa2, 0xac, 0x8f, 0x15, 0x4e, 0x5b, - 0xaa, 0x0c, 0xf6, 0x7b, 0xd5, 0x01, 0x41, 0xd5, 0x70, 0x5c, 0xcf, 0xf7, 0x91, 0xaa, 0x30, 0x84, - 0x56, 0x2d, 0x2b, 0x0c, 0x51, 0x2d, 0xb4, 0x15, 0x86, 0xa8, 0x2b, 0xaf, 0x19, 0x86, 0xe0, 0x91, - 0x4b, 0xf1, 0xf8, 0x3b, 0x0b, 0x6e, 0x5d, 0x5a, 0xec, 0x22, 0xef, 0xbe, 0x46, 0x5d, 0x8c, 0x0b, - 0xf4, 0xde, 0x6b, 0x57, 0xd2, 0xec, 0xbb, 0x28, 0xa6, 0x6d, 0xef, 0xc8, 0xc3, 0x14, 0xa7, 0xf9, - 0x1c, 0x5d, 0x95, 0xd5, 0x98, 0xd0, 0x7f, 0x63, 0xf1, 0x3f, 0x9f, 0x9b, 0x42, 0x97, 0xec, 0xce, - 0x28, 0x80, 0x14, 0xf8, 0xc1, 0xcc, 0xf8, 0x42, 0xdc, 0x3b, 0x28, 0xee, 0x4d, 0xfb, 0xda, 0x14, - 0x71, 0x99, 0xb0, 0x7f, 0x00, 0xd7, 0x54, 0x51, 0xcc, 0xa0, 0xfb, 0xe9, 0x38, 0xf2, 0xb3, 0xe2, - 0x5e, 0x3a, 0xa1, 0x72, 0x56, 0x38, 0x4e, 0xb9, 0x56, 0x62, 0x9e, 0x8f, 0xe7, 0x62, 0x94, 0x8b, - 0x71, 0xc2, 0x68, 0x33, 0xee, 0x09, 0xac, 0xca, 0x79, 0x9f, 0x06, 0x5e, 0xfe, 0x2b, 0xf3, 0xbc, - 0x89, 0x3c, 0xfb, 0xf6, 0x86, 0xce, 0xf3, 0x24, 0xf0, 0x72, 0xc5, 0x31, 0xc3, 0x37, 0x0e, 0xa3, - 0x0c, 0xa2, 0x5f, 0xbe, 0x6b, 0x0b, 0x24, 0xfa, 0xe5, 0xbb, 0xbe, 0x62, 0x63, 0x5e, 0xbe, 0x87, - 0x34, 0xe7, 0x15, 0x14, 0x5f, 0x30, 0x38, 0x83, 0xee, 0xd1, 0x44, 0xa6, 0x47, 0xbf, 0x34, 0x53, - 0x91, 0x03, 0xd9, 0xc8, 0x34, 0x2b, 0x31, 0xfd, 0xd0, 0xba, 0x7f, 0x3c, 0x8f, 0x7f, 0x17, 0xfc, - 0xfe, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x95, 0x64, 0xd9, 0x15, 0x4a, 0x3c, 0x00, 0x00, + // 4537 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7b, 0xcd, 0x6f, 0x1c, 0x57, + 0x72, 0x38, 0x66, 0x38, 0x22, 0x39, 0x35, 0x43, 0x72, 0xf8, 0xf8, 0x35, 0x1a, 0x92, 0xa2, 0xd4, + 0x5e, 0xc9, 0x92, 0xd7, 0xa6, 0x6c, 0x59, 0xbf, 0xdf, 0x3a, 0xeb, 0xcd, 0x26, 0x34, 0x2d, 0x73, + 0x15, 0x7b, 0x2d, 0xa6, 0xa9, 0x95, 0x00, 0x6f, 0xe0, 0x4e, 0x73, 0xfa, 0x71, 0xd8, 0x51, 0x4f, + 0x77, 0xbb, 0xbb, 0x87, 0xd4, 0x38, 0x01, 0x02, 0x18, 0x48, 0x90, 0x53, 0x72, 0x58, 0x04, 0xd8, + 0x43, 0x4e, 0x39, 0x06, 0xc8, 0x25, 0xc8, 0x29, 0x87, 0x45, 0xae, 0x41, 0x8e, 0xb9, 0xe4, 0x0f, + 0x08, 0x72, 0x4b, 0x02, 0x04, 0xc8, 0x25, 0xa7, 0xe0, 0xd5, 0xfb, 0xe8, 0xf7, 0xba, 0x7b, 0x86, + 0xa3, 0x5d, 0xad, 0x2f, 0xd2, 0x74, 0xbd, 0x7a, 0x55, 0xf5, 0xea, 0xd5, 0xab, 0x57, 0x55, 0xaf, + 0x08, 0xcd, 0x24, 0xee, 0xef, 0xc7, 0x49, 0x94, 0x45, 0x64, 0x7e, 0xd0, 0xcf, 0x92, 0xb8, 0xdf, + 0xdb, 0x19, 0x44, 0xd1, 0x20, 0xa0, 0xf7, 0xdd, 0xd8, 0xbf, 0xef, 0x86, 0x61, 0x94, 0xb9, 0x99, + 0x1f, 0x85, 0x29, 0xc7, 0xb2, 0x3a, 0xb0, 0x7c, 0x44, 0xb3, 0xc7, 0xe1, 0x59, 0x64, 0xd3, 0xaf, + 0x46, 0x34, 0xcd, 0xac, 0xbf, 0x6f, 0xc0, 0x8a, 0x02, 0xa5, 0x71, 0x14, 0xa6, 0x94, 0x6c, 0xc2, + 0xfc, 0x28, 0xce, 0xfc, 0x21, 0xed, 0xd6, 0x6e, 0xd6, 0xee, 0x36, 0x6d, 0xf1, 0x45, 0xee, 0xc3, + 0x9a, 0x7b, 0xe1, 0xfa, 0x81, 0x7b, 0x1a, 0x50, 0x87, 0xbe, 0xec, 0x9f, 0xbb, 0xe1, 0x80, 0xa6, + 0xdd, 0xfa, 0xcd, 0xda, 0xdd, 0x39, 0x9b, 0xa8, 0xa1, 0x47, 0x72, 0x84, 0x7c, 0x17, 0x56, 0x69, + 0xc8, 0x40, 0x9e, 0x86, 0x3e, 0x87, 0xe8, 0x1d, 0x31, 0x90, 0x23, 0x3f, 0x84, 0x4d, 0x8f, 0x9e, + 0xb9, 0xa3, 0x20, 0x73, 0xce, 0xa2, 0x84, 0xbe, 0x74, 0xe2, 0x24, 0xba, 0xf0, 0x3d, 0x9a, 0x74, + 0x1b, 0x28, 0xc5, 0xba, 0x18, 0xfd, 0x84, 0x0d, 0x1e, 0x8b, 0x31, 0xf2, 0x00, 0x36, 0xd4, 0x2c, + 0xdf, 0xcd, 0x9c, 0xfe, 0x28, 0x49, 0x68, 0xd8, 0x1f, 0x77, 0xaf, 0xe1, 0xa4, 0x35, 0x39, 0xc9, + 0x77, 0xb3, 0x43, 0x31, 0x44, 0x9e, 0x43, 0x27, 0x1d, 0x9d, 0xa6, 0xe3, 0x34, 0xa3, 0x43, 0x27, + 0xcd, 0xdc, 0x6c, 0x94, 0x76, 0xe7, 0x6f, 0xce, 0xdd, 0x6d, 0x3d, 0x78, 0x7b, 0x9f, 0xab, 0x71, + 0xbf, 0xa0, 0x92, 0xfd, 0x13, 0x89, 0x7f, 0x82, 0xe8, 0x8f, 0xc2, 0x2c, 0x19, 0xdb, 0x2b, 0xa9, + 0x09, 0x25, 0x9f, 0xc3, 0x52, 0x12, 0xf7, 0x1d, 0x1a, 0x7a, 0x71, 0xe4, 0x87, 0x59, 0xda, 0x5d, + 0x40, 0xaa, 0xf7, 0x26, 0x51, 0xb5, 0xe3, 0xfe, 0x23, 0x89, 0xcb, 0x49, 0xb6, 0x13, 0x0d, 0xd4, + 0xfb, 0x08, 0xd6, 0xab, 0x18, 0x93, 0x0e, 0xcc, 0xbd, 0xa0, 0x63, 0xb1, 0x3b, 0xec, 0x27, 0x59, + 0x87, 0x6b, 0x17, 0x6e, 0x30, 0xa2, 0xb8, 0x19, 0x8b, 0x36, 0xff, 0xf8, 0x7e, 0xfd, 0x83, 0x5a, + 0xef, 0x29, 0xac, 0x96, 0xd8, 0x54, 0x10, 0xb8, 0xa7, 0x13, 0x68, 0x3d, 0x58, 0x93, 0x22, 0xdb, + 0xc7, 0x87, 0x72, 0xae, 0x46, 0xd5, 0xba, 0x05, 0x7b, 0x47, 0x34, 0x3b, 0x8c, 0x86, 0xc3, 0x51, + 0xe8, 0xf7, 0xd1, 0xc6, 0x6c, 0x1a, 0xb8, 0x63, 0x9a, 0xa4, 0xd2, 0xb2, 0x3e, 0x87, 0xf5, 0xaa, + 0x71, 0xd2, 0x85, 0x05, 0xb1, 0xf7, 0xc8, 0x7f, 0xd1, 0x96, 0x9f, 0x64, 0x07, 0x9a, 0xfd, 0x28, + 0x0c, 0x69, 0x3f, 0xa3, 0x9e, 0x58, 0x48, 0x0e, 0xb0, 0xfe, 0xb4, 0x0e, 0x37, 0x27, 0xf3, 0x14, + 0xa6, 0xfb, 0x35, 0x6c, 0xf6, 0x75, 0x04, 0x27, 0x11, 0x18, 0xdd, 0x1a, 0x6e, 0xc5, 0xa1, 0xb6, + 0x15, 0x53, 0x29, 0xed, 0x57, 0x8e, 0xf2, 0x4d, 0xda, 0xe8, 0x57, 0x8d, 0xf5, 0xce, 0xa0, 0x37, + 0x79, 0x52, 0x85, 0xca, 0x1f, 0x98, 0x2a, 0xdf, 0x91, 0xa2, 0x55, 0x11, 0xd1, 0x75, 0xff, 0x3d, + 0xd8, 0x3a, 0xa2, 0x21, 0x4d, 0xfc, 0xbe, 0x32, 0x0e, 0xa1, 0x73, 0xa6, 0x41, 0x65, 0x93, 0x82, + 0x55, 0x0e, 0xb0, 0x7a, 0xd0, 0x2d, 0x4f, 0xe4, 0xcb, 0xb5, 0x36, 0x61, 0xfd, 0x88, 0x66, 0x0a, + 0xae, 0x76, 0xf1, 0x17, 0x35, 0xd8, 0xc0, 0x81, 0xf4, 0x34, 0x1d, 0xf3, 0x01, 0xa1, 0xea, 0xdf, + 0x87, 0x55, 0x45, 0x3a, 0x95, 0xc7, 0x88, 0x6b, 0xf9, 0x7d, 0x4d, 0xcb, 0xe5, 0x99, 0xf9, 0x61, + 0x4a, 0xf5, 0xd3, 0x94, 0x9f, 0x49, 0x01, 0xee, 0x1d, 0xc2, 0x46, 0x25, 0xea, 0xab, 0xd8, 0xbf, + 0xd5, 0x85, 0xcd, 0x23, 0x9a, 0x69, 0x66, 0xac, 0x19, 0x68, 0x4b, 0x03, 0x33, 0xbb, 0x4c, 0x33, + 0x37, 0xc9, 0x72, 0xbb, 0x14, 0x9f, 0xe4, 0x36, 0x2c, 0x07, 0x7e, 0x9a, 0xd1, 0xd0, 0x71, 0x3d, + 0x2f, 0xa1, 0x29, 0x77, 0x79, 0x4d, 0x7b, 0x89, 0x43, 0x0f, 0x38, 0xd0, 0xfa, 0x87, 0x1a, 0xdb, + 0x98, 0x02, 0x2b, 0xa1, 0xac, 0xcf, 0xa0, 0x99, 0x7b, 0x05, 0xae, 0xa4, 0x7d, 0x4d, 0x49, 0x55, + 0x73, 0xf6, 0x0b, 0xae, 0x21, 0x27, 0xd0, 0xfb, 0x5d, 0x58, 0x7e, 0xdd, 0x07, 0xfa, 0x03, 0xe8, + 0x09, 0xdb, 0x90, 0x1e, 0xf9, 0x73, 0x77, 0x48, 0xa5, 0x5d, 0xf5, 0x60, 0x51, 0x3a, 0x70, 0xc1, + 0x43, 0x7d, 0x5b, 0xbb, 0xb0, 0x5d, 0x39, 0x53, 0x18, 0xd6, 0x7d, 0x58, 0x3b, 0xa2, 0x99, 0x72, + 0xf3, 0x92, 0xe2, 0x44, 0x2f, 0x60, 0x3d, 0x44, 0x4b, 0xd4, 0x26, 0x08, 0x15, 0xee, 0x40, 0x33, + 0xbf, 0x44, 0x84, 0x6d, 0x2b, 0x80, 0xf5, 0x00, 0xcd, 0x54, 0xce, 0x7a, 0xf2, 0xf4, 0xd8, 0xa6, + 0x7c, 0xda, 0x75, 0x58, 0x8c, 0xb2, 0xd8, 0xe9, 0x47, 0x9e, 0x14, 0x7d, 0x21, 0xca, 0xe2, 0xc3, + 0xc8, 0xa3, 0xc2, 0x34, 0xb4, 0x39, 0xca, 0x34, 0xfe, 0x9a, 0x6f, 0xa5, 0x39, 0x24, 0xe4, 0xf8, + 0x1d, 0x68, 0x4a, 0x82, 0x72, 0x2b, 0xdf, 0xd1, 0xb6, 0xb2, 0x6a, 0xce, 0xfe, 0x13, 0xce, 0x51, + 0xec, 0xe4, 0xa2, 0x10, 0x20, 0xed, 0x7d, 0x08, 0x4b, 0xc6, 0xd0, 0x55, 0x96, 0xdd, 0xd4, 0xb7, + 0xec, 0x21, 0x6c, 0x7e, 0xec, 0xa7, 0xfa, 0x8d, 0x3b, 0xcb, 0x76, 0x7d, 0x09, 0xcb, 0xc7, 0xae, + 0x9f, 0xa4, 0x27, 0xa3, 0x38, 0x8e, 0xd0, 0xbc, 0xdf, 0x84, 0x95, 0xfc, 0x5a, 0x8f, 0xd9, 0x98, + 0x98, 0xb4, 0xac, 0xc0, 0x38, 0x83, 0xbc, 0x01, 0x4b, 0xf2, 0x3a, 0xe7, 0x68, 0x5c, 0xa4, 0xb6, + 0x00, 0x22, 0x92, 0xf5, 0x4d, 0xc3, 0x50, 0x9d, 0x11, 0x58, 0x10, 0x68, 0x84, 0xae, 0x0a, 0x2b, + 0xf0, 0xb7, 0x6e, 0x08, 0x75, 0xf3, 0x3a, 0xe8, 0xc2, 0xc2, 0x05, 0x4d, 0x4e, 0xa3, 0x94, 0x62, + 0xcc, 0xb0, 0x68, 0xcb, 0x4f, 0x26, 0xc8, 0x28, 0xf5, 0xc3, 0x81, 0x93, 0xba, 0xa1, 0x77, 0x1a, + 0xbd, 0xc4, 0x08, 0x61, 0xd1, 0x6e, 0x23, 0xf0, 0x84, 0xc3, 0xc8, 0x2d, 0x68, 0x9f, 0x67, 0x59, + 0xec, 0xb0, 0xd0, 0x25, 0x1a, 0x65, 0x22, 0x20, 0x68, 0x31, 0xd8, 0x53, 0x0e, 0x62, 0x07, 0x1b, + 0x51, 0x46, 0x29, 0x4d, 0xdc, 0x01, 0x0d, 0xb3, 0xee, 0x3c, 0x3f, 0xd8, 0x0c, 0xfa, 0x13, 0x09, + 0x24, 0xbb, 0x00, 0x88, 0x16, 0x27, 0xd1, 0xcb, 0x71, 0x77, 0x81, 0x9b, 0x1e, 0x83, 0x1c, 0x33, + 0x00, 0xd3, 0xdf, 0xa9, 0x9b, 0x52, 0x19, 0x7a, 0xf8, 0x34, 0xed, 0x2e, 0x72, 0xfd, 0x31, 0xf0, + 0xa1, 0x82, 0x12, 0x87, 0xc5, 0x1d, 0x42, 0xeb, 0x8e, 0x9b, 0xa6, 0x34, 0x4b, 0xbb, 0x4d, 0x34, + 0xa0, 0x87, 0x15, 0x06, 0x54, 0x88, 0x3f, 0xc4, 0xbc, 0x03, 0x9c, 0xa6, 0xe2, 0x0f, 0x03, 0xca, + 0xe2, 0x2d, 0x77, 0x94, 0x9d, 0xd3, 0x30, 0x63, 0xb7, 0x07, 0x63, 0x12, 0xfb, 0x5d, 0x40, 0xdd, + 0x74, 0x8c, 0x81, 0x83, 0xd8, 0xef, 0x7d, 0xc1, 0x82, 0x8b, 0x32, 0xd5, 0x0a, 0x13, 0x7c, 0xdb, + 0x74, 0x25, 0x9b, 0x52, 0x58, 0xd3, 0x8e, 0x74, 0xd3, 0xbc, 0x84, 0xce, 0x11, 0xcd, 0x9e, 0xfa, + 0xfd, 0x17, 0x34, 0x99, 0xc1, 0x28, 0xc9, 0x5d, 0x68, 0x30, 0x8b, 0x12, 0x0c, 0xd6, 0xd5, 0x4d, + 0x28, 0x22, 0x36, 0xc6, 0xc8, 0x46, 0x0c, 0xb6, 0x17, 0xa8, 0x39, 0x27, 0x1b, 0xc7, 0xdc, 0x2e, + 0x9a, 0x76, 0x13, 0x21, 0x4f, 0xc7, 0x31, 0xb5, 0x9e, 0x41, 0x5b, 0x9f, 0xc4, 0x9c, 0x86, 0x47, + 0x03, 0x7f, 0xe8, 0x67, 0x34, 0x91, 0x4e, 0x43, 0x01, 0x98, 0x3d, 0xb2, 0x2d, 0x12, 0x76, 0x8c, + 0xbf, 0xd9, 0x79, 0xfb, 0x6a, 0x14, 0x65, 0x92, 0x36, 0xff, 0xb0, 0xfe, 0xb2, 0x0e, 0xcb, 0x72, + 0x39, 0xc2, 0x98, 0xa5, 0xcc, 0xb5, 0x2b, 0x65, 0xbe, 0x05, 0xed, 0xc0, 0x4d, 0x33, 0x67, 0x14, + 0x7b, 0xae, 0x0c, 0x6d, 0xe6, 0xec, 0x16, 0x83, 0xfd, 0x84, 0x83, 0x98, 0x45, 0xcb, 0xc8, 0x15, + 0xcf, 0x96, 0xe0, 0xde, 0xee, 0xeb, 0x8b, 0x21, 0xd0, 0x60, 0x73, 0xd0, 0xda, 0x6b, 0x36, 0xfe, + 0x66, 0xb0, 0x73, 0x7f, 0x70, 0x8e, 0xd6, 0x5d, 0xb3, 0xf1, 0x37, 0xdb, 0xc1, 0x20, 0xba, 0x44, + 0x5b, 0xae, 0xd9, 0xec, 0x27, 0x83, 0x9c, 0xfa, 0x1e, 0x9a, 0x6e, 0xcd, 0x66, 0x3f, 0x19, 0xc4, + 0x4d, 0x5f, 0xa0, 0xa1, 0xd6, 0x6c, 0xf6, 0x93, 0x45, 0xfd, 0x17, 0x51, 0x30, 0x1a, 0xd2, 0x6e, + 0x13, 0x81, 0xe2, 0x8b, 0x6c, 0x43, 0x33, 0x4e, 0xfc, 0x3e, 0x75, 0xdc, 0xec, 0x1c, 0x8d, 0xa9, + 0x66, 0x2f, 0x22, 0xe0, 0x20, 0x3b, 0xb7, 0xd6, 0x60, 0x55, 0x6d, 0xb4, 0xf2, 0x9e, 0xcf, 0x61, + 0x41, 0x40, 0xa6, 0x6e, 0xfa, 0xbb, 0xb0, 0x90, 0x71, 0xb4, 0x6e, 0x1d, 0x4f, 0x81, 0x32, 0x2c, + 0x53, 0xd3, 0xb6, 0x44, 0xb3, 0x7e, 0x0b, 0x88, 0xce, 0x4d, 0x6c, 0xc4, 0xbd, 0x9c, 0x0e, 0x77, + 0xc7, 0x2b, 0x26, 0x9d, 0x34, 0x27, 0xf0, 0x35, 0x5e, 0x46, 0x4f, 0x12, 0x8f, 0x39, 0x92, 0xe8, + 0xc5, 0xb7, 0x6a, 0x9a, 0x3f, 0x86, 0x25, 0xc5, 0xf8, 0x71, 0x46, 0x87, 0x4c, 0xe1, 0xee, 0x30, + 0x1a, 0x85, 0x19, 0xf2, 0xac, 0xd9, 0xe2, 0x8b, 0x59, 0x20, 0xea, 0x17, 0x59, 0xd6, 0x6c, 0xfe, + 0x41, 0x96, 0xa1, 0xee, 0x7b, 0x22, 0x79, 0xaa, 0xfb, 0x9e, 0xf5, 0xbf, 0x35, 0x58, 0xd5, 0x16, + 0xf2, 0xca, 0x46, 0x59, 0xb2, 0xb8, 0x7a, 0x85, 0xc5, 0xdd, 0x83, 0xc6, 0xa9, 0xef, 0xb1, 0x9c, + 0x8d, 0xe9, 0x75, 0x43, 0x92, 0x33, 0xd6, 0x61, 0x23, 0x0a, 0x43, 0x75, 0xd3, 0x17, 0x69, 0xb7, + 0x31, 0x15, 0x95, 0xa1, 0x94, 0xce, 0xc3, 0xb5, 0xf2, 0x79, 0x30, 0x75, 0x39, 0x5f, 0xd4, 0x25, + 0x8f, 0x56, 0x15, 0x6d, 0x65, 0x79, 0x7d, 0x80, 0x1c, 0x38, 0x75, 0x5b, 0x7f, 0x03, 0x20, 0x52, + 0x98, 0xc2, 0xfe, 0xae, 0x97, 0x84, 0x56, 0x26, 0xa8, 0x21, 0x5b, 0x9f, 0x62, 0xa8, 0xa1, 0x33, + 0x17, 0xca, 0x7f, 0x60, 0xd0, 0xe4, 0xb6, 0x48, 0x4a, 0x34, 0x53, 0x83, 0xd8, 0xfb, 0x48, 0xec, + 0xa0, 0xdf, 0x67, 0x5b, 0xaf, 0x25, 0xe6, 0x53, 0xef, 0xf0, 0x67, 0xb0, 0x20, 0x66, 0x08, 0xb3, + 0xe0, 0x08, 0x75, 0xdf, 0x23, 0x1f, 0x02, 0x68, 0xf7, 0x10, 0x5f, 0xd7, 0xb6, 0x94, 0x41, 0x4c, + 0x92, 0xd6, 0x80, 0xec, 0x34, 0x74, 0xeb, 0x0c, 0xd6, 0x2a, 0x50, 0x98, 0x28, 0x2a, 0xad, 0x16, + 0xa2, 0xc8, 0x6f, 0xb2, 0x07, 0xad, 0x2c, 0xca, 0xdc, 0xc0, 0xc9, 0x6f, 0x88, 0x9a, 0x0d, 0x08, + 0x7a, 0xc6, 0x20, 0xe8, 0xa0, 0xa2, 0x80, 0x5b, 0x2e, 0x73, 0x50, 0x51, 0xe0, 0x59, 0x2e, 0x06, + 0x5e, 0xc6, 0xa2, 0x85, 0x0a, 0xa7, 0x6d, 0xd9, 0x77, 0x61, 0xd1, 0xe5, 0x53, 0xe4, 0xc2, 0x56, + 0x0a, 0x0b, 0xb3, 0x15, 0x82, 0x45, 0xf0, 0x06, 0x3a, 0x8c, 0xc2, 0x33, 0x7f, 0x20, 0xad, 0xe3, + 0x4d, 0x74, 0x56, 0x12, 0x96, 0xc7, 0x24, 0x9e, 0x9b, 0xb9, 0xc8, 0xad, 0x6d, 0xe3, 0x6f, 0xeb, + 0x4f, 0x6a, 0xd0, 0x39, 0x8e, 0x92, 0xec, 0x2c, 0x0a, 0xfc, 0x48, 0x84, 0xf7, 0x2c, 0x1c, 0x91, + 0xe1, 0xbf, 0x88, 0x23, 0xc5, 0x27, 0xf3, 0x90, 0xfd, 0xc8, 0x0f, 0xb9, 0xad, 0xd6, 0x85, 0x82, + 0x22, 0x3f, 0x64, 0xa6, 0x4a, 0x6e, 0x42, 0xcb, 0xa3, 0x69, 0x3f, 0xf1, 0x63, 0x96, 0xce, 0x09, + 0xb7, 0xa0, 0x83, 0x18, 0xe1, 0x53, 0x37, 0x70, 0xc3, 0x3e, 0x15, 0x9e, 0x5d, 0x7e, 0x5a, 0x1b, + 0xe8, 0xae, 0x94, 0x24, 0x5a, 0x66, 0x6d, 0x82, 0xc5, 0x52, 0xfe, 0x3f, 0x34, 0x63, 0x09, 0x14, + 0xe6, 0xd7, 0x55, 0x77, 0x75, 0x61, 0x39, 0x76, 0x8e, 0x6a, 0xed, 0xb0, 0xd8, 0x3f, 0xa7, 0x77, + 0x32, 0x1a, 0x0e, 0xdd, 0x64, 0x2c, 0xb9, 0x85, 0xd0, 0x38, 0x8c, 0xfc, 0x90, 0x29, 0x8a, 0x2d, + 0x4a, 0x06, 0x6f, 0xec, 0xb7, 0x2e, 0x7a, 0xdd, 0x10, 0x5d, 0xd7, 0xd6, 0x9c, 0xa9, 0xad, 0x1b, + 0x00, 0x31, 0x4d, 0xfa, 0x34, 0xcc, 0xdc, 0x81, 0x5c, 0xb1, 0x06, 0xb1, 0xce, 0x81, 0x3c, 0x39, + 0x3b, 0x0b, 0xfc, 0x90, 0x32, 0xb6, 0x42, 0x98, 0x29, 0xda, 0x9f, 0x2c, 0x83, 0xc9, 0x69, 0xae, + 0xc4, 0xe9, 0xc7, 0xb0, 0xfa, 0x24, 0xac, 0x60, 0x24, 0xc9, 0xd5, 0xa6, 0x91, 0xab, 0x97, 0xc8, + 0xfd, 0x08, 0xda, 0x9a, 0xe0, 0x29, 0xf9, 0x00, 0x9a, 0x42, 0x46, 0x95, 0x28, 0xf4, 0x94, 0x37, + 0x28, 0xad, 0xd0, 0xce, 0x91, 0xad, 0x9f, 0xd7, 0xa0, 0x95, 0x4b, 0x96, 0x92, 0x87, 0x70, 0x8d, + 0xa9, 0x5b, 0x52, 0xb9, 0xa1, 0xa8, 0xe4, 0x38, 0xfb, 0xf8, 0x2f, 0x8f, 0x0b, 0x39, 0x72, 0xef, + 0x04, 0x20, 0x07, 0x56, 0x84, 0x75, 0xf7, 0xcd, 0xb0, 0xee, 0x7a, 0x99, 0xaa, 0x14, 0x4d, 0x8b, + 0xec, 0xfe, 0xb9, 0xc1, 0xd2, 0xbd, 0x0a, 0x63, 0x11, 0x36, 0xf8, 0x0e, 0xb4, 0xf8, 0x59, 0x60, + 0x1e, 0x40, 0x0a, 0xdc, 0xce, 0x4b, 0x1b, 0x7e, 0x68, 0x03, 0x9e, 0x0d, 0x1c, 0x27, 0xef, 0xc1, + 0x12, 0x0a, 0xeb, 0x44, 0x5c, 0x21, 0xe2, 0x60, 0x9b, 0x13, 0xda, 0x88, 0x22, 0x54, 0x46, 0x62, + 0xd8, 0x30, 0xa6, 0x38, 0x29, 0x17, 0x41, 0x5c, 0x52, 0x3f, 0xd0, 0x42, 0xe9, 0x49, 0x52, 0x72, + 0x65, 0x09, 0x82, 0x62, 0x8c, 0xab, 0x6e, 0xad, 0x5f, 0x1e, 0x21, 0xf7, 0xa1, 0x2d, 0x38, 0xa2, + 0x66, 0xc4, 0x15, 0x67, 0xca, 0xd8, 0xe2, 0x13, 0x11, 0x81, 0x0c, 0x61, 0x5d, 0x9f, 0xa0, 0x24, + 0xbc, 0x86, 0x13, 0x3f, 0x9c, 0x5d, 0xc2, 0xb0, 0x24, 0x20, 0xe9, 0x97, 0x06, 0x7a, 0xbf, 0x07, + 0xdd, 0x49, 0x0b, 0xaa, 0xd8, 0xf6, 0xb7, 0xcc, 0x6d, 0x5f, 0xaf, 0x30, 0xc9, 0x54, 0x2f, 0x20, + 0x7e, 0x01, 0x5b, 0x13, 0x84, 0x79, 0x85, 0xaa, 0x83, 0x66, 0xa9, 0xba, 0x35, 0xfd, 0x45, 0x0d, + 0x7a, 0x07, 0x9e, 0x57, 0x72, 0x4e, 0x79, 0x91, 0xe0, 0xdb, 0x76, 0xb9, 0xbb, 0xb0, 0x5d, 0x29, + 0x90, 0xa8, 0x66, 0xbc, 0x84, 0x5d, 0x9b, 0x0e, 0xa3, 0x0b, 0xfa, 0x6d, 0x8b, 0x6c, 0xdd, 0x84, + 0x1b, 0x93, 0x38, 0x0b, 0xd9, 0xb0, 0xbc, 0x67, 0x96, 0xc7, 0x55, 0x60, 0xf4, 0x1f, 0x35, 0x58, + 0x32, 0x0b, 0xe7, 0xaf, 0x2b, 0x17, 0x7f, 0x1b, 0x48, 0x42, 0xd3, 0xcc, 0x49, 0xa2, 0x20, 0x60, + 0x29, 0xb9, 0x47, 0x03, 0x77, 0x2c, 0x4a, 0xf6, 0x1d, 0x36, 0x62, 0xf3, 0x81, 0x8f, 0x19, 0x9c, + 0x6c, 0xc1, 0x82, 0x1b, 0xfb, 0x0e, 0xb3, 0x1a, 0x9e, 0x8f, 0xcf, 0xbb, 0xb1, 0xff, 0x29, 0x1d, + 0x13, 0x0b, 0x96, 0xc4, 0x80, 0x13, 0xd0, 0x0b, 0x1a, 0x60, 0xcc, 0x37, 0x67, 0xb7, 0xf8, 0xf0, + 0x67, 0x0c, 0x44, 0xee, 0x41, 0x27, 0x4e, 0x7c, 0x66, 0x7e, 0xf9, 0xdb, 0xc0, 0x02, 0x4a, 0xb3, + 0x22, 0xe0, 0x72, 0x75, 0xd6, 0x4f, 0xe1, 0x7a, 0x85, 0x2e, 0x84, 0x8f, 0xfa, 0x21, 0xac, 0x98, + 0x2f, 0x0c, 0xd2, 0x4f, 0xa9, 0xa8, 0xd5, 0x98, 0x68, 0x2f, 0x9f, 0x19, 0x74, 0x44, 0xf4, 0x89, + 0x38, 0xb6, 0x9b, 0xa9, 0x9a, 0x96, 0xf5, 0x15, 0xac, 0xe7, 0xc0, 0xc3, 0x28, 0xbc, 0xa0, 0x49, + 0xca, 0xac, 0x8d, 0x40, 0xe3, 0x2c, 0x89, 0x64, 0x41, 0x16, 0x7f, 0xb3, 0xb8, 0x2d, 0x8b, 0x84, + 0x19, 0xd4, 0xb3, 0x88, 0xe1, 0x24, 0x6e, 0x26, 0x6f, 0x29, 0xfc, 0xcd, 0xe2, 0x64, 0x1f, 0x89, + 0x50, 0x07, 0xc7, 0xb8, 0xa9, 0xb6, 0x04, 0x8c, 0x71, 0xb1, 0x9e, 0x61, 0xf8, 0xa8, 0x8b, 0x22, + 0xd6, 0xf8, 0x9b, 0xd0, 0xe2, 0x6b, 0x64, 0x33, 0xe5, 0xfa, 0x76, 0x8c, 0xf5, 0x15, 0xc4, 0xb4, + 0xe1, 0x4c, 0x41, 0xad, 0xff, 0xaa, 0x43, 0x1b, 0x23, 0xd6, 0x8f, 0x69, 0xe6, 0xfa, 0xc1, 0xf4, + 0x58, 0x9a, 0xc7, 0xa0, 0x75, 0x15, 0x83, 0xbe, 0x01, 0x4b, 0x7a, 0x41, 0x64, 0x2c, 0x93, 0x59, + 0xad, 0x1c, 0x32, 0x26, 0xb7, 0x61, 0x19, 0x53, 0xeb, 0x1c, 0x8b, 0xdb, 0xcc, 0x12, 0x42, 0x15, + 0x9a, 0x99, 0x08, 0x5c, 0x2b, 0x24, 0x02, 0x6c, 0x18, 0x83, 0x69, 0x27, 0xf5, 0x3d, 0x95, 0x27, + 0x20, 0xe4, 0xc4, 0xf7, 0xb4, 0x61, 0x9c, 0xbd, 0xa0, 0x0d, 0xe3, 0x6c, 0x96, 0x03, 0x25, 0x94, + 0x3f, 0x14, 0xe0, 0x7b, 0xd7, 0x22, 0x1a, 0x5d, 0x5b, 0x02, 0x9f, 0xfa, 0x43, 0x7c, 0x0d, 0x13, + 0xc5, 0xed, 0x26, 0xb7, 0x58, 0xfe, 0x95, 0xa7, 0x69, 0xa0, 0xa7, 0x69, 0x79, 0x52, 0xd7, 0x32, + 0x92, 0xba, 0x3d, 0x68, 0x45, 0x31, 0x0d, 0x1d, 0x91, 0x62, 0xb7, 0x79, 0xf4, 0xc0, 0x40, 0xcf, + 0x10, 0x22, 0x4a, 0x26, 0xa8, 0xf3, 0x74, 0x96, 0xbc, 0xd4, 0x54, 0x4c, 0xbd, 0xa8, 0x18, 0x99, + 0x08, 0xce, 0x5d, 0x95, 0x08, 0x5a, 0x07, 0x18, 0x15, 0x4b, 0xc6, 0xc2, 0x7c, 0xde, 0x86, 0x79, + 0x54, 0x93, 0xb4, 0x9c, 0x75, 0x23, 0x8d, 0x11, 0x46, 0x61, 0x0b, 0x1c, 0xeb, 0x47, 0xf8, 0x86, + 0x88, 0x43, 0xb3, 0x88, 0x7e, 0x1d, 0x16, 0xf9, 0xae, 0x28, 0xab, 0x59, 0xc0, 0xef, 0xc7, 0x9e, + 0xf5, 0xaf, 0x35, 0x20, 0x27, 0xa3, 0xd3, 0xa1, 0x3f, 0x3b, 0xb5, 0xd9, 0x13, 0x74, 0x02, 0x0d, + 0x34, 0x13, 0x6e, 0x8e, 0xf8, 0xbb, 0x60, 0x21, 0x8d, 0xa2, 0x85, 0xe4, 0xdb, 0x79, 0xad, 0x3a, + 0x47, 0x9f, 0xd7, 0x37, 0x9f, 0xb9, 0xf8, 0xc0, 0xa7, 0x61, 0xe6, 0x88, 0x62, 0x0b, 0x73, 0xf1, + 0x08, 0x78, 0xec, 0x59, 0x27, 0xb0, 0x66, 0xac, 0x4c, 0x68, 0xfa, 0x16, 0xb4, 0xb9, 0x00, 0x71, + 0xe0, 0xf6, 0x55, 0x35, 0xbc, 0x85, 0xb0, 0x63, 0x04, 0x4d, 0xd3, 0xd7, 0x9f, 0xd5, 0x60, 0xfd, + 0xc4, 0x1f, 0x8e, 0x02, 0x37, 0xa3, 0xbf, 0x06, 0x8d, 0xe5, 0xcb, 0x9f, 0x33, 0x96, 0x2f, 0x35, + 0xd9, 0xc8, 0x35, 0x69, 0xfd, 0x77, 0x0d, 0x36, 0x0a, 0xa2, 0xa8, 0x98, 0xd0, 0x34, 0xa6, 0x09, + 0xc5, 0x01, 0x81, 0xa4, 0x31, 0xad, 0x1b, 0x4c, 0xdf, 0x80, 0xa5, 0xa1, 0x1f, 0xfa, 0xc3, 0xd1, + 0xd0, 0xe1, 0xba, 0xe7, 0x32, 0xb5, 0x05, 0xf0, 0x18, 0xb7, 0x80, 0x21, 0xb9, 0x2f, 0x35, 0xa4, + 0x86, 0x40, 0xe2, 0x40, 0x8e, 0xf4, 0x2e, 0xac, 0xe7, 0x71, 0xbb, 0x33, 0x70, 0xfd, 0xd0, 0x09, + 0xa2, 0x34, 0x15, 0x7b, 0x4c, 0xf2, 0xb1, 0x23, 0xd7, 0x0f, 0x3f, 0x8b, 0xd2, 0x54, 0x73, 0x02, + 0xf3, 0xba, 0x13, 0x60, 0x01, 0x4c, 0xe7, 0xf9, 0xb9, 0x1b, 0xd0, 0x8f, 0xa2, 0xe1, 0xe9, 0xeb, + 0xd5, 0xfd, 0x2d, 0x68, 0xf3, 0xba, 0x5b, 0xe6, 0x26, 0x03, 0x2a, 0x77, 0xa0, 0x85, 0xb0, 0xa7, + 0x08, 0xaa, 0xdc, 0x86, 0xff, 0xac, 0x01, 0x39, 0x64, 0xa1, 0x4c, 0x30, 0xb3, 0x3d, 0x30, 0x57, + 0xc2, 0xf3, 0xe6, 0xdc, 0xc2, 0x9a, 0x02, 0xf2, 0xd8, 0x34, 0xbf, 0x39, 0xc3, 0xfc, 0xd4, 0x6a, + 0x1a, 0xaf, 0x58, 0x1c, 0x2b, 0xf9, 0xf1, 0xdb, 0xb0, 0x7c, 0xe9, 0x06, 0x01, 0xcd, 0xd4, 0x13, + 0x9b, 0xa8, 0xc4, 0x73, 0xa8, 0xcc, 0xc1, 0xe5, 0x82, 0x17, 0xb4, 0x05, 0x6f, 0xc0, 0x9a, 0xb1, + 0x5e, 0x11, 0x0d, 0x3d, 0x84, 0x4d, 0x0e, 0x3e, 0x08, 0x82, 0x99, 0xbd, 0xaa, 0xf5, 0x57, 0x75, + 0xd8, 0x2a, 0x4d, 0x53, 0x61, 0x83, 0x69, 0xc6, 0x77, 0xd4, 0x72, 0xab, 0x27, 0xec, 0x8b, 0x4f, + 0x31, 0xab, 0xf7, 0x8f, 0x35, 0x98, 0xe7, 0xa0, 0xa9, 0xbb, 0xf1, 0x85, 0x74, 0x08, 0xc2, 0xe0, + 0x78, 0x46, 0xf4, 0xbd, 0xd9, 0x98, 0xf1, 0xff, 0xf4, 0x67, 0x55, 0xee, 0x49, 0xc4, 0x8b, 0xea, + 0x0f, 0xa1, 0x53, 0x44, 0x78, 0xa5, 0x27, 0x27, 0x5e, 0x55, 0x79, 0x74, 0x41, 0xb5, 0x67, 0xd4, + 0x5f, 0xd4, 0x60, 0xe5, 0x30, 0x0a, 0x3d, 0x9f, 0xdd, 0x98, 0xc7, 0x6e, 0xe2, 0x0e, 0x53, 0xf1, + 0x92, 0xcf, 0x41, 0xb2, 0xec, 0xae, 0x00, 0x13, 0x0a, 0x9c, 0xbb, 0x00, 0xfd, 0x73, 0xda, 0x7f, + 0xe1, 0x88, 0x8a, 0x23, 0x7f, 0xfe, 0x67, 0x90, 0x8f, 0x7c, 0x2f, 0x25, 0xef, 0xc0, 0x5a, 0x3e, + 0xec, 0xb8, 0xa1, 0xe7, 0x88, 0x72, 0x23, 0xbe, 0x6e, 0x28, 0xbc, 0x83, 0xd0, 0x3b, 0x48, 0x5f, + 0xa4, 0x2c, 0x56, 0x54, 0x55, 0x36, 0xc7, 0x70, 0xe1, 0x2b, 0x0a, 0x7e, 0x80, 0x60, 0xeb, 0x7f, + 0x6a, 0x78, 0x03, 0xca, 0x55, 0x89, 0xdd, 0xce, 0x0b, 0x6b, 0x58, 0x6f, 0x35, 0xb6, 0xac, 0x5e, + 0xd8, 0x32, 0x02, 0x0d, 0x3f, 0xa3, 0x43, 0x79, 0xb1, 0xb0, 0xdf, 0xe4, 0x23, 0xe8, 0xa8, 0x15, + 0x3b, 0x31, 0xaa, 0x45, 0x1c, 0x93, 0xad, 0x3c, 0x71, 0x34, 0xb4, 0x66, 0xaf, 0xf4, 0x0b, 0x6a, + 0x94, 0xc7, 0xeb, 0xda, 0x4c, 0x8e, 0xba, 0x8f, 0xda, 0x16, 0xfe, 0x89, 0x7f, 0x71, 0xa9, 0x69, + 0x7f, 0x94, 0x51, 0x4f, 0x84, 0xca, 0xea, 0xdb, 0xfa, 0xf7, 0x1a, 0xac, 0x1c, 0x78, 0x1e, 0xae, + 0x7b, 0x16, 0x37, 0x21, 0x57, 0x59, 0xbf, 0x62, 0x95, 0x73, 0xbf, 0xe4, 0x2a, 0x7f, 0x65, 0x27, + 0x32, 0x41, 0x09, 0x96, 0x05, 0x9d, 0x7c, 0x9d, 0xd5, 0xdb, 0x6b, 0x7d, 0x07, 0x08, 0x4f, 0xaf, + 0x0c, 0x75, 0x14, 0xb1, 0x36, 0x60, 0xcd, 0xc0, 0x12, 0xbe, 0xe6, 0x13, 0xb8, 0x7b, 0x44, 0xb3, + 0xc3, 0x64, 0x1c, 0x67, 0x91, 0x0c, 0x67, 0x3f, 0xa6, 0x71, 0x94, 0xfa, 0xd2, 0x73, 0xd1, 0x99, + 0xbc, 0xcf, 0x3f, 0xd5, 0xe0, 0xde, 0x0c, 0x84, 0xc4, 0x12, 0xbe, 0x2c, 0xd7, 0x97, 0x7e, 0x5b, + 0x6f, 0x6f, 0x99, 0x89, 0xca, 0xbe, 0x82, 0x88, 0x2e, 0x03, 0x45, 0xb2, 0xf7, 0x03, 0x58, 0x36, + 0x07, 0x5f, 0xc9, 0x55, 0x04, 0x70, 0xe7, 0x0a, 0x21, 0x66, 0xb1, 0xb9, 0x3b, 0xb0, 0xdc, 0x37, + 0x48, 0x08, 0x46, 0x05, 0xa8, 0x75, 0x08, 0x6f, 0x5e, 0xc9, 0x4d, 0xa8, 0x6d, 0x62, 0x86, 0x6e, + 0xfd, 0x6d, 0x03, 0xb6, 0x9e, 0xfb, 0xd9, 0xb9, 0x97, 0xb8, 0x97, 0xd2, 0xfa, 0x66, 0x11, 0xb2, + 0x90, 0xbc, 0xd7, 0xcb, 0xf5, 0x86, 0xb7, 0x60, 0x35, 0x0a, 0x29, 0xe6, 0x18, 0x4e, 0xec, 0xa6, + 0xe9, 0x65, 0x94, 0xc8, 0xbb, 0x74, 0x25, 0x0a, 0x29, 0xcb, 0x33, 0x8e, 0x05, 0xb8, 0x70, 0x1b, + 0x37, 0x8a, 0xb7, 0x71, 0x07, 0xe6, 0x62, 0x3f, 0x14, 0x6f, 0x26, 0xec, 0x27, 0xbb, 0x3b, 0xb3, + 0xc4, 0xf5, 0x34, 0xca, 0xe2, 0xee, 0x44, 0xa8, 0xa2, 0xab, 0x57, 0xf1, 0x17, 0x0a, 0x55, 0x7c, + 0x4d, 0x27, 0x8b, 0x66, 0xd5, 0x62, 0x0f, 0x5a, 0xe2, 0xa7, 0x93, 0xb9, 0x03, 0x91, 0x02, 0x81, + 0x00, 0x3d, 0x75, 0x07, 0x5a, 0xb4, 0x06, 0x46, 0xb4, 0xb6, 0x0b, 0x70, 0x46, 0xa9, 0x63, 0x24, + 0x43, 0xcd, 0x33, 0x4a, 0xb9, 0xd3, 0x65, 0xa1, 0xf2, 0xa9, 0x1b, 0xbe, 0x70, 0xb0, 0x06, 0xd1, + 0xe6, 0xe2, 0x30, 0xc0, 0xe7, 0xee, 0x10, 0x63, 0x62, 0x1c, 0x94, 0x32, 0x2d, 0x71, 0x8d, 0x32, + 0xd8, 0x41, 0x5e, 0x4d, 0x41, 0x94, 0xbe, 0x9f, 0x8d, 0xbb, 0xcb, 0xf9, 0xfc, 0x43, 0x3f, 0x1b, + 0xab, 0xf9, 0xa8, 0xb3, 0x64, 0xdc, 0x5d, 0xc9, 0xe7, 0x1f, 0x72, 0x10, 0x13, 0x2f, 0xbd, 0xf4, + 0xcf, 0x28, 0x6f, 0x0c, 0xe9, 0x88, 0x56, 0x29, 0x06, 0x39, 0x8c, 0x3c, 0x0c, 0x23, 0x2f, 0xfd, + 0x44, 0x4b, 0x4e, 0x57, 0x79, 0x0a, 0xcb, 0x80, 0xd2, 0x34, 0xac, 0xb7, 0xa0, 0x23, 0xcd, 0x45, + 0xef, 0x9d, 0x4c, 0x68, 0x3a, 0x0a, 0x32, 0xd9, 0x3b, 0xc9, 0xbf, 0xac, 0xf7, 0xb0, 0x2b, 0xe2, + 0xb3, 0x68, 0x30, 0xc8, 0xd3, 0x27, 0x61, 0x5a, 0x9b, 0x30, 0x1f, 0x20, 0x5c, 0x4e, 0xe1, 0x5f, + 0x56, 0x88, 0xf5, 0x9c, 0xc2, 0x94, 0xfc, 0xd5, 0xc2, 0x0f, 0xcf, 0x22, 0x91, 0x2d, 0xe0, 0x6f, + 0x76, 0x16, 0x3d, 0x7a, 0x3a, 0x1a, 0xc8, 0x1e, 0x28, 0xfc, 0x60, 0x98, 0x97, 0x6e, 0x12, 0x8a, + 0x0b, 0x15, 0x7f, 0x33, 0x4c, 0x9a, 0x24, 0x51, 0x22, 0x6e, 0x4f, 0xfe, 0x61, 0x1d, 0xc1, 0xd6, + 0xc9, 0xab, 0x89, 0xc8, 0x08, 0xf1, 0x6a, 0x8d, 0x38, 0xfe, 0xf8, 0x61, 0x7d, 0x6a, 0x74, 0x80, + 0x60, 0x97, 0xc0, 0x2c, 0xc7, 0x68, 0x1d, 0xae, 0xa1, 0x2f, 0x97, 0xc4, 0xf0, 0x83, 0x65, 0x84, + 0xdd, 0x32, 0x35, 0xd5, 0x83, 0x56, 0xee, 0xa8, 0xe0, 0x9e, 0xf0, 0xff, 0x55, 0x74, 0x54, 0x18, + 0x73, 0x67, 0x6b, 0xa9, 0xf8, 0xb5, 0x76, 0x49, 0x7c, 0x0d, 0x6b, 0xba, 0x68, 0xdf, 0x66, 0xd6, + 0xff, 0xe0, 0xe7, 0x77, 0x60, 0xf9, 0x28, 0xe2, 0x0e, 0xf3, 0x29, 0xf3, 0x13, 0x09, 0x79, 0x02, + 0x0b, 0xa2, 0x41, 0x95, 0x6c, 0x96, 0x3a, 0x56, 0x51, 0xb4, 0xde, 0xd6, 0x84, 0x4e, 0x56, 0x6b, + 0xed, 0x9b, 0x7f, 0xf9, 0xb7, 0x9f, 0xd5, 0x97, 0x48, 0xeb, 0xfe, 0xc5, 0x7b, 0xf7, 0x07, 0x34, + 0x43, 0x83, 0x3c, 0x87, 0x25, 0xa3, 0xa7, 0x90, 0xec, 0x18, 0x7d, 0x81, 0x85, 0x56, 0xc3, 0xde, + 0xee, 0xd4, 0xae, 0x41, 0xab, 0x87, 0x2c, 0xd6, 0x09, 0x11, 0x2c, 0x52, 0x44, 0xe1, 0x84, 0xbf, + 0x82, 0x95, 0x47, 0x58, 0xa9, 0x54, 0x54, 0xc9, 0x5e, 0x4e, 0xad, 0xb2, 0x57, 0xb2, 0x77, 0x73, + 0x32, 0x82, 0xe0, 0xb8, 0x8d, 0x1c, 0x37, 0xc8, 0x1a, 0xe3, 0xc8, 0x2b, 0xa1, 0xaa, 0x47, 0x91, + 0xa4, 0xd0, 0x11, 0xdd, 0x57, 0xaf, 0x95, 0xe7, 0x0e, 0xf2, 0xdc, 0x24, 0xeb, 0x8c, 0xa7, 0xc7, + 0x19, 0xe4, 0x4c, 0x23, 0x2c, 0xb4, 0xe8, 0xdd, 0x82, 0xe4, 0xc6, 0xc4, 0x36, 0x42, 0xce, 0x72, + 0xef, 0x8a, 0x36, 0x43, 0x73, 0x95, 0x03, 0xca, 0x70, 0x55, 0xa7, 0x21, 0xf9, 0x19, 0x3f, 0x7d, + 0x95, 0x7d, 0xad, 0xe4, 0xcd, 0xab, 0x9b, 0x69, 0xb9, 0x0c, 0x77, 0x67, 0xed, 0xba, 0xb5, 0xbe, + 0x83, 0xc2, 0xdc, 0x20, 0x3b, 0x42, 0x18, 0xa3, 0xd3, 0x56, 0xf6, 0xf2, 0x92, 0x3e, 0xb4, 0xf5, + 0x16, 0x41, 0xb2, 0x5d, 0x71, 0xd8, 0x15, 0xf3, 0x9d, 0xea, 0x41, 0xc1, 0xb0, 0x8b, 0x0c, 0x09, + 0xe9, 0x08, 0x86, 0xaa, 0xa3, 0x90, 0x7c, 0x0d, 0x2b, 0x85, 0xf6, 0x3a, 0x62, 0x15, 0xb6, 0xaf, + 0xa2, 0x55, 0xb2, 0xf7, 0xc6, 0x54, 0x1c, 0xc1, 0xf5, 0x06, 0x72, 0xed, 0x5a, 0x6b, 0xda, 0x2e, + 0x4b, 0xce, 0xdf, 0xaf, 0xbd, 0x45, 0x52, 0xdc, 0x67, 0xbd, 0x13, 0x6c, 0x26, 0xde, 0x7b, 0x57, + 0xb4, 0x91, 0x95, 0xf6, 0x5a, 0xf2, 0xc4, 0xe3, 0x9a, 0x62, 0x77, 0x8d, 0xd6, 0xbf, 0x88, 0x37, + 0xe1, 0x2c, 0x7c, 0x77, 0xab, 0xfb, 0x1f, 0x45, 0x0b, 0x66, 0xe9, 0xe4, 0x4a, 0xae, 0x51, 0x16, + 0x93, 0xd4, 0x68, 0x0f, 0x15, 0x4c, 0x4d, 0xab, 0xae, 0x68, 0xd0, 0xac, 0x5c, 0xa9, 0xde, 0x71, + 0x39, 0x71, 0xa5, 0x51, 0x16, 0xa7, 0xe4, 0x25, 0x2c, 0x73, 0x77, 0xf1, 0xfa, 0x77, 0x76, 0x17, + 0xf9, 0x6e, 0x59, 0x24, 0xf7, 0x19, 0xfa, 0xc6, 0x3e, 0x87, 0xa6, 0xea, 0x60, 0x22, 0x5d, 0x6d, + 0x11, 0x46, 0xaf, 0x5c, 0x6f, 0x42, 0x27, 0x94, 0xb4, 0x56, 0x6b, 0x49, 0xac, 0x8a, 0xf7, 0x35, + 0x31, 0xc2, 0x3f, 0x05, 0xc8, 0x5b, 0xa3, 0xc8, 0xf5, 0x12, 0x65, 0xa5, 0xb9, 0x5e, 0xd5, 0x90, + 0x6c, 0x02, 0x47, 0xf2, 0x1d, 0xb2, 0x6c, 0x90, 0x97, 0xe7, 0x4d, 0x55, 0xeb, 0x8c, 0xf3, 0x56, + 0x6c, 0xa6, 0xea, 0x4d, 0xee, 0xa2, 0x91, 0x9b, 0x62, 0xc9, 0xc3, 0xa6, 0x32, 0x71, 0xb6, 0x82, + 0x01, 0xde, 0x16, 0x5a, 0xfb, 0xce, 0x4e, 0x15, 0x97, 0xca, 0xdb, 0xa2, 0xdc, 0x8b, 0x63, 0x5d, + 0x47, 0x56, 0x6b, 0x64, 0xb5, 0xc8, 0x2a, 0x25, 0x2f, 0xf0, 0x8f, 0x60, 0xb4, 0xee, 0x13, 0xa2, + 0xd3, 0x2a, 0xb7, 0xe2, 0xf4, 0x6e, 0x4c, 0x1a, 0x9e, 0x70, 0x33, 0x89, 0x60, 0x1d, 0x0f, 0x15, + 0xdf, 0x70, 0xde, 0x73, 0x62, 0x6c, 0xb8, 0xd1, 0x9a, 0xd2, 0xbb, 0x5e, 0x31, 0x22, 0xa8, 0x6f, + 0x20, 0xf5, 0x15, 0xb2, 0xa4, 0x5c, 0x22, 0xd2, 0xe2, 0x7b, 0xa2, 0x1e, 0x03, 0x8d, 0x3d, 0x29, + 0x76, 0x8c, 0x18, 0x3e, 0xb0, 0xd4, 0x37, 0x52, 0xf2, 0x81, 0xaa, 0x33, 0x84, 0xfc, 0xb1, 0xd9, + 0x80, 0x22, 0x1f, 0xc4, 0xad, 0xa9, 0x2f, 0xd8, 0xa5, 0xd3, 0x32, 0xf1, 0x95, 0xdb, 0xda, 0x43, + 0xce, 0xd7, 0xc9, 0x56, 0x91, 0xb3, 0x78, 0x31, 0x27, 0xdf, 0xd4, 0x60, 0xad, 0xe2, 0x3d, 0x36, + 0x97, 0x60, 0xf2, 0xeb, 0x71, 0x2e, 0xc1, 0xb4, 0x07, 0x5d, 0x0b, 0x25, 0xd8, 0xb1, 0x50, 0x02, + 0xd7, 0xf3, 0x94, 0x04, 0x22, 0xf7, 0x60, 0x96, 0xf9, 0xe7, 0x35, 0xd8, 0xac, 0x7e, 0x7b, 0x25, + 0xb7, 0x55, 0x5b, 0xfd, 0xb4, 0x57, 0xe1, 0xde, 0x9d, 0xab, 0xd0, 0x84, 0x34, 0xb7, 0x51, 0x9a, + 0x3d, 0xab, 0xc7, 0xa4, 0x49, 0x10, 0xb7, 0x4a, 0xa0, 0x4b, 0x2c, 0x58, 0x99, 0xaf, 0x9b, 0x44, + 0x8b, 0x2d, 0xaa, 0x1f, 0x81, 0x7b, 0xb7, 0xa6, 0x60, 0x98, 0xee, 0x8b, 0x6c, 0x88, 0x0d, 0xc1, + 0x27, 0x41, 0xf5, 0x4c, 0x2a, 0xce, 0x68, 0xfe, 0x7a, 0x68, 0x9c, 0xd1, 0xd2, 0x83, 0xa8, 0x71, + 0x46, 0xcb, 0x6f, 0x94, 0xa5, 0x33, 0x8a, 0xcc, 0xf0, 0xbd, 0x92, 0x7c, 0x81, 0xc7, 0x46, 0x54, + 0x4b, 0xbb, 0xc5, 0xa3, 0x9e, 0x56, 0x1d, 0x1b, 0xb3, 0x1e, 0x5a, 0x72, 0x95, 0xbc, 0x08, 0xcb, + 0xb4, 0x67, 0xc3, 0xa2, 0x44, 0x27, 0x5b, 0x45, 0x02, 0x92, 0x72, 0xe5, 0x83, 0x97, 0xb5, 0x85, + 0x44, 0x57, 0xad, 0xb6, 0x4e, 0x94, 0xd1, 0x3c, 0x85, 0x96, 0xf6, 0xb8, 0x43, 0x94, 0x93, 0x2d, + 0xbf, 0x65, 0xf5, 0xb6, 0x2b, 0xc7, 0x4c, 0x57, 0x62, 0xad, 0x30, 0x06, 0x29, 0x22, 0x28, 0x1e, + 0x7f, 0x00, 0x4b, 0xc6, 0xfb, 0x4a, 0xae, 0xfc, 0xaa, 0x17, 0xa0, 0x5c, 0xf9, 0x95, 0x8f, 0x32, + 0x32, 0xd0, 0xb4, 0x50, 0xf9, 0xa9, 0x40, 0x51, 0xbc, 0xbe, 0x84, 0xa6, 0x7a, 0xd6, 0xc8, 0xf5, + 0x5f, 0x7c, 0xe9, 0xb8, 0x8a, 0x87, 0xb1, 0x07, 0x97, 0x6c, 0xf2, 0x69, 0x34, 0x3c, 0x15, 0xfa, + 0xd2, 0x8a, 0xf6, 0xb9, 0xbe, 0xca, 0x2f, 0x17, 0xb9, 0xbe, 0xaa, 0xaa, 0xfc, 0x86, 0xbe, 0xfa, + 0x88, 0xa0, 0xd6, 0x90, 0xc0, 0x4a, 0xa1, 0x58, 0x9e, 0x87, 0x15, 0xd5, 0x4f, 0x03, 0x79, 0x58, + 0x31, 0xa1, 0xca, 0x6e, 0x06, 0x6e, 0x9c, 0x9f, 0x1b, 0x04, 0xb9, 0x6d, 0x71, 0x77, 0xcf, 0x4b, + 0xc9, 0x86, 0xdd, 0x1a, 0x35, 0x73, 0xc3, 0x6e, 0xcd, 0xba, 0x73, 0xc9, 0xdd, 0x53, 0x4e, 0xeb, + 0x19, 0x2c, 0xca, 0x1a, 0x66, 0x6e, 0xb4, 0x85, 0xea, 0x6d, 0xaf, 0x5b, 0x1e, 0x10, 0x54, 0x0d, + 0xc3, 0x75, 0x3d, 0x0f, 0xa9, 0x8a, 0x8d, 0xd0, 0x2a, 0x9a, 0xf9, 0x46, 0x94, 0x8b, 0xa1, 0xf9, + 0x46, 0x54, 0x95, 0x40, 0x8d, 0x8d, 0xe0, 0x9e, 0x4b, 0xf1, 0xf8, 0xbb, 0x1a, 0xdc, 0xba, 0xb2, + 0x20, 0x49, 0xde, 0x7d, 0x85, 0xda, 0x25, 0x17, 0xe8, 0xbd, 0x57, 0xae, 0x76, 0x5a, 0x77, 0x51, + 0x4c, 0xcb, 0xda, 0x95, 0x97, 0x29, 0x4e, 0xf3, 0x38, 0xba, 0x2a, 0x7d, 0x32, 0xa1, 0xff, 0xa6, + 0xc6, 0xff, 0xc4, 0x71, 0x0a, 0x5d, 0xb2, 0x3f, 0xa3, 0x00, 0x52, 0xe0, 0xfb, 0x33, 0xe3, 0x0b, + 0x71, 0xef, 0xa0, 0xb8, 0x37, 0xad, 0xed, 0x29, 0xe2, 0x32, 0x61, 0xff, 0x08, 0xb6, 0x55, 0xe1, + 0xd2, 0xa0, 0xfb, 0xc9, 0x28, 0xf4, 0xd2, 0x3c, 0x2f, 0x9d, 0x50, 0xdd, 0xcc, 0x0d, 0xa7, 0x58, + 0xcf, 0x32, 0xef, 0xc7, 0x4b, 0x31, 0xca, 0xc5, 0x38, 0x63, 0xb4, 0x19, 0xf7, 0x18, 0x56, 0xe5, + 0xbc, 0x4f, 0x7c, 0x37, 0xfb, 0x95, 0x79, 0xde, 0x44, 0x9e, 0x3d, 0x6b, 0x43, 0xe7, 0x79, 0xe6, + 0xbb, 0x99, 0xe2, 0x98, 0xe2, 0x3b, 0x94, 0x51, 0xaa, 0xd2, 0x93, 0xef, 0xca, 0x22, 0x96, 0x9e, + 0x7c, 0x57, 0x57, 0xd5, 0xcc, 0xe4, 0x7b, 0x40, 0x33, 0x5e, 0xe5, 0xf2, 0x04, 0x83, 0x0b, 0xe8, + 0x9c, 0x4c, 0x64, 0x7a, 0xf2, 0x4b, 0x33, 0x15, 0x31, 0x90, 0x85, 0x4c, 0xd3, 0x02, 0x53, 0xb6, + 0xd8, 0x0b, 0xfe, 0xe8, 0xa6, 0x17, 0xb1, 0xc8, 0xde, 0xe4, 0xf2, 0x56, 0x99, 0x6f, 0x65, 0xfd, + 0xcb, 0xe4, 0xab, 0x65, 0x48, 0xf8, 0xa7, 0x5d, 0x8c, 0xef, 0x18, 0x88, 0x99, 0x25, 0xe1, 0x9f, + 0x04, 0x28, 0x2f, 0x50, 0x51, 0xba, 0x9a, 0x2d, 0x45, 0xba, 0x85, 0x8c, 0xb7, 0xad, 0xcd, 0x72, + 0x8a, 0xc4, 0x78, 0x33, 0xd6, 0x7f, 0x08, 0x6b, 0x85, 0xdc, 0xfb, 0x35, 0xf1, 0x36, 0xcc, 0xb9, + 0x90, 0x78, 0x0b, 0xe6, 0xa7, 0xf3, 0xf8, 0xb7, 0xf2, 0xef, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xcb, 0x7f, 0xc6, 0x31, 0x5e, 0x3f, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5012,6 +5165,9 @@ type GoCryptoTraderClient interface { WithdrawFiatFunds(ctx context.Context, in *WithdrawCurrencyRequest, opts ...grpc.CallOption) (*WithdrawResponse, error) GetLoggerDetails(ctx context.Context, in *GetLoggerDetailsRequest, opts ...grpc.CallOption) (*GetLoggerDetailsResponse, error) SetLoggerDetails(ctx context.Context, in *SetLoggerDetailsRequest, opts ...grpc.CallOption) (*GetLoggerDetailsResponse, error) + GetExchangePairs(ctx context.Context, in *GetExchangePairsRequest, opts ...grpc.CallOption) (*GetExchangePairsResponse, error) + EnableExchangePair(ctx context.Context, in *ExchangePairRequest, opts ...grpc.CallOption) (*GenericExchangeNameResponse, error) + DisableExchangePair(ctx context.Context, in *ExchangePairRequest, opts ...grpc.CallOption) (*GenericExchangeNameResponse, error) } type goCryptoTraderClient struct { @@ -5382,6 +5538,33 @@ func (c *goCryptoTraderClient) SetLoggerDetails(ctx context.Context, in *SetLogg return out, nil } +func (c *goCryptoTraderClient) GetExchangePairs(ctx context.Context, in *GetExchangePairsRequest, opts ...grpc.CallOption) (*GetExchangePairsResponse, error) { + out := new(GetExchangePairsResponse) + err := c.cc.Invoke(ctx, "/gctrpc.GoCryptoTrader/GetExchangePairs", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *goCryptoTraderClient) EnableExchangePair(ctx context.Context, in *ExchangePairRequest, opts ...grpc.CallOption) (*GenericExchangeNameResponse, error) { + out := new(GenericExchangeNameResponse) + err := c.cc.Invoke(ctx, "/gctrpc.GoCryptoTrader/EnableExchangePair", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *goCryptoTraderClient) DisableExchangePair(ctx context.Context, in *ExchangePairRequest, opts ...grpc.CallOption) (*GenericExchangeNameResponse, error) { + out := new(GenericExchangeNameResponse) + err := c.cc.Invoke(ctx, "/gctrpc.GoCryptoTrader/DisableExchangePair", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // GoCryptoTraderServer is the server API for GoCryptoTrader service. type GoCryptoTraderServer interface { GetInfo(context.Context, *GetInfoRequest) (*GetInfoResponse, error) @@ -5424,6 +5607,9 @@ type GoCryptoTraderServer interface { WithdrawFiatFunds(context.Context, *WithdrawCurrencyRequest) (*WithdrawResponse, error) GetLoggerDetails(context.Context, *GetLoggerDetailsRequest) (*GetLoggerDetailsResponse, error) SetLoggerDetails(context.Context, *SetLoggerDetailsRequest) (*GetLoggerDetailsResponse, error) + GetExchangePairs(context.Context, *GetExchangePairsRequest) (*GetExchangePairsResponse, error) + EnableExchangePair(context.Context, *ExchangePairRequest) (*GenericExchangeNameResponse, error) + DisableExchangePair(context.Context, *ExchangePairRequest) (*GenericExchangeNameResponse, error) } func RegisterGoCryptoTraderServer(s *grpc.Server, srv GoCryptoTraderServer) { @@ -6150,6 +6336,60 @@ func _GoCryptoTrader_SetLoggerDetails_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } +func _GoCryptoTrader_GetExchangePairs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetExchangePairsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GoCryptoTraderServer).GetExchangePairs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gctrpc.GoCryptoTrader/GetExchangePairs", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GoCryptoTraderServer).GetExchangePairs(ctx, req.(*GetExchangePairsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GoCryptoTrader_EnableExchangePair_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExchangePairRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GoCryptoTraderServer).EnableExchangePair(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gctrpc.GoCryptoTrader/EnableExchangePair", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GoCryptoTraderServer).EnableExchangePair(ctx, req.(*ExchangePairRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GoCryptoTrader_DisableExchangePair_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExchangePairRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GoCryptoTraderServer).DisableExchangePair(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gctrpc.GoCryptoTrader/DisableExchangePair", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GoCryptoTraderServer).DisableExchangePair(ctx, req.(*ExchangePairRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _GoCryptoTrader_serviceDesc = grpc.ServiceDesc{ ServiceName: "gctrpc.GoCryptoTrader", HandlerType: (*GoCryptoTraderServer)(nil), @@ -6314,6 +6554,18 @@ var _GoCryptoTrader_serviceDesc = grpc.ServiceDesc{ MethodName: "SetLoggerDetails", Handler: _GoCryptoTrader_SetLoggerDetails_Handler, }, + { + MethodName: "GetExchangePairs", + Handler: _GoCryptoTrader_GetExchangePairs_Handler, + }, + { + MethodName: "EnableExchangePair", + Handler: _GoCryptoTrader_EnableExchangePair_Handler, + }, + { + MethodName: "DisableExchangePair", + Handler: _GoCryptoTrader_DisableExchangePair_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "rpc.proto", diff --git a/gctrpc/rpc.pb.gw.go b/gctrpc/rpc.pb.gw.go index 3423d9be..37957646 100644 --- a/gctrpc/rpc.pb.gw.go +++ b/gctrpc/rpc.pb.gw.go @@ -604,6 +604,57 @@ func request_GoCryptoTrader_SetLoggerDetails_0(ctx context.Context, marshaler ru } +func request_GoCryptoTrader_GetExchangePairs_0(ctx context.Context, marshaler runtime.Marshaler, client GoCryptoTraderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetExchangePairsRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetExchangePairs(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_GoCryptoTrader_EnableExchangePair_0(ctx context.Context, marshaler runtime.Marshaler, client GoCryptoTraderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ExchangePairRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.EnableExchangePair(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_GoCryptoTrader_DisableExchangePair_0(ctx context.Context, marshaler runtime.Marshaler, client GoCryptoTraderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ExchangePairRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DisableExchangePair(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + // RegisterGoCryptoTraderHandlerFromEndpoint is same as RegisterGoCryptoTraderHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterGoCryptoTraderHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { @@ -1442,6 +1493,66 @@ func RegisterGoCryptoTraderHandlerClient(ctx context.Context, mux *runtime.Serve }) + mux.Handle("POST", pattern_GoCryptoTrader_GetExchangePairs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GoCryptoTrader_GetExchangePairs_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_GoCryptoTrader_GetExchangePairs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_GoCryptoTrader_EnableExchangePair_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GoCryptoTrader_EnableExchangePair_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_GoCryptoTrader_EnableExchangePair_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_GoCryptoTrader_DisableExchangePair_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GoCryptoTrader_DisableExchangePair_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_GoCryptoTrader_DisableExchangePair_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1525,6 +1636,12 @@ var ( pattern_GoCryptoTrader_GetLoggerDetails_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "getloggerdetails"}, "")) pattern_GoCryptoTrader_SetLoggerDetails_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "setloggerdetails"}, "")) + + pattern_GoCryptoTrader_GetExchangePairs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "getexchangepairs"}, "")) + + pattern_GoCryptoTrader_EnableExchangePair_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "enableexchangepair"}, "")) + + pattern_GoCryptoTrader_DisableExchangePair_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "disableexchangepair"}, "")) ) var ( @@ -1607,4 +1724,10 @@ var ( forward_GoCryptoTrader_GetLoggerDetails_0 = runtime.ForwardResponseMessage forward_GoCryptoTrader_SetLoggerDetails_0 = runtime.ForwardResponseMessage + + forward_GoCryptoTrader_GetExchangePairs_0 = runtime.ForwardResponseMessage + + forward_GoCryptoTrader_EnableExchangePair_0 = runtime.ForwardResponseMessage + + forward_GoCryptoTrader_DisableExchangePair_0 = runtime.ForwardResponseMessage ) diff --git a/gctrpc/rpc.proto b/gctrpc/rpc.proto index 76efbe51..33c4cbdb 100644 --- a/gctrpc/rpc.proto +++ b/gctrpc/rpc.proto @@ -474,6 +474,21 @@ message SetLoggerDetailsRequest { string level = 2; } +message GetExchangePairsRequest { + string exchange = 1; + string asset = 2; +} + +message GetExchangePairsResponse { + map supported_assets = 1; +} + +message ExchangePairRequest { + string exchange = 1; + string asset_type = 2; + CurrencyPair pair = 3; +} + service GoCryptoTrader { rpc GetInfo (GetInfoRequest) returns (GetInfoResponse) { option (google.api.http) = { @@ -735,4 +750,25 @@ service GoCryptoTrader { body: "*" }; } + + rpc GetExchangePairs(GetExchangePairsRequest) returns (GetExchangePairsResponse) { + option (google.api.http) = { + post: "/v1/getexchangepairs", + body: "*" + }; + } + + rpc EnableExchangePair(ExchangePairRequest) returns (GenericExchangeNameResponse) { + option (google.api.http) = { + post: "/v1/enableexchangepair", + body: "*" + }; + } + + rpc DisableExchangePair(ExchangePairRequest) returns (GenericExchangeNameResponse) { + option (google.api.http) = { + post: "/v1/disableexchangepair", + body: "*" + }; + } } diff --git a/gctrpc/rpc.swagger.json b/gctrpc/rpc.swagger.json index e478f30d..f1759936 100644 --- a/gctrpc/rpc.swagger.json +++ b/gctrpc/rpc.swagger.json @@ -145,6 +145,32 @@ ] } }, + "/v1/disableexchangepair": { + "post": { + "operationId": "DisableExchangePair", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/gctrpcGenericExchangeNameResponse" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/gctrpcExchangePairRequest" + } + } + ], + "tags": [ + "GoCryptoTrader" + ] + } + }, "/v1/disablesubsystem": { "get": { "operationId": "DisableSubsystem", @@ -195,6 +221,32 @@ ] } }, + "/v1/enableexchangepair": { + "post": { + "operationId": "EnableExchangePair", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/gctrpcGenericExchangeNameResponse" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/gctrpcExchangePairRequest" + } + } + ], + "tags": [ + "GoCryptoTrader" + ] + } + }, "/v1/enablesubsystem": { "get": { "operationId": "EnableSubsystem", @@ -407,6 +459,32 @@ ] } }, + "/v1/getexchangepairs": { + "post": { + "operationId": "GetExchangePairs", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/gctrpcGetExchangePairsResponse" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/gctrpcGetExchangePairsRequest" + } + } + ], + "tags": [ + "GoCryptoTrader" + ] + } + }, "/v1/getexchanges": { "get": { "operationId": "GetExchanges", @@ -1129,6 +1207,20 @@ } } }, + "gctrpcExchangePairRequest": { + "type": "object", + "properties": { + "exchange": { + "type": "string" + }, + "asset_type": { + "type": "string" + }, + "pair": { + "$ref": "#/definitions/gctrpcCurrencyPair" + } + } + }, "gctrpcForexProvider": { "type": "object", "properties": { @@ -1353,6 +1445,28 @@ } } }, + "gctrpcGetExchangePairsRequest": { + "type": "object", + "properties": { + "exchange": { + "type": "string" + }, + "asset": { + "type": "string" + } + } + }, + "gctrpcGetExchangePairsResponse": { + "type": "object", + "properties": { + "supported_assets": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/gctrpcPairsSupported" + } + } + } + }, "gctrpcGetExchangesResponse": { "type": "object", "properties": {