Merge pull request #9579 from gyuho/log-output-multiple-files

*: support output logs to multiple files
release-3.4
Gyuho Lee 2018-04-17 14:39:28 -07:00 committed by GitHub
commit 9c0c3cd606
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 322 additions and 239 deletions

View File

@ -71,6 +71,9 @@ See [code changes](https://github.com/coreos/etcd/compare/v3.3.0...v3.4.0) and [
- Previously, `Create(dirpath string, metadata []byte) (*WAL, error)`, now `Create(lg *zap.Logger, dirpath string, metadata []byte) (*WAL, error)`.
- Remove [`embed.Config.SetupLogging`](https://github.com/coreos/etcd/pull/9572).
- Now logger is set up automatically based on [`embed.Config.Logger`, `embed.Config.LogOutput`, `embed.Config.Debug` fields](https://github.com/coreos/etcd/pull/9572).
- Change [`embed.Config.LogOutput` type from `string` to `[]string`](https://github.com/coreos/etcd/pull/9579) to support multiple log outputs.
- Now that `log-output` accepts multiple writers, etcd configuration YAML file `log-output` field must be changed to `[]string` type.
- Previously, `etcd.config.yaml` can have `log-output: default` field, now must be `log-output: [default]`.
- Remove [`pkg/cors` package](https://github.com/coreos/etcd/pull/9490).
- Move `"github.com/coreos/etcd/snap"` to [`"github.com/coreos/etcd/raftsnap"`](https://github.com/coreos/etcd/pull/9211).
- Move `"github.com/coreos/etcd/etcdserver/auth"` to [`"github.com/coreos/etcd/etcdserver/v2auth"`](https://github.com/coreos/etcd/pull/9275).
@ -140,10 +143,11 @@ See [security doc](https://github.com/coreos/etcd/blob/master/Documentation/op-g
- Add [`--logger`](https://github.com/coreos/etcd/pull/9572) flag to support [structured logger and logging to file](https://github.com/coreos/etcd/issues/9438) in server-side.
- e.g. `--logger=capnslog --log-output=default` is the default setting and same as previous etcd server logging format.
- TODO: `--logger=zap` is experimental, and journald logging may not work when etcd runs as PID 1.
- e.g. `--logger=zap --log-output=/tmp/test.log` will log server operations with [JSON-encoded format](TODO) and writes logs to the specified file `/tmp/test.log`.
- e.g. `--logger=zap --log-output=default` will log server operations with [JSON-encoded format](TODO) and writes logs to `os.Stderr` (detect systemd journald TODO).
- e.g. `--logger=zap --log-output=stderr` will log server operations with [JSON-encoded format](TODO) and writes logs to `os.Stderr` (bypass journald TODO).
- e.g. `--logger=zap --log-output=stdout` will log server operations with [JSON-encoded format](TODO) and writes logs to `os.Stdout` (bypass journald TODO).
- e.g. `--logger=zap --log-output=/tmp/test.log` will log server operations in [JSON-encoded format](https://godoc.org/go.uber.org/zap#NewProductionEncoderConfig) and writes logs to the specified file `/tmp/test.log`.
- e.g. `--logger=zap --log-output=default` will log server operations in [JSON-encoded format](https://godoc.org/go.uber.org/zap#NewProductionEncoderConfig) and writes logs to `os.Stderr` (detect systemd journald TODO).
- e.g. `--logger=zap --log-output=stderr` will log server operations in [JSON-encoded format](https://godoc.org/go.uber.org/zap#NewProductionEncoderConfig) and writes logs to `os.Stderr` (bypass journald TODO).
- e.g. `--logger=zap --log-output=stdout` will log server operations in [JSON-encoded format](https://godoc.org/go.uber.org/zap#NewProductionEncoderConfig) and writes logs to `os.Stdout` (bypass journald TODO).
- e.g. `--logger=zap --log-output=a.log,b.log,c.log,stdout` [writes server logs to multiple files `a.log`, `b.log` and `c.log` at the same time](https://github.com/coreos/etcd/pull/9579) and outputs to `stdout`, in [JSON-encoded format](https://godoc.org/go.uber.org/zap#NewProductionEncoderConfig).
- e.g. `--logger=zap --log-output=/dev/null` will discard all server logs.
### Added: `embed`

View File

@ -79,6 +79,26 @@ cfg := &embed.Config{Debug: false}
-cfg.SetupLogging()
```
Changed [`embed.Config.LogOutput` type from `string` to `[]string`](https://github.com/coreos/etcd/pull/9579) to support multiple log outputs.
```diff
import "github.com/coreos/etcd/embed"
cfg := &embed.Config{Debug: false}
-cfg.LogOutput = "stderr"
+cfg.LogOutput = []string{"stderr"}
```
#### Change in `etcd --config-file`
Now that `log-output` accepts multiple writers, etcd configuration YAML file `log-output` field must be changed to `[]string` type as below:
```diff
# Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd.
-log-output: default
+log-output: [default]
```
### Server upgrade checklists
#### Upgrade requirements

View File

@ -23,6 +23,7 @@ import (
"net/url"
"os"
"path/filepath"
"sort"
"strings"
"sync"
"syscall"
@ -241,11 +242,12 @@ type Config struct {
Logger string `json:"logger"`
// LogOutput is either:
// - "default" as os.Stderr
// - "stderr" as os.Stderr
// - "stdout" as os.Stdout
// - file path to append server logs to
LogOutput string `json:"log-output"`
// - "default" as os.Stderr,
// - "stderr" as os.Stderr,
// - "stdout" as os.Stdout,
// - file path to append server logs to.
// It can be multiple when "Logger" is zap.
LogOutput []string `json:"log-output"`
// Debug is true, to enable debug level logging.
Debug bool `json:"debug"`
@ -318,7 +320,7 @@ func NewConfig() *Config {
loggerMu: new(sync.RWMutex),
logger: nil,
Logger: "capnslog",
LogOutput: DefaultLogOutput,
LogOutput: []string{DefaultLogOutput},
Debug: false,
LogPkgLevels: "",
}
@ -380,21 +382,37 @@ func (cfg *Config) setupLogging() error {
repoLog.SetLogLevel(settings)
}
if len(cfg.LogOutput) != 1 {
fmt.Printf("expected only 1 value in 'log-output', got %v\n", cfg.LogOutput)
os.Exit(1)
}
// capnslog initially SetFormatter(NewDefaultFormatter(os.Stderr))
// where NewDefaultFormatter returns NewJournaldFormatter when syscall.Getppid() == 1
// specify 'stdout' or 'stderr' to skip journald logging even when running under systemd
switch cfg.LogOutput {
output := cfg.LogOutput[0]
switch output {
case "stdout":
capnslog.SetFormatter(capnslog.NewPrettyFormatter(os.Stdout, cfg.Debug))
case "stderr":
capnslog.SetFormatter(capnslog.NewPrettyFormatter(os.Stderr, cfg.Debug))
case DefaultLogOutput:
default:
plog.Panicf(`unknown log-output %q (only supports %q, "stdout", "stderr")`, cfg.LogOutput, DefaultLogOutput)
plog.Panicf(`unknown log-output %q (only supports %q, "stdout", "stderr")`, output, DefaultLogOutput)
}
case "zap":
// TODO: make this more configurable
if len(cfg.LogOutput) == 0 {
cfg.LogOutput = []string{DefaultLogOutput}
}
if len(cfg.LogOutput) > 1 {
for _, v := range cfg.LogOutput {
if v == DefaultLogOutput {
panic(fmt.Errorf("multi logoutput for %q is not supported yet", DefaultLogOutput))
}
}
}
// TODO: use zapcore to support more features?
lcfg := zap.Config{
Level: zap.NewAtomicLevelAt(zap.InfoLevel),
Development: false,
@ -404,35 +422,50 @@ func (cfg *Config) setupLogging() error {
},
Encoding: "json",
EncoderConfig: zap.NewProductionEncoderConfig(),
OutputPaths: make([]string, 0),
ErrorOutputPaths: make([]string, 0),
}
switch cfg.LogOutput {
case DefaultLogOutput:
if syscall.Getppid() == 1 {
// capnslog initially SetFormatter(NewDefaultFormatter(os.Stderr))
// where "NewDefaultFormatter" returns "NewJournaldFormatter"
// when syscall.Getppid() == 1, specify 'stdout' or 'stderr' to
// skip journald logging even when running under systemd
fmt.Println("running under init, which may be systemd!")
// TODO: capnlog.NewJournaldFormatter()
lcfg.OutputPaths = []string{"stderr"}
lcfg.ErrorOutputPaths = []string{"stderr"}
} else {
lcfg.OutputPaths = []string{"stderr"}
lcfg.ErrorOutputPaths = []string{"stderr"}
outputPaths, errOutputPaths := make(map[string]struct{}), make(map[string]struct{})
for _, v := range cfg.LogOutput {
switch v {
case DefaultLogOutput:
if syscall.Getppid() == 1 {
// capnslog initially SetFormatter(NewDefaultFormatter(os.Stderr))
// where "NewDefaultFormatter" returns "NewJournaldFormatter"
// when syscall.Getppid() == 1, specify 'stdout' or 'stderr' to
// skip journald logging even when running under systemd
// TODO: capnlog.NewJournaldFormatter()
fmt.Println("running under init, which may be systemd!")
outputPaths["stderr"] = struct{}{}
errOutputPaths["stderr"] = struct{}{}
continue
}
outputPaths["stderr"] = struct{}{}
errOutputPaths["stderr"] = struct{}{}
case "stderr":
outputPaths["stderr"] = struct{}{}
errOutputPaths["stderr"] = struct{}{}
case "stdout":
outputPaths["stdout"] = struct{}{}
errOutputPaths["stdout"] = struct{}{}
default:
outputPaths[v] = struct{}{}
errOutputPaths[v] = struct{}{}
}
case "stderr":
lcfg.OutputPaths = []string{"stderr"}
lcfg.ErrorOutputPaths = []string{"stderr"}
case "stdout":
lcfg.OutputPaths = []string{"stdout"}
lcfg.ErrorOutputPaths = []string{"stdout"}
default:
lcfg.OutputPaths = []string{cfg.LogOutput}
lcfg.ErrorOutputPaths = []string{cfg.LogOutput}
}
for v := range outputPaths {
lcfg.OutputPaths = append(lcfg.OutputPaths, v)
}
for v := range errOutputPaths {
lcfg.ErrorOutputPaths = append(lcfg.ErrorOutputPaths, v)
}
sort.Strings(lcfg.OutputPaths)
sort.Strings(lcfg.ErrorOutputPaths)
if cfg.Debug {
lcfg.Level = zap.NewAtomicLevelAt(zap.DebugLevel)

View File

@ -34,14 +34,14 @@ func TestConfigFileOtherFields(t *testing.T) {
PeerSecurityCfgFile securityConfig `json:"peer-transport-security"`
ForceNewCluster bool `json:"force-new-cluster"`
Logger string `json:"logger"`
LogOutput string `json:"log-output"`
LogOutputs []string `json:"log-output"`
Debug bool `json:"debug"`
}{
ctls,
ptls,
true,
"zap",
"/dev/null",
[]string{"/dev/null"},
false,
}
@ -157,7 +157,7 @@ func mustCreateCfgFile(t *testing.T, b []byte) *os.File {
func TestAutoCompactionModeInvalid(t *testing.T) {
cfg := NewConfig()
cfg.Logger = "zap"
cfg.LogOutput = "/dev/null"
cfg.LogOutput = []string{"/dev/null"}
cfg.Debug = false
cfg.AutoCompactionMode = "period"
err := cfg.Validate()

View File

@ -138,7 +138,7 @@ debug: false
log-package-levels:
# Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd.
log-output: default
log-output: [default]
# Force to create a new one member cluster.
force-new-cluster: false

View File

@ -24,6 +24,7 @@ import (
"net/url"
"os"
"runtime"
"sort"
"strings"
"github.com/coreos/etcd/embed"
@ -216,7 +217,7 @@ func newConfig() *config {
// logging
fs.StringVar(&cfg.ec.Logger, "logger", "capnslog", "Specify 'zap' for structured logging or 'capnslog'.")
fs.StringVar(&cfg.ec.LogOutput, "log-output", embed.DefaultLogOutput, "Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd.")
fs.Var(flags.NewUniqueStringsValue(embed.DefaultLogOutput), "log-output", "Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd, or list of comma separated output targets.")
fs.BoolVar(&cfg.ec.Debug, "debug", false, "Enable debug-level logging for etcd.")
fs.StringVar(&cfg.ec.LogPkgLevels, "log-package-levels", "", "(To be deprecated) Specify a particular log level for each etcd package (eg: 'etcdmain=CRITICAL,etcdserver=DEBUG').")
@ -304,6 +305,13 @@ func (cfg *config) configFromCmdLine() error {
cfg.ec.CORS = flags.UniqueURLsMapFromFlag(cfg.cf.flagSet, "cors")
cfg.ec.HostWhitelist = flags.UniqueStringsMapFromFlag(cfg.cf.flagSet, "host-whitelist")
outputs := flags.UniqueStringsMapFromFlag(cfg.cf.flagSet, "log-output")
oss := make([]string, 0, len(outputs))
for v := range outputs {
oss = append(oss, v)
}
sort.Strings(oss)
cfg.ec.LogOutput = oss
cfg.ec.ClusterState = cfg.cf.clusterState.String()
cfg.cp.Fallback = cfg.cf.fallback.String()

View File

@ -157,7 +157,7 @@ Logging:
--logger 'capnslog'
Specify 'zap' for structured logging or 'capnslog'.
--log-output 'default'
Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd.
Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd, or list of comma separated output targets.
--debug 'false'
Enable debug-level logging for etcd.

View File

@ -34,7 +34,7 @@ agent-configs:
pre-vote: true
initial-corrupt-check: true
logger: zap
log-output: /tmp/etcd-functional-1/etcd.log
log-output: [/tmp/etcd-functional-1/etcd.log]
debug: true
client-cert-data: ""
client-cert-path: ""
@ -85,7 +85,7 @@ agent-configs:
pre-vote: true
initial-corrupt-check: true
logger: zap
log-output: /tmp/etcd-functional-2/etcd.log
log-output: [/tmp/etcd-functional-2/etcd.log]
debug: true
client-cert-data: ""
client-cert-path: ""
@ -136,7 +136,7 @@ agent-configs:
pre-vote: true
initial-corrupt-check: true
logger: zap
log-output: /tmp/etcd-functional-3/etcd.log
log-output: [/tmp/etcd-functional-3/etcd.log]
debug: true
client-cert-data: ""
client-cert-path: ""

View File

@ -85,13 +85,14 @@ func (srv *Server) handleTesterRequest(req *rpcpb.Request) (resp *rpcpb.Response
}
}
// just archive the first file
func (srv *Server) createEtcdLogFile() error {
var err error
srv.etcdLogFile, err = os.Create(srv.Member.Etcd.LogOutput)
srv.etcdLogFile, err = os.Create(srv.Member.Etcd.LogOutput[0])
if err != nil {
return err
}
srv.lg.Info("created etcd log file", zap.String("path", srv.Member.Etcd.LogOutput))
srv.lg.Info("created etcd log file", zap.String("path", srv.Member.Etcd.LogOutput[0]))
return nil
}
@ -664,7 +665,7 @@ func (srv *Server) handle_SIGQUIT_ETCD_AND_ARCHIVE_DATA() (*rpcpb.Response, erro
// TODO: support separate WAL directory
if err = archive(
srv.Member.BaseDir,
srv.Member.Etcd.LogOutput,
srv.Member.Etcd.LogOutput[0],
srv.Member.Etcd.DataDir,
); err != nil {
return nil, err

View File

@ -58,7 +58,7 @@ func TestEtcd(t *testing.T) {
InitialCorruptCheck: true,
Logger: "zap",
LogOutput: "/tmp/etcd-functional-1/etcd.log",
LogOutput: []string{"/tmp/etcd-functional-1/etcd.log"},
Debug: true,
}
@ -133,7 +133,7 @@ func TestEtcd(t *testing.T) {
expc.PreVote = true
expc.ExperimentalInitialCorruptCheck = true
expc.Logger = "zap"
expc.LogOutput = "/tmp/etcd-functional-1/etcd.log"
expc.LogOutput = []string{"/tmp/etcd-functional-1/etcd.log"}
expc.Debug = true
cfg, err := e.EmbedConfig()
if err != nil {

View File

@ -761,8 +761,8 @@ type Etcd struct {
InitialCorruptCheck bool `protobuf:"varint,64,opt,name=InitialCorruptCheck,proto3" json:"InitialCorruptCheck,omitempty" yaml:"initial-corrupt-check"`
Logger string `protobuf:"bytes,71,opt,name=Logger,proto3" json:"Logger,omitempty" yaml:"logger"`
// LogOutput is the log file to store current etcd server logs.
LogOutput string `protobuf:"bytes,72,opt,name=LogOutput,proto3" json:"LogOutput,omitempty" yaml:"log-output"`
Debug bool `protobuf:"varint,73,opt,name=Debug,proto3" json:"Debug,omitempty" yaml:"debug"`
LogOutput []string `protobuf:"bytes,72,rep,name=LogOutput" json:"LogOutput,omitempty" yaml:"log-output"`
Debug bool `protobuf:"varint,73,opt,name=Debug,proto3" json:"Debug,omitempty" yaml:"debug"`
}
func (m *Etcd) Reset() { *m = Etcd{} }
@ -1790,12 +1790,21 @@ func (m *Etcd) MarshalTo(dAtA []byte) (int, error) {
i += copy(dAtA[i:], m.Logger)
}
if len(m.LogOutput) > 0 {
dAtA[i] = 0xc2
i++
dAtA[i] = 0x4
i++
i = encodeVarintRpc(dAtA, i, uint64(len(m.LogOutput)))
i += copy(dAtA[i:], m.LogOutput)
for _, s := range m.LogOutput {
dAtA[i] = 0xc2
i++
dAtA[i] = 0x4
i++
l = len(s)
for l >= 1<<7 {
dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
l >>= 7
i++
}
dAtA[i] = uint8(l)
i++
i += copy(dAtA[i:], s)
}
}
if m.Debug {
dAtA[i] = 0xc8
@ -2200,9 +2209,11 @@ func (m *Etcd) Size() (n int) {
if l > 0 {
n += 2 + l + sovRpc(uint64(l))
}
l = len(m.LogOutput)
if l > 0 {
n += 2 + l + sovRpc(uint64(l))
if len(m.LogOutput) > 0 {
for _, s := range m.LogOutput {
l = len(s)
n += 2 + l + sovRpc(uint64(l))
}
}
if m.Debug {
n += 3
@ -4859,7 +4870,7 @@ func (m *Etcd) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.LogOutput = string(dAtA[iNdEx:postIndex])
m.LogOutput = append(m.LogOutput, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
case 73:
if wireType != 0 {
@ -5010,91 +5021,91 @@ var (
func init() { proto.RegisterFile("rpcpb/rpc.proto", fileDescriptorRpc) }
var fileDescriptorRpc = []byte{
// 2852 bytes of a gzipped FileDescriptorProto
// 2854 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x59, 0xcb, 0x77, 0xdb, 0xc6,
0xf5, 0x36, 0x45, 0x49, 0x96, 0xae, 0x5e, 0xd4, 0xc8, 0xb2, 0xe1, 0x97, 0x20, 0xc3, 0x71, 0x7e,
0xb2, 0x12, 0xd8, 0xf9, 0xd9, 0x39, 0x79, 0x38, 0x4d, 0x1c, 0x90, 0x82, 0x2d, 0x56, 0x10, 0x49,
0x0f, 0x21, 0xdb, 0x59, 0xf1, 0x40, 0xe4, 0x48, 0xe2, 0x31, 0x05, 0x30, 0xc0, 0xd0, 0x91, 0xb2,
0xeb, 0xaa, 0xdb, 0x36, 0x7d, 0x9c, 0xf6, 0x9c, 0xae, 0xba, 0x6e, 0xda, 0x7f, 0xc3, 0x79, 0xb5,
0x69, 0xbb, 0x6a, 0x17, 0x3c, 0x6d, 0xba, 0xe9, 0xaa, 0x0b, 0x9e, 0xbe, 0x57, 0x3d, 0x33, 0x03,
0x88, 0x03, 0x80, 0x94, 0xb4, 0x92, 0xe6, 0xde, 0xef, 0xfb, 0xe6, 0xce, 0xdc, 0xc1, 0xdc, 0x0b,
0x10, 0xe6, 0xfc, 0x76, 0xbd, 0xbd, 0x7d, 0xdb, 0x6f, 0xd7, 0x6f, 0xb5, 0x7d, 0x8f, 0x7a, 0x68,
0x8c, 0x1b, 0x2e, 0xe9, 0xbb, 0x4d, 0xba, 0xd7, 0xd9, 0xbe, 0x55, 0xf7, 0xf6, 0x6f, 0xef, 0x7a,
0xbb, 0xde, 0x6d, 0xee, 0xdd, 0xee, 0xec, 0xf0, 0x11, 0x1f, 0xf0, 0xff, 0x04, 0x4b, 0xfb, 0x6e,
0x06, 0xce, 0x62, 0xf2, 0x61, 0x87, 0x04, 0x14, 0xdd, 0x82, 0xc9, 0x72, 0x9b, 0xf8, 0x0e, 0x6d,
0x7a, 0xae, 0x92, 0x59, 0xce, 0xac, 0xcc, 0xde, 0xc9, 0xdd, 0xe2, 0xaa, 0xb7, 0x8e, 0xec, 0xb8,
0x0f, 0x41, 0x37, 0x60, 0x7c, 0x93, 0xec, 0x6f, 0x13, 0x5f, 0x19, 0x59, 0xce, 0xac, 0x4c, 0xdd,
0x99, 0x09, 0xc1, 0xc2, 0x88, 0x43, 0x27, 0x83, 0xd9, 0x24, 0xa0, 0xc4, 0x57, 0xb2, 0x31, 0x98,
0x30, 0xe2, 0xd0, 0xa9, 0xfd, 0x75, 0x04, 0xa6, 0xab, 0xae, 0xd3, 0x0e, 0xf6, 0x3c, 0x5a, 0x74,
0x77, 0x3c, 0xb4, 0x04, 0x20, 0x14, 0x4a, 0xce, 0x3e, 0xe1, 0xf1, 0x4c, 0x62, 0xc9, 0x82, 0x56,
0x21, 0x27, 0x46, 0x85, 0x56, 0x93, 0xb8, 0x74, 0x0b, 0x5b, 0x81, 0x32, 0xb2, 0x9c, 0x5d, 0x99,
0xc4, 0x29, 0x3b, 0xd2, 0xfa, 0xda, 0x15, 0x87, 0xee, 0xf1, 0x48, 0x26, 0x71, 0xcc, 0xc6, 0xf4,
0xa2, 0xf1, 0x83, 0x66, 0x8b, 0x54, 0x9b, 0x1f, 0x13, 0x65, 0x94, 0xe3, 0x52, 0x76, 0xf4, 0x2a,
0xcc, 0x47, 0x36, 0xdb, 0xa3, 0x4e, 0x8b, 0x83, 0xc7, 0x38, 0x38, 0xed, 0x90, 0x95, 0xb9, 0x71,
0x83, 0x1c, 0x2a, 0xe3, 0xcb, 0x99, 0x95, 0x2c, 0x4e, 0xd9, 0xe5, 0x48, 0xd7, 0x9d, 0x60, 0x4f,
0x39, 0xcb, 0x71, 0x31, 0x9b, 0xac, 0x87, 0xc9, 0xf3, 0x66, 0xc0, 0xf2, 0x35, 0x11, 0xd7, 0x8b,
0xec, 0x08, 0xc1, 0xa8, 0xed, 0x79, 0xcf, 0x94, 0x49, 0x1e, 0x1c, 0xff, 0x5f, 0xfb, 0x59, 0x06,
0x26, 0x30, 0x09, 0xda, 0x9e, 0x1b, 0x10, 0xa4, 0xc0, 0xd9, 0x6a, 0xa7, 0x5e, 0x27, 0x41, 0xc0,
0xf7, 0x78, 0x02, 0x47, 0x43, 0x74, 0x1e, 0xc6, 0xab, 0xd4, 0xa1, 0x9d, 0x80, 0xe7, 0x77, 0x12,
0x87, 0x23, 0x29, 0xef, 0xd9, 0xe3, 0xf2, 0xfe, 0x66, 0x3c, 0x9f, 0x7c, 0x2f, 0xa7, 0xee, 0x2c,
0x84, 0x60, 0xd9, 0x85, 0x63, 0x40, 0xed, 0x93, 0xe9, 0x68, 0x02, 0xf4, 0x1a, 0x4c, 0x98, 0xb4,
0xde, 0x30, 0x0f, 0x48, 0x5d, 0x9c, 0x80, 0xfc, 0xb9, 0x5e, 0x57, 0xcd, 0x1d, 0x3a, 0xfb, 0xad,
0x7b, 0x1a, 0xa1, 0xf5, 0x86, 0x4e, 0x0e, 0x48, 0x5d, 0xc3, 0x47, 0x28, 0x74, 0x17, 0x26, 0x8d,
0x5d, 0xe2, 0x52, 0xa3, 0xd1, 0xf0, 0x95, 0x29, 0x4e, 0x59, 0xec, 0x75, 0xd5, 0x79, 0x41, 0x71,
0x98, 0x4b, 0x77, 0x1a, 0x0d, 0x5f, 0xc3, 0x7d, 0x1c, 0xb2, 0x60, 0xfe, 0x81, 0xd3, 0x6c, 0xb5,
0xbd, 0xa6, 0x4b, 0xd7, 0x6d, 0xbb, 0xc2, 0xc9, 0xd3, 0x9c, 0xbc, 0xd4, 0xeb, 0xaa, 0x97, 0x04,
0x79, 0x27, 0x82, 0xe8, 0x7b, 0x94, 0xb6, 0x43, 0x95, 0x34, 0x11, 0xe9, 0x70, 0x36, 0xef, 0x04,
0x64, 0xad, 0xe9, 0x2b, 0x84, 0x6b, 0x2c, 0xf4, 0xba, 0xea, 0x9c, 0xd0, 0xd8, 0x76, 0x02, 0xa2,
0x37, 0x9a, 0xbe, 0x86, 0x23, 0x0c, 0x7a, 0x08, 0x73, 0x2c, 0x7a, 0x71, 0x5a, 0x2b, 0xbe, 0x77,
0x70, 0xa8, 0x7c, 0xc6, 0x33, 0x91, 0xbf, 0xd2, 0xeb, 0xaa, 0x8a, 0xb4, 0xd6, 0x3a, 0x87, 0xe8,
0x6d, 0x86, 0xd1, 0x70, 0x92, 0x85, 0x0c, 0x98, 0x61, 0xa6, 0x0a, 0x21, 0xbe, 0x90, 0xf9, 0x5c,
0xc8, 0x5c, 0xea, 0x75, 0xd5, 0xf3, 0x92, 0x4c, 0x9b, 0x10, 0x3f, 0x12, 0x89, 0x33, 0x50, 0x05,
0x50, 0x5f, 0xd5, 0x74, 0x1b, 0x7c, 0x61, 0xca, 0xa7, 0x3c, 0xff, 0x79, 0xb5, 0xd7, 0x55, 0x2f,
0xa7, 0xc3, 0x21, 0x21, 0x4c, 0xc3, 0x03, 0xb8, 0xe8, 0xff, 0x61, 0x94, 0x59, 0x95, 0x5f, 0x8a,
0x3b, 0x62, 0x2a, 0x4c, 0x3f, 0xb3, 0xe5, 0xe7, 0x7a, 0x5d, 0x75, 0xaa, 0x2f, 0xa8, 0x61, 0x0e,
0x45, 0x79, 0x58, 0x64, 0x7f, 0xcb, 0x6e, 0xff, 0x30, 0x07, 0xd4, 0xf3, 0x89, 0xf2, 0xab, 0xb4,
0x06, 0x1e, 0x0c, 0x45, 0x6b, 0x30, 0x2b, 0x02, 0x29, 0x10, 0x9f, 0xae, 0x39, 0xd4, 0x51, 0xbe,
0xcf, 0x9f, 0xf9, 0xfc, 0xe5, 0x5e, 0x57, 0xbd, 0x20, 0xe6, 0x0c, 0xe3, 0xaf, 0x13, 0x9f, 0xea,
0x0d, 0x87, 0x3a, 0x1a, 0x4e, 0x70, 0xe2, 0x2a, 0xfc, 0xe2, 0xf8, 0xe4, 0x58, 0x95, 0xb6, 0x43,
0xf7, 0x62, 0x2a, 0xfc, 0x62, 0x31, 0x60, 0x46, 0x58, 0x36, 0xc8, 0x21, 0x0f, 0xe5, 0x07, 0x42,
0x44, 0xca, 0x4b, 0x28, 0xf2, 0x8c, 0x1c, 0x86, 0x91, 0xc4, 0x19, 0x31, 0x09, 0x1e, 0xc7, 0x0f,
0x8f, 0x93, 0x10, 0x61, 0xc4, 0x19, 0xc8, 0x86, 0x05, 0x61, 0xb0, 0xfd, 0x4e, 0x40, 0x49, 0xa3,
0x60, 0xf0, 0x58, 0x7e, 0x24, 0x84, 0xae, 0xf5, 0xba, 0xea, 0xd5, 0x98, 0x10, 0x15, 0x30, 0xbd,
0xee, 0x84, 0x21, 0x0d, 0xa2, 0x0f, 0x50, 0xe5, 0xe1, 0xfd, 0xf8, 0x14, 0xaa, 0x22, 0xca, 0x41,
0x74, 0xf4, 0x1e, 0x4c, 0xb3, 0x33, 0x79, 0x94, 0xbb, 0x7f, 0x08, 0xb9, 0x8b, 0xbd, 0xae, 0xba,
0x28, 0xe4, 0xf8, 0x19, 0x96, 0x32, 0x17, 0xc3, 0xcb, 0x7c, 0x1e, 0xce, 0x3f, 0x8f, 0xe1, 0x8b,
0x30, 0x62, 0x78, 0xf4, 0x0e, 0x4c, 0xb1, 0x71, 0x94, 0xaf, 0x7f, 0x09, 0xba, 0xd2, 0xeb, 0xaa,
0xe7, 0x24, 0x7a, 0x3f, 0x5b, 0x32, 0x5a, 0x22, 0xf3, 0xb9, 0xff, 0x3d, 0x9c, 0x2c, 0xa6, 0x96,
0xd1, 0xa8, 0x04, 0xf3, 0x6c, 0x18, 0xcf, 0xd1, 0x7f, 0xb2, 0xc9, 0xe7, 0x8f, 0x4b, 0xa4, 0x32,
0x94, 0xa6, 0xa6, 0xf4, 0x78, 0x48, 0xff, 0x3d, 0x51, 0x4f, 0x44, 0x96, 0xa6, 0xa2, 0x77, 0x13,
0x85, 0xf4, 0x0f, 0xa3, 0xc9, 0xd5, 0x05, 0xa1, 0x3b, 0xda, 0xd8, 0x58, 0x8d, 0x7d, 0x2b, 0x51,
0x13, 0xfe, 0x78, 0xea, 0xa2, 0xf0, 0xf3, 0xe9, 0xa8, 0x8d, 0x60, 0xf7, 0x2b, 0x5b, 0x1b, 0xbb,
0x5f, 0x33, 0xc9, 0xfb, 0x95, 0x6d, 0x44, 0x78, 0xbf, 0x86, 0x18, 0xf4, 0x2a, 0x9c, 0x2d, 0x11,
0xfa, 0x91, 0xe7, 0x3f, 0x13, 0x75, 0x2c, 0x8f, 0x7a, 0x5d, 0x75, 0x56, 0xc0, 0x5d, 0xe1, 0xd0,
0x70, 0x04, 0x41, 0xd7, 0x61, 0x94, 0xdf, 0xfe, 0x62, 0x8b, 0xa4, 0x1b, 0x4a, 0x5c, 0xf7, 0xdc,
0x89, 0x0a, 0x30, 0xbb, 0x46, 0x5a, 0xce, 0xa1, 0xe5, 0x50, 0xe2, 0xd6, 0x0f, 0x37, 0x03, 0x5e,
0x69, 0x66, 0xe4, 0x6b, 0xa1, 0xc1, 0xfc, 0x7a, 0x4b, 0x00, 0xf4, 0xfd, 0x40, 0xc3, 0x09, 0x0a,
0xfa, 0x36, 0xe4, 0xe2, 0x16, 0xfc, 0x9c, 0xd7, 0x9c, 0x19, 0xb9, 0xe6, 0x24, 0x65, 0x74, 0xff,
0xb9, 0x86, 0x53, 0x3c, 0xf4, 0x01, 0x2c, 0x6e, 0xb5, 0x1b, 0x0e, 0x25, 0x8d, 0x44, 0x5c, 0x33,
0x5c, 0xf0, 0x7a, 0xaf, 0xab, 0xaa, 0x42, 0xb0, 0x23, 0x60, 0x7a, 0x3a, 0xbe, 0xc1, 0x0a, 0xe8,
0x0d, 0x00, 0xec, 0x75, 0xdc, 0x86, 0xd5, 0xdc, 0x6f, 0x52, 0x65, 0x71, 0x39, 0xb3, 0x32, 0x96,
0x3f, 0xdf, 0xeb, 0xaa, 0x48, 0xe8, 0xf9, 0xcc, 0xa7, 0xb7, 0x98, 0x53, 0xc3, 0x12, 0x12, 0xe5,
0x61, 0xd6, 0x3c, 0x68, 0xd2, 0xb2, 0x5b, 0x70, 0x02, 0xc2, 0x8a, 0xa4, 0x72, 0x3e, 0x55, 0x8d,
0x0e, 0x9a, 0x54, 0xf7, 0x5c, 0x9d, 0x15, 0xd6, 0x8e, 0x4f, 0x34, 0x9c, 0x60, 0xa0, 0xb7, 0x61,
0xca, 0x74, 0x9d, 0xed, 0x16, 0xa9, 0xb4, 0x7d, 0x6f, 0x47, 0xb9, 0xc0, 0x05, 0x2e, 0xf4, 0xba,
0xea, 0x42, 0x28, 0xc0, 0x9d, 0x7a, 0x9b, 0x79, 0x35, 0x2c, 0x63, 0xd1, 0x3d, 0x98, 0x62, 0x32,
0x7c, 0x31, 0x9b, 0x81, 0xa2, 0xf2, 0x7d, 0x90, 0x8e, 0x69, 0x9d, 0x17, 0x62, 0xbe, 0x09, 0x6c,
0xf1, 0x32, 0x98, 0x4d, 0xcb, 0x86, 0xd5, 0xbd, 0xce, 0xce, 0x4e, 0x8b, 0x28, 0xcb, 0xc9, 0x69,
0x39, 0x37, 0x10, 0xde, 0x90, 0x1a, 0x62, 0xd1, 0xcb, 0x30, 0xc6, 0x86, 0x81, 0x72, 0x8d, 0x75,
0xa2, 0xf9, 0x5c, 0xaf, 0xab, 0x4e, 0xf7, 0x49, 0x81, 0x86, 0x85, 0x1b, 0x6d, 0x48, 0x1d, 0x47,
0xc1, 0xdb, 0xdf, 0x77, 0xdc, 0x46, 0xa0, 0x68, 0x9c, 0x73, 0xb5, 0xd7, 0x55, 0x2f, 0x26, 0x3b,
0x8e, 0x7a, 0x88, 0x91, 0x1b, 0x8e, 0x88, 0xc7, 0x8e, 0x23, 0xee, 0xb8, 0x2e, 0xf1, 0x59, 0x07,
0xc4, 0x1f, 0xcb, 0x9b, 0xc9, 0x2a, 0xe5, 0x73, 0x3f, 0xef, 0x96, 0xa2, 0x2a, 0x15, 0xa7, 0xa0,
0x22, 0xe4, 0xcc, 0x03, 0x4a, 0x7c, 0xd7, 0x69, 0x1d, 0xc9, 0xac, 0x72, 0x19, 0x29, 0x20, 0x12,
0x22, 0x64, 0xa1, 0x14, 0x0d, 0xdd, 0x81, 0xc9, 0x2a, 0xf5, 0x49, 0x10, 0x10, 0x3f, 0x50, 0x08,
0x5f, 0x94, 0xd4, 0xb6, 0x05, 0x91, 0x4b, 0xc3, 0x7d, 0x18, 0xba, 0x0d, 0x13, 0x85, 0x3d, 0x52,
0x7f, 0xc6, 0x28, 0x3b, 0x9c, 0x22, 0x3d, 0xd5, 0xf5, 0xd0, 0xa3, 0xe1, 0x23, 0x10, 0x2b, 0x89,
0x82, 0xbd, 0x41, 0x0e, 0x79, 0xfb, 0xcd, 0x9b, 0xa6, 0x31, 0xf9, 0x7c, 0x89, 0x99, 0xf8, 0x55,
0x88, 0x03, 0x80, 0x94, 0xb4, 0xb2, 0xe7, 0xde, 0xef, 0xfb, 0xe6, 0xce, 0xdc, 0x99, 0xb9, 0x17,
0x14, 0xcc, 0xf9, 0xed, 0x7a, 0x7b, 0xfb, 0xb6, 0xdf, 0xae, 0xdf, 0x6a, 0xfb, 0x1e, 0xf5, 0xd0,
0x18, 0x37, 0x5c, 0xd2, 0x77, 0x9b, 0x74, 0xaf, 0xb3, 0x7d, 0xab, 0xee, 0xed, 0xdf, 0xde, 0xf5,
0x76, 0xbd, 0xdb, 0xdc, 0xbb, 0xdd, 0xd9, 0xe1, 0x23, 0x3e, 0xe0, 0xff, 0x13, 0x2c, 0xed, 0xbb,
0x19, 0x38, 0x8b, 0xc9, 0x87, 0x1d, 0x12, 0x50, 0x74, 0x0b, 0x26, 0xcb, 0x6d, 0xe2, 0x3b, 0xb4,
0xe9, 0xb9, 0x4a, 0x66, 0x39, 0xb3, 0x32, 0x7b, 0x27, 0x77, 0x8b, 0xab, 0xde, 0x3a, 0xb2, 0xe3,
0x3e, 0x04, 0xdd, 0x80, 0xf1, 0x4d, 0xb2, 0xbf, 0x4d, 0x7c, 0x65, 0x64, 0x39, 0xb3, 0x32, 0x75,
0x67, 0x26, 0x04, 0x0b, 0x23, 0x0e, 0x9d, 0x0c, 0x66, 0x93, 0x80, 0x12, 0x5f, 0xc9, 0xc6, 0x60,
0xc2, 0x88, 0x43, 0xa7, 0xf6, 0xd7, 0x11, 0x98, 0xae, 0xba, 0x4e, 0x3b, 0xd8, 0xf3, 0x68, 0xd1,
0xdd, 0xf1, 0xd0, 0x12, 0x80, 0x50, 0x28, 0x39, 0xfb, 0x84, 0xc7, 0x33, 0x89, 0x25, 0x0b, 0x5a,
0x85, 0x9c, 0x18, 0x15, 0x5a, 0x4d, 0xe2, 0xd2, 0x2d, 0x6c, 0x05, 0xca, 0xc8, 0x72, 0x76, 0x65,
0x12, 0xa7, 0xec, 0x48, 0xeb, 0x6b, 0x57, 0x1c, 0xba, 0xc7, 0x23, 0x99, 0xc4, 0x31, 0x1b, 0xd3,
0x8b, 0xc6, 0x0f, 0x9a, 0x2d, 0x52, 0x6d, 0x7e, 0x4c, 0x94, 0x51, 0x8e, 0x4b, 0xd9, 0xd1, 0xab,
0x30, 0x1f, 0xd9, 0x6c, 0x8f, 0x3a, 0x2d, 0x0e, 0x1e, 0xe3, 0xe0, 0xb4, 0x43, 0x56, 0xe6, 0xc6,
0x0d, 0x72, 0xa8, 0x8c, 0x2f, 0x67, 0x56, 0xb2, 0x38, 0x65, 0x97, 0x23, 0x5d, 0x77, 0x82, 0x3d,
0xe5, 0x2c, 0xc7, 0xc5, 0x6c, 0xb2, 0x1e, 0x26, 0xcf, 0x9b, 0x01, 0xcb, 0xd7, 0x44, 0x5c, 0x2f,
0xb2, 0x23, 0x04, 0xa3, 0xb6, 0xe7, 0x3d, 0x53, 0x26, 0x79, 0x70, 0xfc, 0xff, 0xda, 0xcf, 0x32,
0x30, 0x81, 0x49, 0xd0, 0xf6, 0xdc, 0x80, 0x20, 0x05, 0xce, 0x56, 0x3b, 0xf5, 0x3a, 0x09, 0x02,
0xbe, 0xc7, 0x13, 0x38, 0x1a, 0xa2, 0xf3, 0x30, 0x5e, 0xa5, 0x0e, 0xed, 0x04, 0x3c, 0xbf, 0x93,
0x38, 0x1c, 0x49, 0x79, 0xcf, 0x1e, 0x97, 0xf7, 0x37, 0xe3, 0xf9, 0xe4, 0x7b, 0x39, 0x75, 0x67,
0x21, 0x04, 0xcb, 0x2e, 0x1c, 0x03, 0x6a, 0x9f, 0x4c, 0x47, 0x13, 0xa0, 0xd7, 0x60, 0xc2, 0xa4,
0xf5, 0x86, 0x79, 0x40, 0xea, 0xe2, 0x04, 0xe4, 0xcf, 0xf5, 0xba, 0x6a, 0xee, 0xd0, 0xd9, 0x6f,
0xdd, 0xd3, 0x08, 0xad, 0x37, 0x74, 0x72, 0x40, 0xea, 0x1a, 0x3e, 0x42, 0xa1, 0xbb, 0x30, 0x69,
0xec, 0x12, 0x97, 0x1a, 0x8d, 0x86, 0xaf, 0x4c, 0x71, 0xca, 0x62, 0xaf, 0xab, 0xce, 0x0b, 0x8a,
0xc3, 0x5c, 0xba, 0xd3, 0x68, 0xf8, 0x1a, 0xee, 0xe3, 0x90, 0x05, 0xf3, 0x0f, 0x9c, 0x66, 0xab,
0xed, 0x35, 0x5d, 0xba, 0x6e, 0xdb, 0x15, 0x4e, 0x9e, 0xe6, 0xe4, 0xa5, 0x5e, 0x57, 0xbd, 0x24,
0xc8, 0x3b, 0x11, 0x44, 0xdf, 0xa3, 0xb4, 0x1d, 0xaa, 0xa4, 0x89, 0x48, 0x87, 0xb3, 0x79, 0x27,
0x20, 0x6b, 0x4d, 0x5f, 0x21, 0x5c, 0x63, 0xa1, 0xd7, 0x55, 0xe7, 0x84, 0xc6, 0xb6, 0x13, 0x10,
0xbd, 0xd1, 0xf4, 0x35, 0x1c, 0x61, 0xd0, 0x43, 0x98, 0x63, 0xd1, 0x8b, 0xd3, 0x5a, 0xf1, 0xbd,
0x83, 0x43, 0xe5, 0x33, 0x9e, 0x89, 0xfc, 0x95, 0x5e, 0x57, 0x55, 0xa4, 0xb5, 0xd6, 0x39, 0x44,
0x6f, 0x33, 0x8c, 0x86, 0x93, 0x2c, 0x64, 0xc0, 0x0c, 0x33, 0x55, 0x08, 0xf1, 0x85, 0xcc, 0xe7,
0x42, 0xe6, 0x52, 0xaf, 0xab, 0x9e, 0x97, 0x64, 0xda, 0x84, 0xf8, 0x91, 0x48, 0x9c, 0x81, 0x2a,
0x80, 0xfa, 0xaa, 0xa6, 0xdb, 0xe0, 0x0b, 0x53, 0x3e, 0xe5, 0xf9, 0xcf, 0xab, 0xbd, 0xae, 0x7a,
0x39, 0x1d, 0x0e, 0x09, 0x61, 0x1a, 0x1e, 0xc0, 0x45, 0xff, 0x0f, 0xa3, 0xcc, 0xaa, 0xfc, 0x52,
0xbc, 0x11, 0x53, 0x61, 0xfa, 0x99, 0x2d, 0x3f, 0xd7, 0xeb, 0xaa, 0x53, 0x7d, 0x41, 0x0d, 0x73,
0x28, 0xca, 0xc3, 0x22, 0xfb, 0xb7, 0xec, 0xf6, 0x0f, 0x73, 0x40, 0x3d, 0x9f, 0x28, 0xbf, 0x4a,
0x6b, 0xe0, 0xc1, 0x50, 0xb4, 0x06, 0xb3, 0x22, 0x90, 0x02, 0xf1, 0xe9, 0x9a, 0x43, 0x1d, 0xe5,
0xfb, 0xfc, 0xce, 0xe7, 0x2f, 0xf7, 0xba, 0xea, 0x05, 0x31, 0x67, 0x18, 0x7f, 0x9d, 0xf8, 0x54,
0x6f, 0x38, 0xd4, 0xd1, 0x70, 0x82, 0x13, 0x57, 0xe1, 0x0f, 0xc7, 0x27, 0xc7, 0xaa, 0xb4, 0x1d,
0xba, 0x17, 0x53, 0xe1, 0x0f, 0x8b, 0x01, 0x33, 0xc2, 0xb2, 0x41, 0x0e, 0x79, 0x28, 0x3f, 0x10,
0x22, 0x52, 0x5e, 0x42, 0x91, 0x67, 0xe4, 0x30, 0x8c, 0x24, 0xce, 0x88, 0x49, 0xf0, 0x38, 0x7e,
0x78, 0x9c, 0x84, 0x08, 0x23, 0xce, 0x40, 0x36, 0x2c, 0x08, 0x83, 0xed, 0x77, 0x02, 0x4a, 0x1a,
0x05, 0x83, 0xc7, 0xf2, 0x23, 0x21, 0x74, 0xad, 0xd7, 0x55, 0xaf, 0xc6, 0x84, 0xa8, 0x80, 0xe9,
0x75, 0x27, 0x0c, 0x69, 0x10, 0x7d, 0x80, 0x2a, 0x0f, 0xef, 0xc7, 0xa7, 0x50, 0x15, 0x51, 0x0e,
0xa2, 0xa3, 0xf7, 0x60, 0x9a, 0x9d, 0xc9, 0xa3, 0xdc, 0xfd, 0x43, 0xc8, 0x5d, 0xec, 0x75, 0xd5,
0x45, 0x21, 0xc7, 0xcf, 0xb0, 0x94, 0xb9, 0x18, 0x5e, 0xe6, 0xf3, 0x70, 0xfe, 0x79, 0x0c, 0x5f,
0x84, 0x11, 0xc3, 0xa3, 0x77, 0x60, 0x8a, 0x8d, 0xa3, 0x7c, 0xfd, 0x4b, 0xd0, 0x95, 0x5e, 0x57,
0x3d, 0x27, 0xd1, 0xfb, 0xd9, 0x92, 0xd1, 0x12, 0x99, 0xcf, 0xfd, 0xef, 0xe1, 0x64, 0x31, 0xb5,
0x8c, 0x46, 0x25, 0x98, 0x67, 0xc3, 0x78, 0x8e, 0xfe, 0x93, 0x4d, 0xde, 0x3f, 0x2e, 0x91, 0xca,
0x50, 0x9a, 0x9a, 0xd2, 0xe3, 0x21, 0xfd, 0xf7, 0x44, 0x3d, 0x11, 0x59, 0x9a, 0x8a, 0xde, 0x4d,
0x14, 0xd2, 0x3f, 0x8c, 0x26, 0x57, 0x17, 0x84, 0xee, 0x68, 0x63, 0x63, 0x35, 0xf6, 0xad, 0x44,
0x4d, 0xf8, 0xe3, 0xa9, 0x8b, 0xc2, 0xcf, 0xa7, 0xa3, 0x36, 0x82, 0xbd, 0xaf, 0x6c, 0x6d, 0xec,
0x7d, 0xcd, 0x24, 0xdf, 0x57, 0xb6, 0x11, 0xe1, 0xfb, 0x1a, 0x62, 0xd0, 0xab, 0x70, 0xb6, 0x44,
0xe8, 0x47, 0x9e, 0xff, 0x4c, 0xd4, 0xb1, 0x3c, 0xea, 0x75, 0xd5, 0x59, 0x01, 0x77, 0x85, 0x43,
0xc3, 0x11, 0x04, 0x5d, 0x87, 0x51, 0xfe, 0xfa, 0x8b, 0x2d, 0x92, 0x5e, 0x28, 0xf1, 0xdc, 0x73,
0x27, 0x2a, 0xc0, 0xec, 0x1a, 0x69, 0x39, 0x87, 0x96, 0x43, 0x89, 0x5b, 0x3f, 0xdc, 0x0c, 0x78,
0xa5, 0x99, 0x91, 0x9f, 0x85, 0x06, 0xf3, 0xeb, 0x2d, 0x01, 0xd0, 0xf7, 0x03, 0x0d, 0x27, 0x28,
0xe8, 0xdb, 0x90, 0x8b, 0x5b, 0xf0, 0x73, 0x5e, 0x73, 0x66, 0xe4, 0x9a, 0x93, 0x94, 0xd1, 0xfd,
0xe7, 0x1a, 0x4e, 0xf1, 0xd0, 0x07, 0xb0, 0xb8, 0xd5, 0x6e, 0x38, 0x94, 0x34, 0x12, 0x71, 0xcd,
0x70, 0xc1, 0xeb, 0xbd, 0xae, 0xaa, 0x0a, 0xc1, 0x8e, 0x80, 0xe9, 0xe9, 0xf8, 0x06, 0x2b, 0xa0,
0x37, 0x00, 0xb0, 0xd7, 0x71, 0x1b, 0x56, 0x73, 0xbf, 0x49, 0x95, 0xc5, 0xe5, 0xcc, 0xca, 0x58,
0xfe, 0x7c, 0xaf, 0xab, 0x22, 0xa1, 0xe7, 0x33, 0x9f, 0xde, 0x62, 0x4e, 0x0d, 0x4b, 0x48, 0x94,
0x87, 0x59, 0xf3, 0xa0, 0x49, 0xcb, 0x6e, 0xc1, 0x09, 0x08, 0x2b, 0x92, 0xca, 0xf9, 0x54, 0x35,
0x3a, 0x68, 0x52, 0xdd, 0x73, 0x75, 0x56, 0x58, 0x3b, 0x3e, 0xd1, 0x70, 0x82, 0x81, 0xde, 0x86,
0x29, 0xd3, 0x75, 0xb6, 0x5b, 0xa4, 0xd2, 0xf6, 0xbd, 0x1d, 0xe5, 0x02, 0x17, 0xb8, 0xd0, 0xeb,
0xaa, 0x0b, 0xa1, 0x00, 0x77, 0xea, 0x6d, 0xe6, 0xd5, 0xb0, 0x8c, 0x45, 0xf7, 0x60, 0x8a, 0xc9,
0xf0, 0xc5, 0x6c, 0x06, 0x8a, 0xca, 0xf7, 0x41, 0x3a, 0xa6, 0x75, 0x5e, 0x88, 0xf9, 0x26, 0xb0,
0xc5, 0xcb, 0x60, 0x36, 0x2d, 0x1b, 0x56, 0xf7, 0x3a, 0x3b, 0x3b, 0x2d, 0xa2, 0x2c, 0x27, 0xa7,
0xe5, 0xdc, 0x40, 0x78, 0x43, 0x6a, 0x88, 0x45, 0x2f, 0xc3, 0x18, 0x1b, 0x06, 0xca, 0x35, 0xd6,
0x89, 0xe6, 0x73, 0xbd, 0xae, 0x3a, 0xdd, 0x27, 0x05, 0x1a, 0x16, 0x6e, 0xb4, 0x21, 0x75, 0x1c,
0x05, 0x6f, 0x7f, 0xdf, 0x71, 0x1b, 0x81, 0xa2, 0x71, 0xce, 0xd5, 0x5e, 0x57, 0xbd, 0x98, 0xec,
0x38, 0xea, 0x21, 0x46, 0x6e, 0x38, 0x22, 0x1e, 0x3b, 0x8e, 0xb8, 0xe3, 0xba, 0xc4, 0x67, 0x1d,
0x10, 0xbf, 0x96, 0x37, 0x93, 0x55, 0xca, 0xe7, 0x7e, 0xde, 0x2d, 0x45, 0x55, 0x2a, 0x4e, 0x41,
0x45, 0xc8, 0x99, 0x07, 0x94, 0xf8, 0xae, 0xd3, 0x3a, 0x92, 0x59, 0xe5, 0x32, 0x52, 0x40, 0x24,
0x44, 0xc8, 0x42, 0x29, 0x1a, 0xba, 0x03, 0x93, 0x55, 0xea, 0x93, 0x20, 0x20, 0x7e, 0xa0, 0x10,
0xbe, 0x28, 0xa9, 0x6d, 0x0b, 0x22, 0x97, 0x86, 0xfb, 0x30, 0x74, 0x1b, 0x26, 0x0a, 0x7b, 0xa4,
0xfe, 0x8c, 0x51, 0x76, 0x38, 0x45, 0xba, 0xd5, 0xf5, 0xd0, 0xa3, 0xe1, 0x23, 0x10, 0x2b, 0x89,
0x82, 0xbd, 0x41, 0x0e, 0x79, 0xfb, 0xcd, 0x9b, 0xa6, 0x31, 0xf9, 0x7c, 0x89, 0x99, 0xf8, 0x53,
0x1b, 0x34, 0x3f, 0x26, 0x1a, 0x8e, 0x33, 0xd0, 0x23, 0x40, 0x31, 0x83, 0xe5, 0xf8, 0xbb, 0x44,
0x74, 0x4d, 0x63, 0xf9, 0xe5, 0x5e, 0x57, 0xbd, 0x32, 0x50, 0x47, 0x6f, 0x31, 0x9c, 0x86, 0x07,
0x90, 0xd1, 0x13, 0x38, 0xd7, 0xb7, 0x76, 0x76, 0x76, 0x9a, 0x07, 0xd8, 0x71, 0x77, 0x89, 0xf2,
@ -5105,89 +5116,89 @@ var fileDescriptorRpc = []byte{
0x68, 0x38, 0x49, 0x43, 0xef, 0x47, 0xb9, 0x11, 0xc5, 0x3d, 0x10, 0x1d, 0xe4, 0x98, 0x5c, 0x80,
0x43, 0x1d, 0xd1, 0x16, 0x04, 0x47, 0xa9, 0x09, 0x09, 0xe8, 0xf5, 0xe8, 0x08, 0x3d, 0xaa, 0x54,
0x45, 0xef, 0x38, 0x26, 0xf7, 0xf1, 0x21, 0xfb, 0xc3, 0x76, 0xff, 0x10, 0x3d, 0xaa, 0x54, 0xb5,
0xef, 0xcc, 0x89, 0x6e, 0x93, 0xdd, 0xe2, 0xfd, 0xb7, 0x46, 0xf9, 0x16, 0x77, 0x9d, 0x7d, 0xa2,
0xef, 0xcc, 0x89, 0x6e, 0x93, 0xbd, 0xe2, 0xfd, 0xaf, 0x46, 0xf9, 0x15, 0x77, 0x9d, 0x7d, 0xa2,
0x61, 0xee, 0x94, 0xeb, 0xc8, 0xc8, 0x29, 0xea, 0xc8, 0x2a, 0x8c, 0x3f, 0x31, 0x2c, 0x86, 0xce,
0x26, 0xcb, 0xc8, 0x47, 0x4e, 0x4b, 0x80, 0x43, 0x04, 0x2a, 0xc3, 0xc2, 0x3a, 0x71, 0x7c, 0xba,
0x4d, 0x1c, 0x5a, 0x74, 0x29, 0xf1, 0x9f, 0x3b, 0xad, 0xb0, 0x4a, 0x64, 0xe5, 0xdd, 0xdc, 0x8b,
0x40, 0x7a, 0x33, 0x44, 0x69, 0x78, 0x10, 0x13, 0x15, 0x61, 0xde, 0x6c, 0x91, 0x3a, 0x7b, 0xef,
0xb6, 0x9b, 0xfb, 0xc4, 0xeb, 0xd0, 0xcd, 0x80, 0x57, 0x8b, 0xac, 0xfc, 0x94, 0x93, 0x10, 0xa2,
0x53, 0x81, 0xd1, 0x70, 0x9a, 0xc5, 0x1e, 0x74, 0xab, 0x19, 0x50, 0xe2, 0x4a, 0xef, 0xcd, 0x8b,
0xc9, 0x9b, 0xa7, 0xc5, 0x11, 0x51, 0x8b, 0xdf, 0xf1, 0x5b, 0x81, 0x86, 0x53, 0x34, 0x84, 0x61,
0xc1, 0x68, 0x3c, 0x27, 0x3e, 0x6d, 0x06, 0x44, 0x52, 0x3b, 0xcf, 0xd5, 0xa4, 0x07, 0xc8, 0x89,
0x40, 0x71, 0xc1, 0x41, 0x64, 0xf4, 0x76, 0xd4, 0xea, 0x1a, 0x1d, 0xea, 0xd9, 0x56, 0x35, 0xbc,
0xf5, 0xa5, 0xdc, 0x38, 0x1d, 0xea, 0xe9, 0x94, 0x09, 0xc4, 0x91, 0xec, 0x1e, 0xec, 0xb7, 0xde,
0x46, 0x87, 0xee, 0x29, 0x0a, 0xe7, 0x0e, 0xe9, 0xd6, 0x9d, 0x4e, 0xa2, 0x5b, 0x67, 0x14, 0xf4,
0x2d, 0x59, 0x84, 0xbd, 0xf0, 0x2b, 0x17, 0x93, 0x2f, 0x9e, 0x9c, 0xbd, 0xd3, 0x64, 0x97, 0x7f,
0x02, 0xdb, 0x8f, 0x7e, 0x83, 0x1c, 0x72, 0xf2, 0xa5, 0xe4, 0xc9, 0x62, 0x4f, 0x8e, 0xe0, 0xc6,
0x91, 0xc8, 0x4a, 0xb5, 0xd2, 0x5c, 0xe0, 0x72, 0xb2, 0xd1, 0x97, 0xda, 0x34, 0xa1, 0x33, 0x88,
0xc6, 0xf6, 0x42, 0xa4, 0x8b, 0xf5, 0x70, 0x3c, 0x2b, 0x2a, 0xcf, 0x8a, 0xb4, 0x17, 0x61, 0x8e,
0x79, 0xef, 0x27, 0x12, 0x92, 0xa0, 0x20, 0x1b, 0xe6, 0x8f, 0x52, 0x74, 0xa4, 0xb3, 0xcc, 0x75,
0xa4, 0xdb, 0xa6, 0xe9, 0x36, 0x69, 0xd3, 0x69, 0xe9, 0xfd, 0x2c, 0x4b, 0x92, 0x69, 0x01, 0x56,
0x9a, 0xd9, 0xff, 0x51, 0x7e, 0xaf, 0xf1, 0x1c, 0x25, 0xfb, 0xe3, 0x7e, 0x92, 0x65, 0x30, 0x7b,
0x41, 0xe5, 0x9d, 0x7a, 0x3c, 0xcd, 0x1a, 0x97, 0x90, 0x0e, 0x9c, 0x68, 0xef, 0x53, 0xb9, 0x1e,
0xc0, 0x65, 0x1d, 0x6d, 0xd4, 0xfb, 0xf3, 0xfd, 0xbe, 0x3e, 0xfc, 0x55, 0x41, 0x6c, 0x77, 0x0c,
0x1e, 0x2d, 0x26, 0x4a, 0xf7, 0x4b, 0x43, 0x9b, 0x7d, 0x41, 0x96, 0xc1, 0x68, 0x33, 0xd1, 0x9c,
0x73, 0x85, 0x1b, 0x27, 0xf5, 0xe6, 0x42, 0x28, 0xcd, 0x64, 0x1d, 0x57, 0x51, 0xa4, 0xa2, 0xd0,
0xea, 0xf0, 0x0f, 0x6e, 0x37, 0x93, 0x67, 0x27, 0x4a, 0x55, 0x5d, 0x00, 0x34, 0x9c, 0x60, 0xb0,
0x27, 0x3a, 0x6e, 0xa9, 0x52, 0x87, 0x92, 0xb0, 0x11, 0x90, 0x36, 0x38, 0x21, 0xa4, 0x07, 0x0c,
0xa6, 0xe1, 0x41, 0xe4, 0xb4, 0xa6, 0xed, 0x3d, 0x23, 0xae, 0xf2, 0xca, 0x49, 0x9a, 0x94, 0xc1,
0x52, 0x9a, 0x9c, 0x8c, 0xee, 0xc3, 0x4c, 0xf4, 0x7a, 0x50, 0xf0, 0x3a, 0x2e, 0x55, 0xee, 0xf2,
0xbb, 0x50, 0x2e, 0x30, 0xd1, 0x7b, 0x48, 0x9d, 0xf9, 0x59, 0x81, 0x91, 0xf1, 0xc8, 0x82, 0xf9,
0x47, 0x1d, 0x8f, 0x3a, 0x79, 0xa7, 0xfe, 0x8c, 0xb8, 0x8d, 0xfc, 0x21, 0x25, 0x81, 0xf2, 0x3a,
0x17, 0x91, 0xda, 0xef, 0x0f, 0x19, 0x44, 0xdf, 0x16, 0x18, 0x7d, 0x9b, 0x81, 0x34, 0x9c, 0x26,
0xb2, 0x52, 0x52, 0xf1, 0xc9, 0x63, 0x8f, 0x12, 0xe5, 0x7e, 0xf2, 0xba, 0x6a, 0xfb, 0x44, 0x7f,
0xee, 0xb1, 0xdd, 0x89, 0x30, 0xf2, 0x8e, 0x78, 0xbe, 0xdf, 0x69, 0x53, 0xde, 0xd5, 0x28, 0xef,
0x27, 0x8f, 0xf1, 0xd1, 0x8e, 0x08, 0x94, 0xce, 0xfb, 0x20, 0x69, 0x47, 0x24, 0x32, 0xba, 0x09,
0xe3, 0x96, 0xb7, 0xbb, 0x4b, 0x7c, 0xe5, 0x21, 0xdf, 0xd8, 0xf9, 0x5e, 0x57, 0x9d, 0x09, 0x1f,
0x74, 0x6e, 0xd7, 0x70, 0x08, 0x40, 0x77, 0x61, 0xd2, 0xf2, 0x76, 0xcb, 0x1d, 0xda, 0xee, 0x50,
0x65, 0x3d, 0xf9, 0x8d, 0xac, 0xe5, 0xed, 0xea, 0x1e, 0xf7, 0x69, 0xb8, 0x8f, 0x63, 0x9d, 0xed,
0x1a, 0xd9, 0xee, 0xec, 0x2a, 0x45, 0x1e, 0xa5, 0xd4, 0xd9, 0x36, 0x98, 0x59, 0xc3, 0xc2, 0xbd,
0xfa, 0xd3, 0xac, 0xf4, 0x19, 0x19, 0xcd, 0xc1, 0x54, 0xa9, 0x6c, 0xd7, 0xaa, 0xb6, 0x81, 0x6d,
0x73, 0x2d, 0x77, 0x06, 0x9d, 0x07, 0x54, 0x2c, 0x15, 0xed, 0xa2, 0x61, 0x09, 0x63, 0xcd, 0xb4,
0x0b, 0x6b, 0x39, 0x40, 0x39, 0x98, 0xc6, 0xa6, 0x64, 0x99, 0x62, 0x96, 0x6a, 0xf1, 0xa1, 0x6d,
0xe2, 0x4d, 0x61, 0x39, 0x87, 0x96, 0xe1, 0x4a, 0xb5, 0xf8, 0xf0, 0xd1, 0x56, 0x51, 0x60, 0x6a,
0x46, 0x69, 0xad, 0x86, 0xcd, 0xcd, 0xf2, 0x63, 0xb3, 0xb6, 0x66, 0xd8, 0x46, 0x6e, 0x11, 0xcd,
0xc3, 0x4c, 0xd5, 0x78, 0x6c, 0xd6, 0xaa, 0x25, 0xa3, 0x52, 0x5d, 0x2f, 0xdb, 0xb9, 0x25, 0x74,
0x0d, 0xae, 0x32, 0xe1, 0x32, 0x36, 0x6b, 0xd1, 0x04, 0x0f, 0x70, 0x79, 0xb3, 0x0f, 0x51, 0xd1,
0x45, 0x58, 0x1c, 0xec, 0x5a, 0x66, 0xec, 0xd4, 0x94, 0x06, 0x2e, 0xac, 0x17, 0xa3, 0x39, 0x57,
0xd0, 0x6d, 0x78, 0xe5, 0xb8, 0xa8, 0xf8, 0xb8, 0x6a, 0x97, 0x2b, 0x35, 0xe3, 0xa1, 0x59, 0xb2,
0x73, 0x37, 0xd1, 0x55, 0xb8, 0x98, 0xb7, 0x8c, 0xc2, 0xc6, 0x7a, 0xd9, 0x32, 0x6b, 0x15, 0xd3,
0xc4, 0xb5, 0x4a, 0x19, 0xdb, 0x35, 0xfb, 0x69, 0x0d, 0x3f, 0xcd, 0x35, 0x90, 0x0a, 0x97, 0xb7,
0x4a, 0xc3, 0x01, 0x04, 0x5d, 0x82, 0xc5, 0x35, 0xd3, 0x32, 0x3e, 0x48, 0xb9, 0x5e, 0x64, 0xd0,
0x15, 0xb8, 0xb0, 0x55, 0x1a, 0xec, 0xfd, 0x2c, 0xb3, 0xfa, 0x37, 0x80, 0x51, 0xf6, 0xfe, 0x81,
0x14, 0x38, 0x17, 0xed, 0x6d, 0xb9, 0x64, 0xd6, 0x1e, 0x94, 0x2d, 0xab, 0xfc, 0xc4, 0xc4, 0xb9,
0x33, 0xe1, 0x6a, 0x52, 0x9e, 0xda, 0x56, 0xc9, 0x2e, 0x5a, 0x35, 0x1b, 0x17, 0x1f, 0x3e, 0x34,
0x71, 0x7f, 0x87, 0x32, 0x08, 0xc1, 0x6c, 0x44, 0xb0, 0x4c, 0x63, 0xcd, 0xc4, 0xb9, 0x11, 0x74,
0x13, 0x6e, 0xc4, 0x6d, 0xc3, 0xe8, 0x59, 0x99, 0xfe, 0x68, 0xab, 0x8c, 0xb7, 0x36, 0x73, 0xa3,
0xec, 0xd0, 0x44, 0x36, 0xc3, 0xb2, 0x72, 0x63, 0xe8, 0x3a, 0xa8, 0xd1, 0x16, 0x4b, 0xbb, 0x1b,
0x8b, 0x1c, 0xd0, 0x3d, 0x78, 0xe3, 0x04, 0xd0, 0xb0, 0x28, 0xa6, 0x58, 0x4a, 0x06, 0x70, 0xc3,
0xf5, 0x4c, 0xa3, 0xd7, 0xe1, 0xb5, 0xa1, 0xee, 0x61, 0xa2, 0x33, 0xe8, 0x01, 0xe4, 0x07, 0xb0,
0xc4, 0x2a, 0x43, 0x8b, 0x38, 0x97, 0xa1, 0x50, 0x44, 0x0d, 0x0f, 0x61, 0x01, 0x1b, 0x76, 0x61,
0x3d, 0x37, 0x8b, 0x56, 0xe1, 0xe5, 0xa1, 0xc7, 0x21, 0xbe, 0x09, 0x0d, 0x64, 0xc0, 0xbb, 0xa7,
0xc3, 0x0e, 0x0b, 0x9b, 0xa0, 0x97, 0x60, 0x79, 0xb8, 0x44, 0xb8, 0x25, 0x3b, 0xe8, 0x1d, 0x78,
0xf3, 0x24, 0xd4, 0xb0, 0x29, 0x76, 0x8f, 0x9f, 0x22, 0x3c, 0x06, 0x7b, 0xec, 0xd9, 0x1b, 0x8e,
0x62, 0x07, 0xa3, 0x89, 0xfe, 0x0f, 0xb4, 0x81, 0x87, 0x3d, 0xbe, 0x2d, 0x2f, 0x32, 0xe8, 0x16,
0xdc, 0xc4, 0x46, 0x69, 0xad, 0xbc, 0x59, 0x3b, 0x05, 0xfe, 0xb3, 0x0c, 0x7a, 0x0f, 0xde, 0x3e,
0x19, 0x38, 0x6c, 0x81, 0x9f, 0x67, 0x90, 0x09, 0xef, 0x9f, 0x7a, 0xbe, 0x61, 0x32, 0x5f, 0x64,
0xd0, 0x35, 0xb8, 0x32, 0x98, 0x1f, 0xe6, 0xe1, 0xcb, 0x0c, 0x5a, 0x81, 0xeb, 0xc7, 0xce, 0x14,
0x22, 0xbf, 0xca, 0xa0, 0xb7, 0xe0, 0xee, 0x71, 0x90, 0x61, 0x61, 0xfc, 0x3a, 0x83, 0xee, 0xc3,
0xbd, 0x53, 0xcc, 0x31, 0x4c, 0xe0, 0x37, 0xc7, 0xac, 0x23, 0x4c, 0xf6, 0xd7, 0x27, 0xaf, 0x23,
0x44, 0xfe, 0x36, 0x83, 0x96, 0xe0, 0xe2, 0x60, 0x08, 0x3b, 0x13, 0xbf, 0xcb, 0xa0, 0x1b, 0xb0,
0x7c, 0xac, 0x12, 0x83, 0xfd, 0x3e, 0x83, 0x14, 0x58, 0x28, 0x95, 0x6b, 0x0f, 0x8c, 0xa2, 0x55,
0x7b, 0x52, 0xb4, 0xd7, 0x6b, 0x55, 0x1b, 0x9b, 0xd5, 0x6a, 0xee, 0x17, 0x23, 0x2c, 0x94, 0x98,
0xa7, 0x54, 0x0e, 0x9d, 0xb5, 0x07, 0x65, 0x5c, 0xb3, 0x8a, 0x8f, 0xcd, 0x12, 0x43, 0x7e, 0x3a,
0x82, 0xe6, 0x00, 0x18, 0xac, 0x52, 0x2e, 0x96, 0xec, 0x6a, 0xee, 0x7b, 0x59, 0x34, 0x03, 0x13,
0xe6, 0x53, 0xdb, 0xc4, 0x25, 0xc3, 0xca, 0xfd, 0x3d, 0xbb, 0xba, 0x0f, 0x13, 0xd1, 0x27, 0x0e,
0x34, 0x0e, 0x23, 0x1b, 0x8f, 0x73, 0x67, 0xd0, 0x24, 0x8c, 0x59, 0xa6, 0x51, 0x35, 0x73, 0x19,
0xb4, 0x00, 0x73, 0xa6, 0x65, 0x16, 0xec, 0x62, 0xb9, 0x54, 0xc3, 0x5b, 0xa5, 0x12, 0xbf, 0x3c,
0x73, 0x30, 0xfd, 0x84, 0x3d, 0xf9, 0x91, 0x25, 0x8b, 0x16, 0x61, 0xde, 0x2a, 0x17, 0x36, 0x6a,
0xd8, 0x28, 0x98, 0x38, 0x32, 0x8f, 0x32, 0x20, 0x17, 0x8a, 0x2c, 0x63, 0xab, 0x79, 0x38, 0x1b,
0x7e, 0x1f, 0x41, 0x53, 0x70, 0x76, 0xe3, 0x71, 0x6d, 0xdd, 0xa8, 0xae, 0xe7, 0xce, 0xf4, 0x91,
0xe6, 0xd3, 0x4a, 0x11, 0xb3, 0x99, 0x01, 0xc6, 0x8f, 0x26, 0x9c, 0x86, 0x89, 0x52, 0xb9, 0x56,
0x58, 0x37, 0x0b, 0x1b, 0xb9, 0xec, 0x9d, 0xfb, 0x30, 0x69, 0xfb, 0x8e, 0x1b, 0xb4, 0x3d, 0x9f,
0xa2, 0x3b, 0xf2, 0x60, 0x36, 0xfc, 0x4a, 0x1b, 0xfe, 0x5e, 0x7c, 0x69, 0xee, 0x68, 0x2c, 0x7e,
0x4a, 0xd4, 0xce, 0xac, 0x64, 0x5e, 0xcb, 0xe4, 0xcf, 0xbd, 0xf8, 0xf3, 0xd2, 0x99, 0x17, 0xdf,
0x2c, 0x65, 0xbe, 0xfe, 0x66, 0x29, 0xf3, 0xa7, 0x6f, 0x96, 0x32, 0x3f, 0xf9, 0xcb, 0xd2, 0x99,
0xed, 0x71, 0xfe, 0x7b, 0xf3, 0xdd, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x2a, 0x7b, 0xc4, 0x2d,
0xb8, 0x1e, 0x00, 0x00,
0x40, 0x7a, 0x33, 0x44, 0x69, 0x78, 0x10, 0x13, 0x15, 0x61, 0xde, 0x6c, 0x91, 0x3a, 0xfb, 0xee,
0xb6, 0x9b, 0xfb, 0xc4, 0xeb, 0xd0, 0xcd, 0x80, 0x57, 0x8b, 0xac, 0x7c, 0xcb, 0x49, 0x08, 0xd1,
0xa9, 0xc0, 0x68, 0x38, 0xcd, 0x62, 0x17, 0xdd, 0x6a, 0x06, 0x94, 0xb8, 0xd2, 0x77, 0xf3, 0x62,
0xf2, 0xe5, 0x69, 0x71, 0x44, 0xd4, 0xe2, 0x77, 0xfc, 0x56, 0xa0, 0xe1, 0x14, 0x0d, 0x61, 0x58,
0x30, 0x1a, 0xcf, 0x89, 0x4f, 0x9b, 0x01, 0x91, 0xd4, 0xce, 0x73, 0x35, 0xe9, 0x02, 0x39, 0x11,
0x28, 0x2e, 0x38, 0x88, 0x8c, 0xde, 0x8e, 0x5a, 0x5d, 0xa3, 0x43, 0x3d, 0xdb, 0xaa, 0x86, 0xaf,
0xbe, 0x94, 0x1b, 0xa7, 0x43, 0x3d, 0x9d, 0x32, 0x81, 0x38, 0x92, 0xbd, 0x83, 0xfd, 0xd6, 0xdb,
0xe8, 0xd0, 0x3d, 0x45, 0xe1, 0xdc, 0x21, 0xdd, 0xba, 0xd3, 0x49, 0x74, 0xeb, 0x8c, 0x82, 0xbe,
0x25, 0x8b, 0xb0, 0x0f, 0x7e, 0xe5, 0x62, 0xf2, 0xc3, 0x93, 0xb3, 0x77, 0x9a, 0xec, 0xf1, 0x4f,
0x60, 0xfb, 0xd1, 0x6f, 0x90, 0x43, 0x4e, 0xbe, 0x94, 0x3c, 0x59, 0xec, 0xe6, 0x08, 0x6e, 0x1c,
0x89, 0xac, 0x54, 0x2b, 0xcd, 0x05, 0x2e, 0x27, 0x1b, 0x7d, 0xa9, 0x4d, 0x13, 0x3a, 0x83, 0x68,
0x6c, 0x2f, 0x44, 0xba, 0x58, 0x0f, 0xc7, 0xb3, 0xa2, 0xf2, 0xac, 0x48, 0x7b, 0x11, 0xe6, 0x98,
0xf7, 0x7e, 0x22, 0x21, 0x09, 0x0a, 0xb2, 0x61, 0xfe, 0x28, 0x45, 0x47, 0x3a, 0xcb, 0x5c, 0x47,
0x7a, 0x6d, 0x9a, 0x6e, 0x93, 0x36, 0x9d, 0x96, 0xde, 0xcf, 0xb2, 0x24, 0x99, 0x16, 0x60, 0xa5,
0x99, 0xfd, 0x3f, 0xca, 0xef, 0x35, 0x9e, 0xa3, 0x64, 0x7f, 0xdc, 0x4f, 0xb2, 0x0c, 0x66, 0x1f,
0xa8, 0xbc, 0x53, 0x8f, 0xa7, 0x59, 0xe3, 0x12, 0xd2, 0x81, 0x13, 0xed, 0x7d, 0x2a, 0xd7, 0x03,
0xb8, 0xac, 0xa3, 0x8d, 0x7a, 0x7f, 0xbe, 0xdf, 0xd7, 0x87, 0x7f, 0x2a, 0x88, 0xed, 0x8e, 0xc1,
0xa3, 0xc5, 0x44, 0xe9, 0x7e, 0x69, 0x68, 0xb3, 0x2f, 0xc8, 0x32, 0x18, 0x6d, 0x26, 0x9a, 0x73,
0xae, 0x70, 0xe3, 0xa4, 0xde, 0x5c, 0x08, 0xa5, 0x99, 0xac, 0xe3, 0x2a, 0x8a, 0x54, 0x14, 0x5a,
0x1d, 0xfe, 0x83, 0xdb, 0xcd, 0xe4, 0xd9, 0x89, 0x52, 0x55, 0x17, 0x00, 0x0d, 0x27, 0x18, 0xec,
0x46, 0xc7, 0x2d, 0x55, 0xea, 0x50, 0x12, 0x36, 0x02, 0xd2, 0x06, 0x27, 0x84, 0xf4, 0x80, 0xc1,
0x34, 0x3c, 0x88, 0x9c, 0xd6, 0xb4, 0xbd, 0x67, 0xc4, 0x55, 0x5e, 0x39, 0x49, 0x93, 0x32, 0x58,
0x4a, 0x93, 0x93, 0xd1, 0x7d, 0x98, 0x89, 0x3e, 0x0f, 0x0a, 0x5e, 0xc7, 0xa5, 0xca, 0x5d, 0xfe,
0x16, 0xca, 0x05, 0x26, 0xfa, 0x0e, 0xa9, 0x33, 0x3f, 0x2b, 0x30, 0x32, 0x1e, 0x59, 0x30, 0xff,
0xa8, 0xe3, 0x51, 0x27, 0xef, 0xd4, 0x9f, 0x11, 0xb7, 0x91, 0x3f, 0xa4, 0x24, 0x50, 0x5e, 0xe7,
0x22, 0x52, 0xfb, 0xfd, 0x21, 0x83, 0xe8, 0xdb, 0x02, 0xa3, 0x6f, 0x33, 0x90, 0x86, 0xd3, 0x44,
0x56, 0x4a, 0x2a, 0x3e, 0x79, 0xec, 0x51, 0xa2, 0xdc, 0x4f, 0x3e, 0x57, 0x6d, 0x9f, 0xe8, 0xcf,
0x3d, 0xb6, 0x3b, 0x11, 0x46, 0xde, 0x11, 0xcf, 0xf7, 0x3b, 0x6d, 0xca, 0xbb, 0x1a, 0xe5, 0xfd,
0xe4, 0x31, 0x3e, 0xda, 0x11, 0x81, 0xd2, 0x79, 0x1f, 0x24, 0xed, 0x88, 0x44, 0x46, 0x37, 0x61,
0xdc, 0xf2, 0x76, 0x77, 0x89, 0xaf, 0x3c, 0xe4, 0x1b, 0x3b, 0xdf, 0xeb, 0xaa, 0x33, 0xe1, 0x45,
0xe7, 0x76, 0x0d, 0x87, 0x00, 0x74, 0x17, 0x26, 0x2d, 0x6f, 0xb7, 0xdc, 0xa1, 0xed, 0x0e, 0x55,
0xd6, 0xf9, 0x75, 0x96, 0x6a, 0x6b, 0xcb, 0xdb, 0xd5, 0x3d, 0xee, 0xd3, 0x70, 0x1f, 0xc7, 0x3a,
0xdb, 0x35, 0xb2, 0xdd, 0xd9, 0x55, 0x8a, 0x3c, 0x4a, 0xa9, 0xb3, 0x6d, 0x30, 0xb3, 0x86, 0x85,
0x7b, 0xf5, 0xa7, 0x59, 0xe9, 0x67, 0x64, 0x34, 0x07, 0x53, 0xa5, 0xb2, 0x5d, 0xab, 0xda, 0x06,
0xb6, 0xcd, 0xb5, 0xdc, 0x19, 0x74, 0x1e, 0x50, 0xb1, 0x54, 0xb4, 0x8b, 0x86, 0x25, 0x8c, 0x35,
0xd3, 0x2e, 0xac, 0xe5, 0x00, 0xe5, 0x60, 0x1a, 0x9b, 0x92, 0x65, 0x8a, 0x59, 0xaa, 0xc5, 0x87,
0xb6, 0x89, 0x37, 0x85, 0xe5, 0x1c, 0x5a, 0x86, 0x2b, 0xd5, 0xe2, 0xc3, 0x47, 0x5b, 0x45, 0x81,
0xa9, 0x19, 0xa5, 0xb5, 0x1a, 0x36, 0x37, 0xcb, 0x8f, 0xcd, 0xda, 0x9a, 0x61, 0x1b, 0xb9, 0x45,
0x34, 0x0f, 0x33, 0x55, 0xe3, 0xb1, 0x59, 0xab, 0x96, 0x8c, 0x4a, 0x75, 0xbd, 0x6c, 0xe7, 0x96,
0xd0, 0x35, 0xb8, 0xca, 0x84, 0xcb, 0xd8, 0xac, 0x45, 0x13, 0x3c, 0xc0, 0xe5, 0xcd, 0x3e, 0x44,
0x45, 0x17, 0x61, 0x71, 0xb0, 0x6b, 0x99, 0xb1, 0x53, 0x53, 0x1a, 0xb8, 0xb0, 0x5e, 0x8c, 0xe6,
0x5c, 0x41, 0xb7, 0xe1, 0x95, 0xe3, 0xa2, 0xe2, 0xe3, 0xaa, 0x5d, 0xae, 0xd4, 0x8c, 0x87, 0x66,
0xc9, 0xce, 0xdd, 0x44, 0x57, 0xe1, 0x62, 0xde, 0x32, 0x0a, 0x1b, 0xeb, 0x65, 0xcb, 0xac, 0x55,
0x4c, 0x13, 0xd7, 0x2a, 0x65, 0x6c, 0xd7, 0xec, 0xa7, 0x35, 0xfc, 0x34, 0xd7, 0x40, 0x2a, 0x5c,
0xde, 0x2a, 0x0d, 0x07, 0x10, 0x74, 0x09, 0x16, 0xd7, 0x4c, 0xcb, 0xf8, 0x20, 0xe5, 0x7a, 0x91,
0x41, 0x57, 0xe0, 0xc2, 0x56, 0x69, 0xb0, 0xf7, 0xb3, 0xcc, 0xea, 0xdf, 0x00, 0x46, 0xd9, 0xf7,
0x07, 0x52, 0xe0, 0x5c, 0xb4, 0xb7, 0xe5, 0x92, 0x59, 0x7b, 0x50, 0xb6, 0xac, 0xf2, 0x13, 0x13,
0xe7, 0xce, 0x84, 0xab, 0x49, 0x79, 0x6a, 0x5b, 0x25, 0xbb, 0x68, 0xd5, 0x6c, 0x5c, 0x7c, 0xf8,
0xd0, 0xc4, 0xfd, 0x1d, 0xca, 0x20, 0x04, 0xb3, 0x11, 0xc1, 0x32, 0x8d, 0x35, 0x13, 0xe7, 0x46,
0xd0, 0x4d, 0xb8, 0x11, 0xb7, 0x0d, 0xa3, 0x67, 0x65, 0xfa, 0xa3, 0xad, 0x32, 0xde, 0xda, 0xcc,
0x8d, 0xb2, 0x43, 0x13, 0xd9, 0x0c, 0xcb, 0xca, 0x8d, 0xa1, 0xeb, 0xa0, 0x46, 0x5b, 0x2c, 0xed,
0x6e, 0x2c, 0x72, 0x40, 0xf7, 0xe0, 0x8d, 0x13, 0x40, 0xc3, 0xa2, 0x98, 0x62, 0x29, 0x19, 0xc0,
0x0d, 0xd7, 0x33, 0x8d, 0x5e, 0x87, 0xd7, 0x86, 0xba, 0x87, 0x89, 0xce, 0xa0, 0x07, 0x90, 0x1f,
0xc0, 0x12, 0xab, 0x0c, 0x2d, 0xe2, 0x5c, 0x86, 0x42, 0x11, 0x35, 0x3c, 0x84, 0x05, 0x6c, 0xd8,
0x85, 0xf5, 0xdc, 0x2c, 0x5a, 0x85, 0x97, 0x87, 0x1e, 0x87, 0xf8, 0x26, 0x34, 0x90, 0x01, 0xef,
0x9e, 0x0e, 0x3b, 0x2c, 0x6c, 0x82, 0x5e, 0x82, 0xe5, 0xe1, 0x12, 0xe1, 0x96, 0xec, 0xa0, 0x77,
0xe0, 0xcd, 0x93, 0x50, 0xc3, 0xa6, 0xd8, 0x3d, 0x7e, 0x8a, 0xf0, 0x18, 0xec, 0xb1, 0xbb, 0x37,
0x1c, 0xc5, 0x0e, 0x46, 0x13, 0xfd, 0x1f, 0x68, 0x03, 0x0f, 0x7b, 0x7c, 0x5b, 0x5e, 0x64, 0xd0,
0x2d, 0xb8, 0x89, 0x8d, 0xd2, 0x5a, 0x79, 0xb3, 0x76, 0x0a, 0xfc, 0x67, 0x19, 0xf4, 0x1e, 0xbc,
0x7d, 0x32, 0x70, 0xd8, 0x02, 0x3f, 0xcf, 0x20, 0x13, 0xde, 0x3f, 0xf5, 0x7c, 0xc3, 0x64, 0xbe,
0xc8, 0xa0, 0x6b, 0x70, 0x65, 0x30, 0x3f, 0xcc, 0xc3, 0x97, 0x19, 0xb4, 0x02, 0xd7, 0x8f, 0x9d,
0x29, 0x44, 0x7e, 0x95, 0x41, 0x6f, 0xc1, 0xdd, 0xe3, 0x20, 0xc3, 0xc2, 0xf8, 0x75, 0x06, 0xdd,
0x87, 0x7b, 0xa7, 0x98, 0x63, 0x98, 0xc0, 0x6f, 0x8e, 0x59, 0x47, 0x98, 0xec, 0xaf, 0x4f, 0x5e,
0x47, 0x88, 0xfc, 0x6d, 0x06, 0x2d, 0xc1, 0xc5, 0xc1, 0x10, 0x76, 0x26, 0x7e, 0x97, 0x41, 0x37,
0x60, 0xf9, 0x58, 0x25, 0x06, 0xfb, 0x7d, 0x06, 0x29, 0xb0, 0x50, 0x2a, 0xd7, 0x1e, 0x18, 0x45,
0xab, 0xf6, 0xa4, 0x68, 0xaf, 0xd7, 0xaa, 0x36, 0x36, 0xab, 0xd5, 0xdc, 0x2f, 0x46, 0x58, 0x28,
0x31, 0x4f, 0xa9, 0x1c, 0x3a, 0x6b, 0x0f, 0xca, 0xb8, 0x66, 0x15, 0x1f, 0x9b, 0x25, 0x86, 0xfc,
0x74, 0x04, 0xcd, 0x01, 0x30, 0x58, 0xa5, 0x5c, 0x2c, 0xd9, 0xd5, 0xdc, 0xf7, 0xb2, 0x68, 0x06,
0x26, 0xcc, 0xa7, 0xb6, 0x89, 0x4b, 0x86, 0x95, 0xfb, 0x7b, 0x76, 0x75, 0x1f, 0x26, 0xa2, 0x9f,
0x38, 0xd0, 0x38, 0x8c, 0x6c, 0x3c, 0xce, 0x9d, 0x41, 0x93, 0x30, 0x66, 0x99, 0x46, 0xd5, 0xcc,
0x65, 0xd0, 0x02, 0xcc, 0x99, 0x96, 0x59, 0xb0, 0x8b, 0xe5, 0x52, 0x0d, 0x6f, 0x95, 0x4a, 0xfc,
0xf1, 0xcc, 0xc1, 0xf4, 0x13, 0x76, 0xf3, 0x23, 0x4b, 0x16, 0x2d, 0xc2, 0xbc, 0x55, 0x2e, 0x6c,
0xd4, 0xb0, 0x51, 0x30, 0x71, 0x64, 0x1e, 0x65, 0x40, 0x2e, 0x14, 0x59, 0xc6, 0x56, 0xf3, 0x70,
0x36, 0xfc, 0x7d, 0x04, 0x4d, 0xc1, 0xd9, 0x8d, 0xc7, 0xb5, 0x75, 0xa3, 0xba, 0x9e, 0x3b, 0xd3,
0x47, 0x9a, 0x4f, 0x2b, 0x45, 0xcc, 0x66, 0x06, 0x18, 0x3f, 0x9a, 0x70, 0x1a, 0x26, 0x4a, 0xe5,
0x5a, 0x61, 0xdd, 0x2c, 0x6c, 0xe4, 0xb2, 0x77, 0xee, 0xc3, 0xa4, 0xed, 0x3b, 0x6e, 0xd0, 0xf6,
0x7c, 0x8a, 0xee, 0xc8, 0x83, 0xd9, 0xf0, 0x57, 0xda, 0xf0, 0xef, 0xc5, 0x97, 0xe6, 0x8e, 0xc6,
0xe2, 0x4f, 0x89, 0xda, 0x99, 0x95, 0xcc, 0x6b, 0x99, 0xfc, 0xb9, 0x17, 0x7f, 0x5e, 0x3a, 0xf3,
0xe2, 0x9b, 0xa5, 0xcc, 0xd7, 0xdf, 0x2c, 0x65, 0xfe, 0xf4, 0xcd, 0x52, 0xe6, 0x27, 0x7f, 0x59,
0x3a, 0xb3, 0x3d, 0xce, 0xff, 0xde, 0x7c, 0xf7, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xdc,
0x19, 0xd8, 0xb8, 0x1e, 0x00, 0x00,
}

View File

@ -204,7 +204,7 @@ message Etcd {
string Logger = 71 [(gogoproto.moretags) = "yaml:\"logger\""];
// LogOutput is the log file to store current etcd server logs.
string LogOutput = 72 [(gogoproto.moretags) = "yaml:\"log-output\""];
repeated string LogOutput = 72 [(gogoproto.moretags) = "yaml:\"log-output\""];
bool Debug = 73 [(gogoproto.moretags) = "yaml:\"debug\""];
}

View File

@ -311,11 +311,17 @@ func read(lg *zap.Logger, fpath string) (*Cluster, error) {
clus.Members[i].ClientCertData = string(data)
}
if mem.Etcd.LogOutput == "" {
if len(mem.Etcd.LogOutput) == 0 {
return nil, fmt.Errorf("mem.Etcd.LogOutput cannot be empty")
}
if !strings.HasPrefix(mem.Etcd.LogOutput, mem.BaseDir) {
return nil, fmt.Errorf("LogOutput %q must be prefixed with BaseDir %q", mem.Etcd.LogOutput, mem.BaseDir)
for _, v := range mem.Etcd.LogOutput {
switch v {
case "stderr", "stdout", "/dev/null", "default":
default:
if !strings.HasPrefix(v, mem.BaseDir) {
return nil, fmt.Errorf("LogOutput %q must be prefixed with BaseDir %q", v, mem.BaseDir)
}
}
}
}
}

View File

@ -63,7 +63,7 @@ func Test_read(t *testing.T) {
PreVote: true,
InitialCorruptCheck: true,
Logger: "zap",
LogOutput: "/tmp/etcd-functional-1/etcd.log",
LogOutput: []string{"/tmp/etcd-functional-1/etcd.log"},
Debug: true,
},
ClientCertData: "",
@ -116,7 +116,7 @@ func Test_read(t *testing.T) {
PreVote: true,
InitialCorruptCheck: true,
Logger: "zap",
LogOutput: "/tmp/etcd-functional-2/etcd.log",
LogOutput: []string{"/tmp/etcd-functional-2/etcd.log"},
Debug: true,
},
ClientCertData: "",
@ -169,7 +169,7 @@ func Test_read(t *testing.T) {
PreVote: true,
InitialCorruptCheck: true,
Logger: "zap",
LogOutput: "/tmp/etcd-functional-3/etcd.log",
LogOutput: []string{"/tmp/etcd-functional-3/etcd.log"},
Debug: true,
},
ClientCertData: "",

View File

@ -53,7 +53,7 @@ func TestEmbedEtcd(t *testing.T) {
for i := range tests {
tests[i].cfg = *embed.NewConfig()
tests[i].cfg.Logger = "zap"
tests[i].cfg.LogOutput = "/dev/null"
tests[i].cfg.LogOutput = []string{"/dev/null"}
tests[i].cfg.Debug = false
}
@ -180,7 +180,7 @@ func newEmbedURLs(secure bool, n int) (urls []url.URL) {
func setupEmbedCfg(cfg *embed.Config, curls []url.URL, purls []url.URL) {
cfg.Logger = "zap"
cfg.LogOutput = "/dev/null"
cfg.LogOutput = []string{"/dev/null"}
cfg.Debug = false
cfg.ClusterState = "new"

View File

@ -64,7 +64,7 @@ func TestSnapshotV3RestoreMultiMemberAdd(t *testing.T) {
cfg := embed.NewConfig()
cfg.Logger = "zap"
cfg.LogOutput = "/dev/null"
cfg.LogOutput = []string{"/dev/null"}
cfg.Debug = false
cfg.Name = "3"
cfg.InitialClusterToken = testClusterTkn

View File

@ -44,7 +44,7 @@ func TestSnapshotV3RestoreSingle(t *testing.T) {
cfg := embed.NewConfig()
cfg.Logger = "zap"
cfg.LogOutput = "/dev/null"
cfg.LogOutput = []string{"/dev/null"}
cfg.Debug = false
cfg.Name = "s1"
cfg.InitialClusterToken = testClusterTkn
@ -153,7 +153,7 @@ func createSnapshotFile(t *testing.T, kvs []kv) string {
cfg := embed.NewConfig()
cfg.Logger = "zap"
cfg.LogOutput = "/dev/null"
cfg.LogOutput = []string{"/dev/null"}
cfg.Debug = false
cfg.Name = "default"
cfg.ClusterState = "new"
@ -220,7 +220,7 @@ func restoreCluster(t *testing.T, clusterN int, dbPath string) (
for i := 0; i < clusterN; i++ {
cfg := embed.NewConfig()
cfg.Logger = "zap"
cfg.LogOutput = "/dev/null"
cfg.LogOutput = []string{"/dev/null"}
cfg.Debug = false
cfg.Name = fmt.Sprintf("%d", i)
cfg.InitialClusterToken = testClusterTkn