Add support for get/set/rm of exchange pairs via gRPC

This commit is contained in:
Adrian Gallagher
2019-09-06 11:47:58 +10:00
parent c041c990a9
commit 0fcf867697
13 changed files with 1320 additions and 287 deletions

View File

@@ -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: "<exchange>",
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: "<logger>",
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: "<logger> <flags>",
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: "<exchange> <asset>",
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: "<exchange> <pair> <asset>",
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: "<exchange> <pair> <asset>",
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
}

View File

@@ -124,6 +124,9 @@ func main() {
withdrawFiatFundsCommand,
getLoggerDetailsCommand,
setLoggerDetailsCommand,
getExchangePairsCommand,
enableExchangePairCommand,
disableExchangePairCommand,
}
err := app.Run(os.Args)

View File

@@ -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
}

View File

@@ -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")
}
}

View File

@@ -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 {

View File

@@ -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),

View File

@@ -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
}

View File

@@ -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
}
}

View File

@@ -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) {

View File

@@ -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",

View File

@@ -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
)

View File

@@ -474,6 +474,21 @@ message SetLoggerDetailsRequest {
string level = 2;
}
message GetExchangePairsRequest {
string exchange = 1;
string asset = 2;
}
message GetExchangePairsResponse {
map<string, PairsSupported> 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: "*"
};
}
}

View File

@@ -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": {